Avatar billede nothingaqua Nybegynder
09. april 2006 - 20:17 Der er 9 kommentarer

kombinationer af tegn

Hej,

jeg søger en smart måde at printe alle kombinationer af en række tegn. Den 'dårlige' måde jeg er komemt frem til er
$tegntabel=array('j','k','l');
foreach($tegntabel as $k[1]=>$tegn[1]) foreach($tegntabel as $k[2]=>$tegn[2]) print $tegn[1].$tegn[2];

Den printer alle kombinationerne af de tre tal.

Jeg søger en smartere/mere dynamisk måde at gøre det til, så jeg ikke behøver at tilføje en for() lykke hver gang der skal en tilføjes et ekstra led.
Avatar billede razmuz_dk Nybegynder
09. april 2006 - 20:43 #1
Jeg har desværre ikke mulighed for at teste nedenstående, så chancerne for at det virker er lille :-) Men måske kan du bruge princippet til selv at lave en virkende version :-)

$tegntabel = array("a", "b", "c");
function make_combinations($offset="") {
  global $tegntabel, $combinations;
  foreach($tegntabel as $key => $value) {
    $combination = $offset.$value;
    if(strlen($combination) == sizeof($tegntabel)
      $combinations[] = $combination;
    else
      make_combinations($combination);
  }
}
make_combinations();

Håber det hjalp lidt :)
Avatar billede erikjacobsen Ekspert
09. april 2006 - 20:54 #2
Vi kan jo også tage den uden rekursion ... ;)

<?
  $t="abc";

  $a=Array();
  array_push($a,"");
  while (($p=array_pop($a))!==null) {
    if (strlen($p)==strlen($t)) {
      print "$p\n";
    } else {
      for($i=0;$i<strlen($t);$i++) {
        array_push($a,$p.$t[$i]);
      }
    }
  }
?>
Avatar billede nothingaqua Nybegynder
09. april 2006 - 20:57 #3
razmuz_dk, der manglede en enkelt ), men jeg kunne ikke få funktionen til at virke i den.

erik,
Glemte jeg at sige at der gerne må være en parameter på så man kan sige : hvor mange kombinationer kan du lave af 'abc' på 2tegn?
Avatar billede erikjacobsen Ekspert
09. april 2006 - 20:59 #4
Så hælder du bare resultaterne i et array i stedet for bare at skrive dem ud - alternativt laver en tæller.

Men hvis du kun skal bruge antallet, er der en superduperlet måde at regne det ud på ;)
Avatar billede nothingaqua Nybegynder
09. april 2006 - 21:05 #5
nej, jeg skal bruge mulighederne, ikke antallet.

Den kan jeg ikke lure erik. Jeg har også fået fomuleret spm forkert.
simpelt eksempel a,b,c på 2 tegn
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
..
Avatar billede nothingaqua Nybegynder
09. april 2006 - 21:05 #6
simpelt eksempel a,b,c på max 2 tegn
Avatar billede erikjacobsen Ekspert
09. april 2006 - 21:11 #7
Så laver du den bare lidt om

<?
  $t="abc"; $max=2;

  $a=Array();
  array_push($a,"");
  while (($p=array_pop($a))!==null) {
    if ($p!="" && strlen($p)<=$max) {
      print "$p\n";
    }
    if (strlen($p)<$max) {
      for($i=0;$i<strlen($t);$i++) {
        array_push($a,$p.$t[$i]);
      }
    }
  }
?>
Avatar billede nothingaqua Nybegynder
09. april 2006 - 21:18 #8
tak, smidt et svar.
Avatar billede erikjacobsen Ekspert
09. april 2006 - 21:20 #9
Jeg samler slet ikke på point, tak.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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