Avatar billede therichman Nybegynder
14. oktober 2003 - 19:02 Der 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.
Avatar billede arne_v Ekspert
14. oktober 2003 - 19:09 #1
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. ?
Avatar billede therichman Nybegynder
14. oktober 2003 - 19:15 #2
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...
Avatar billede arne_v Ekspert
14. oktober 2003 - 19:18 #3
Nej jeg vil bruge for løkke indexet til at pille et nbogstav ud af strengen med.
Avatar billede martin_moth Mester
14. oktober 2003 - 19:21 #4
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
Avatar billede martin_moth Mester
14. oktober 2003 - 19:28 #5
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?
Avatar billede arne_v Ekspert
14. oktober 2003 - 19:31 #6
Her er et eksempel med 3 bogstaver ud af 5:

  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

Du kan nemt rette det til 5 ud af 26 !
Avatar billede arne_v Ekspert
14. oktober 2003 - 19:32 #7
Men som Martin har forsøgt at forklare, så giver det mange
kombinationer !
Avatar billede arne_v Ekspert
14. oktober 2003 - 19:33 #8
Hov mellemrum var vist anderledes:

  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.
Avatar billede stry Nybegynder
14. oktober 2003 - 19:38 #9
",d" skal lige rettes til ,"d" for at koden virker :-)
Avatar billede arne_v Ekspert
14. oktober 2003 - 19:39 #10
Jep.

Sorry.

  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
Avatar billede martin_moth Mester
14. oktober 2003 - 19:53 #11
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)
Avatar billede arne_v Ekspert
14. oktober 2003 - 19:59 #12
Jeg tror du skal erstatte 28 med 29.

29 bogstaver + mellemrum = 30
Avatar billede stry Nybegynder
14. oktober 2003 - 20:03 #13
1 min og 6 sek.
136 MB
Avatar billede martin_moth Mester
14. oktober 2003 - 20:04 #14
Doh - for lang tid siden jeg har gået i skole, tænkte at der kun var 28 bogstaver i alfabetet. Men så er der 30^5 = 2,43 mill. muligheder...

Hvad i alverden skal det bruges til, theRichMan?
Avatar billede arne_v Ekspert
14. oktober 2003 - 20:08 #15
knap 50 sekunder
170 MB (men jeg kører også 30^5 ikke 29^5)
Avatar billede arne_v Ekspert
14. oktober 2003 - 20:09 #16
30^5*(5+2) = 170 MB

:-)
Avatar billede martin_moth Mester
14. oktober 2003 - 20:10 #17
He he - du har en lidt hurtigere HD eller CPU eller hvad det er der er flaskehals, stry - jeg bruger længere tid.

Nå - spørgsmålet er vel besvaret, therichman. Giv pointene til arne_v, det var ham der gav koden :o)

Men svar lige hvad du skal bruge over 2 millioner forskellige kombinationer af bogstaver og mellemrum til????
Avatar billede martin_moth Mester
14. oktober 2003 - 20:33 #18
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...
Avatar billede stry Nybegynder
14. oktober 2003 - 20:44 #19
30^5 = 24,3 mill. muligheder...  :-D
Avatar billede martin_moth Mester
14. oktober 2003 - 20:55 #20
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)
Avatar billede stry Nybegynder
14. oktober 2003 - 21:43 #21
Jeg har lige tjekket min kombinationsfil og den indeholder "kun" 5.592.064 linjer og dermed kun ca. 1/4 af kombinationerne.
Den fylder 162 MB.

Er der en limit på antal linjer i en .txt-fil, for det kan ikke være de 162 MB da jeg har haft nogle på både 3- og 400 MB?
Avatar billede arne_v Ekspert
14. oktober 2003 - 21:47 #22
Jeg tror at du har checket forkert !

162 MB / 5.6 mio linier = ca. 30 bytes per linie

Og der er kun 5 tegn + CR LF = ialt 7 bytes per linie.
Avatar billede stry Nybegynder
14. oktober 2003 - 21:52 #23
Jeg er temmelig sikker på at jeg har tjekket rigtigt :-)
...og den sidste kombination i filen er "fæclc"
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:00 #24
sidste skal da være ååååå
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:06 #25
Jeg tror at din editor er gået kold efter 5.6 mio. linier.
Avatar billede stry Nybegynder
14. oktober 2003 - 22:09 #26
Ja, det tror jeg du har ret i.
Avatar billede themepark Nybegynder
15. oktober 2003 - 04:44 #27
Hmm...nogle interessante statistikker, der kommer frem ;)
Avatar billede bak Forsker
15. oktober 2003 - 10:41 #28
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)
Avatar billede martin_moth Mester
15. oktober 2003 - 13:39 #29
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)
Avatar billede bak Forsker
15. oktober 2003 - 14:21 #30
*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.
Avatar billede themepark Nybegynder
16. oktober 2003 - 07:26 #31
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? ;)
Avatar billede martin_moth Mester
16. oktober 2003 - 07:41 #32
Gem tiden i en variabel når du starter
Gem tiden i en anden variabel når koden slutter
Find forskellen mellem de to tidspunkter...

Skal vi ikke snart have therichman på banen?
Avatar billede themepark Nybegynder
16. oktober 2003 - 08:01 #33
Ja selvfølgelig...det lød bare til at I gjorde det meget mere avanceret :)
Avatar billede arne_v Ekspert
16. oktober 2003 - 08:02 #34
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%.
Avatar billede therichman Nybegynder
16. oktober 2003 - 15:14 #35
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!
Avatar billede martin_moth Mester
16. oktober 2003 - 15:25 #36
Hvad har det med VB at gøre?

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!!!
Avatar billede therichman Nybegynder
16. oktober 2003 - 15:26 #37
Nej! For jeg ville jo også godt kunne se resultaterne!
Avatar billede martin_moth Mester
16. oktober 2003 - 15:38 #38
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)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester