14. oktober 2003 - 19:02Der er
36 kommentarer og 2 løsninger
Kombinations udregner
Hej Eksperter! Jeg vil godt lave et program der viser alle de mulige kombinationer. Altså, man skal kunne bruge hele alfabetet + mellemrum (Altså: "abcdefghijklmnopqrstuvwxyzæøå " alle kombinationer skal være på 5 cifre. Programmet skal så skrive: (5 mellemrum) a(4 mellemrum + a) aa(3 mellemrum + a) osv indtil det når til ååååå
Der findes nok mange forskellige måder at lave dette program på, og den der laver det program der kører hurtigst får pointene.
Da det jo fremgår af opgaven at du tillader at samme bogstav bruges flere gange er det så ikke bare 5 for løkker der alle kører fra 1 til 26, første for løkke giver første bogstav, anden andet etc. ?
Kan jeg måske få lidt kode? Det du mener er altså: For i = 1 to 26 If i = 1 the Text1.Text = Text1.Text & "a" If i = 2 then Text1.Text = Text1.Text & "b" Osv?
Det vil tage MEGA lang tid at skrive al den kode, og så er det nok heller ikke særligt stabilt... Men prøver lige...
For det første skal der vel også være mulighed for mellemrum EFTER en karakter - eller må der kun være mellemrum foran?
Uanset hvad - prøv at tænk dig om!
Der er 29 muligheder for hvert "ciffer"...
29*29*29*29*29 = 29^5 = 20511149 kombinationer.
Hvis du skriver dem til fx. en fil, en kombination for hver linie, får du altså en fil med over 20 millioner linier!!! Lidt færre hvis mellemrummet kun må stå foran, som du har sagt...
Men ellers er det nemt nok at kode, det fylder ret få kodelinier
I øvrigt, therichman, så har du slet ikke tid til det her. Du LOVEDE at lave et program der kunne udregne en vejrudsigt - er du ikke snart færdig med det?
Dim i, j, k As Integer Dim letter letter = Array("a", "b", "c" ",d", "e") Dim s As String For i = 0 To 4 For j = 0 To 4 For k = 0 To 4 s = letter(i) & " " & letter(j) & " " & letter(k) ' gør noget med s Next k Next j Next i
Dim i, j, k As Integer Dim letter letter = Array(" ","a", "b", "c" ",d", "e") Dim s As String For i = 0 To 5 For j = 0 To 5 For k = 0 To 5 s = letter(i) & letter(j) & letter(k) ' gør noget med s Next k Next j Next i
så er mellemrum et tegn ligesom du ville have det.
Dim i, j, k As Integer Dim letter letter = Array(" ","a", "b", "c", "d", "e") Dim s As String For i = 0 To 5 For j = 0 To 5 For k = 0 To 5 s = letter(i) & letter(j) & letter(k) ' gør noget med s Next k Next j Next i
Jeg har tilladt mig at udbygge koden, så den laver alle godt 2 mill kombinationer. Således er følgende det færdige program:
Private Sub Form_Load() Dim i, j, k, l, m As Byte Dim Letter() Letter = Array(" ", "a", "b", "c", _ "d", "e", "f", "g", "h", "i", "j", _ "k", "l", "m", "n", "o", "p", "q", _ "r", "s", "t", "u", "v", "w", "x", _ "y", "z", "æ", "ø", "å")
Open "D:\kombinationer.txt" For Output As #1 For i = 0 To 28 For j = 0 To 28 For k = 0 To 28 For l = 0 To 28 For m = 0 To 28 Print #1, Letter(i) & Letter(j) & Letter(k) & Letter(l) & Letter(m) Next m Next l Next k Next j Next i Close #1 End Sub
Jeg har ikke ville køre den, da min gamle slæde af en PC sikkert går ned. Er der nogen der vil forsøge - er nysgerrig for om det går godt, hvor lang tid det tager og hvor stor filen bliver :o)
PS: Hverken Notepad, UltraEdit eller Textpad kan åbne filen (på min PC) MS Word kan dog godt - med courier new og skriftstørrelse 10 kan der være 59 linier pr side (sikkert mere hvis man piller ved linieafstand, margin osv)
Dvs at dokumentet fylder 30^5/59 = 411865 sider. Printer du det ud på en almindelig printer med almindeligt printerpapir, der vejer 80g/m2, vejer de udskrivne sider 411865 / (1/(0,297m*0,21m) * 80 g/m2 = 2055042 g = 2055 kg.
Altså så har du udregnet så mange kombinationer, at du skal have OVER TO TONS PAPIR til at skrive det ud...
Wups - skrivefejl. Ikke 2,43 mill, men 24,3 mill :o)
Nå - men ovenstående regnestykke er nu rigtigt nok, der regner jeg med 24,3 millioner - det kræver to tons og 55 kg papir!!!!!!!!
24,3 mill - der er fanme mange kombinationer, therichman. Hvad i alverden skal du dog ruge det til - og skulle du ikke hellere lave det vejrprogram du lovede ;o)
Mht dimensioneringen af variabler, har jeg testet martins kode i VBA (uden printsætningen) på en ældre 350mhz maskine.
1: 6,8 sek. Dim i, j, k, l, m As Byte 2: 6,0 sek. Dim i As Byte, j As Byte, k As Byte, l As Byte, m As Byte 3: 4,8 sek. Dim i As Long, j As Long, k As Long, l As Long, m As Long
Er der en forskel her på VBA og VB ? (i VBA vil sætning 1 dimensionere i, j, k og l som varianter og kun m som byte)
Doh - der er bak igen med sine Long-variabler, som han allerede HAR forsøgt at lære mig at jeg skal bruge i en anden tråd. Jeg rettede dog i dette eksempel fra Integer (arne_v's eksempel) til Byte - det er vel trods alt en forbedring, selvom jeg burde have rettet til Long ;o)
Om der er forskel på VBA og VB mht. hastighed. Aner det ikke - er der forskel, vil jeg æde min hat på at VB er hurtigst. Nogen der gider teste?
Dette spørgsmål er efterhånden ved at komme ret meget af sporet. Måske skulle therichman få det lukket (men huske at forklare hvad han skal med 24 millioner forskellige kombinationer/godt to tons kombinationer (he he) ;o)
*lol* Det var nu ikke meningen at du skulle føle dig ramt, martin. Ville bare gøre opmærksom på hastighedsforskellen, der ser ud til at være på omkring 25%, hvis en variabel skal konverteres før brug. Therich ville have den til at køre hurtigt.
Afsporer lige spørgsmålet totalt ;) Nej seriøst...hvordan kan man egentlig måle den slags? Altså hvor lang tid noget kode tager? Skal man sidde med et stopur og være lynendes hurtig? ;)
I parentes bemærket er de 25% forskel jo ikke 25% forskel på opgavens udførsel men 25% forskel på løkken - print. Med print er forskellen formentligt mindre end 5%.
Så er pointene fordelt. Grunden til at jeg ville have programmet, var en artikel i "Illustreret Videnskab" (et af de gamle) hvor der var nogen sjove udregninger med tal. Han lavede også nogen udregninger over hvor mange tons papir der skulle udskrives osv. Han brugte dog ikke 5 cifre men 19(!) Men tak for svarene!
Du kunne bare have spurgt hvad 30*30*30*30*30 giver, så havde vi sluppet for at lave løkker og arrays og alverdens ting, der ikke skal bruges til noget...
Husk nu vejrprogrammet - man skal holde hvad man lover!!!
He he - så ved du da hvad du skal få de lange vinteraftener til at gå med - hvis du skal pløje dig igennem to tons papir med kombinationer på ;o)
Husk nu vejrprogrammet :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.