15. november 2009 - 13:52Der er
13 kommentarer og 1 løsning
Generere alle talkombinationer
Hej alle sammen
Jeg sidder og prøver at skrive et script jeg ikke rigtigt kan få til at virke efter hensigten - så har skrottet alt min kode, da jeg er ret sikker på jeg gik helt forkert til værks.
Det jeg gerne vil opnå er at ud fra en given streng, eks. "ab" vil jeg gerne generere alle mulige kombinationer af de tegn der er i strengen, og deres orden er _ikke_ ligegyldig. Altså er "ab" og "ba" to forskellige ord.
Jeg skal altså ende ud med: aa ab bb ba
osv. for større strenge.
Den skal meget gerne også generere strengen i alle mulige længder såfremt (længde>=2 && længde<=strlen("abc")).
Altså hvis strengen er "abcd" så skal den både generere "ab", "abc" og "abcd" i alle mulige kombinationer.
Og I behøver ikke påpege hvor mange kombinationer der kommer ud af det her når jeg kommer op i en større strenglængde - jeg har taget de overvejelser.
Jeg har kigget lidt på det, og fundet frem til en lille løsning. Dog ved jeg ikke rigtig hvordan den skal kunne kompinere strengen i flere forskellige formater.
<?php /* START */
$str = "ab"; $strSize = strlen($str);
if ($strSize >= 2 AND $strSize <= 3) { // FOUND CHARTERS for($i=0; $i <= $strSize-1; $i++) { if ($i == 0) $numb[$i] = substr($str, $i, $i+1); else $numb[$i] = substr($str, $i, $i); } // PRINT CHARTERS if ((array)$numb) { for($n=0; $n <= count($numb)-1; $n++) echo "<span name=\"".$n."\">".$numb[$n]."</span><br>\n"; }
Jeg har afprøvet din kode, og den gør ikke helt det jeg gerne vil have den til. Jeg prøvede at give den "abcdefg" som input, og fjernede dit tjek
if ($strSize >= 2 AND $strSize <= 3)
og resultatet bliver følgende: a b cd def efg fg g
Og det jeg gerne vil have, er alle kombinationer med de givne bogstaver. For strenge der er 2 karakteret lange For strenge der er 3 karakterer lange ... For strenge der er 10 karakterer lange.
Og tusinde tak for din kode!! Den ser ud til at virke ganske fortrineligt, dog er der en ting jeg er i tvivl om: Med min egen "hovedregning" så skulle der være lige omkring 6,5 mio. muligheder: 10+ (10*9)+ (10*9*8)+ (10*9*8*7)+ (10*9*8*7*6)+ (10*9*8*7*6*5)+ (10*9*8*7*6*5*4)+ (10*9*8*7*6*5*4*3)+ (10*9*7*6*5*4*3*2)+ (10*9*8*7*6*5*4*3*2*1) = ~ 6,5 mio.
Men dog giver dit resultat kun 4 mio. rækker i min database.
Er der nogen der kan sige om det er mig der regner forkert eller om det er koden der ikke gør det samme som mine udregninger?
Det ser umiddelbart ud for mig at de første kører alle tal igennem og generere alle kombinationer for alle 10 tegn. Derefter fjerner den det sidste tal i strengen og genrerer derefter alle kombinationer med 9 tegn - dog mangler den her tallet 9, og næste gang mangler den tallene 9+8 osv osv.
Ret mig gerne hvis det er mig der er gal på den, eller hvis I har et andet løsningsforslag.
Med to bogstaver ud af to angiver du 4 kombinationer i dit første indlæg ("aa", "ab", "ba" og "bb"), men din egen udregning i #4 giver kun 2*1 = 2 kombinationer.
Det rejser det grundlæggende spørgsmål, om det samme bogstav må være med flere gange?
Hvis det må, er det ikke en permutation (som _repox er inde på). Jeg vil gerne have det afklaret, før jeg evt giver et bud på koden.
Ja jeg kom selv i tanke om det samme issue tidligere idag. Og svaret er, ja det samme tegn må gerne optræde flere gange i samme kombination - hvilket giver en helvedes masse flere kombinationer.
Jeg vil altså gerne. - Generere alle kombinationer på 2 tegn med tallene 0-9 - Generere alle kombinationer på 3 tegn med tallene 0-9 osv osv.
Hvor tallenes orden _ikke_ er ligegyldig, og samme tal gerne må optræde flere gange i samme kombination.
Dit script ser ud til at virke helt fantastisk, dog har jeg et lille problem. Jeg forsøger at sætte kombinationerne ind i en database, med tilsvarende md5 hash, dog får jeg kun det første tegn i kombinationen ind i databasen. Jeg har ændret din for løkke til følgende:
for($i = 0; $i < $no_letters; $i++) { echo($letters[$ps[$i]]); mysql_query("INSERT INTO `wordlist` SET `word`='".($letters[$ps[$i]])."', `hash`='".md5($letters[$ps[$i]])."'"); } echo("\n");
Og i min kolonne "word" får jeg kun det første tal ind, eks: 0:cfcd208495d565ef66e7dff9f98764da 3:eccbc87e4b5ce2fe28308fd9f2a7baf3
osv. osv. Min database er med: `word` INT(11) `hash` VARCHAR(32)
Kan du umiddelbart se hvad jeg gør forkert, for jeg kan ikke helt.
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.