Wörter systematisch bilden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Wörter systematisch bilden

    Hi!

    Hat zufällig jemand eine Funktion, die aus einem vorgegeben Alphabet systematisch Wörter generiert

    a
    b
    .
    .
    y
    z
    aa
    ab
    .
    .
    zy
    zz
    aaa
    usw.

    Liebe Grüsse.

  • #2
    ein beispiel
    PHP-Code:
    for ($i 65$i 91$i++)
    {
       echo 
    chr ($i);

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      PHP-Code:
      <?php

      function rec_wort($max=3,$instanz=0,$string '') {    
          if(
      $max == $instanz) return true;
          
      $instanz++;
          for(
      $i 65$i 91$i++)
              {
                  
      $tmp_string =  $string chr($i);
                  echo 
      $tmp_string."<br />\n";
                  
      rec_wort($max,$instanz,$tmp_string);
              }    
      }

      rec_wort();

      ?>
      hat ich noch auf der platte (weiß gar nicht mehr wozu ich das brauchte)

      Allerdings liefert die funktion, so wie sie da steht schon über 18.000 zeilen!!! also nicht unbedingt schnell
      mfg

      PS: Das mit chr() hab ich eben mal nach dem Beispiel von Kropff nachgebestert, hab mich vorher nem string bedient

      Kommentar


      • #4
        Habe mir den ganzen Tag darüber den Kopf zerbrochen, bis ich darauf kam, dass man das aber einfacher lösen kann, als ich dachte:

        Man denkt sich einfach, man zählt mit Buchstaben. 0 = A, 1 = B, usw.
        jetzt wäre die Reihe ja:
        A
        B
        ...
        und 10 wäre BA und so

        das kann man alles schön PHP überlassen.

        Hier mein finales Script, welches mit einem vorgegebenen Buchstaben-Satz (Variable $my_dict) eine Liste erstellt, mit Werten die maximal 4 Zeichen lang sind (Siehe $words = get_words($dict, 4);, die 4 kann man beliebig ändern)

        Ich hoffe man versteht es...

        PHP-Code:
        <pre>
        <?php
        /*
          Fuelle dictionary -> mach aus
          [0] => A
          [1] => B
          ...
          [12] => M
          
          das hier:
          
          [0] => A
          [1] => B
          ...
          [C] => M
          
          das ergibt das 'Woerterbuch' welches man nachher braucht um die Ziffern zu 'uebersetzen'
        */
        function fill_dict($dict)
        {
            
        $new_arr = array();
            
            
        $i 0;
            
        $a 65;
            
            foreach (
        $dict as $val) {
                if (
        $i 10) {
                    
        $new_arr[$i] = $val;
                    
        $i++;
                } else {
                    
        $new_arr[chr($a)] = $val;
                    
        $a++;
                }
            }
            
            return 
        $new_arr;
        }

        /*
          gibt so viele Zahlen in einem Array aus,
          bis der konvertiert Wert so lang ist wie man ihn haben moechte ($digits)
        */
        function get_words($dict$digits)
        {
            
        $num 0;
            
            
        $dict_size count($dict);

            
        $words = array();
            
            while (
        strlen(base_convert($num10$dict_size)) <= $digits) {
                
        $words[] = strtoupper(base_convert($num10$dict_size));
                
        $num++;
            }
            
            return 
        $words;
        }

        /*
          'uebersetzt' die konvertierten Werte (richtet sich nach dem 'Woerterbuch' - siehe oben)
        */
        function do_translate($val)
        {
            return 
        strtr($val$GLOBALS['dict']);
        }

        // Test-Werte:
        $my_dict  = array('A''B''C''D''E''F');

        // Fuellt das dictionary (wandelt es quasi um)
        $dict fill_dict($my_dict);

        // erzeugt 'Woerter' mit bis zu 4 Stellen
        $words get_words($dict4);

        /*
          Workaround um auch sachen wie AA und AAA zu haben
          weil man ja nicht 00 und 000 als Wert haben kann, wird ja immer zu 0
        */

        $words[] = '00';
        $words[] = '000';

        // 'uebersetzt' die Woerter dem dictionary zu folge
        $end array_map('do_translate'$words);
        print_r($end);
        ?>
        </pre>
        bei einer Liste array('A', 'B', 'C', 'D') und einer Wortlänge von 2 gibt das diese Liste:

        Code:
        Array
        (
            [0] => A
            [1] => B
            [2] => C
            [3] => D
            [4] => BA
            [5] => BB
            [6] => BC
            [7] => BD
            [8] => CA
            [9] => CB
            [10] => CC
            [11] => CD
            [12] => DA
            [13] => DB
            [14] => DC
            [15] => DD
            [16] => AA
            [17] => AAA
        )
        Das interessante dabei ist, dass hierbei auch 'Wörterbücher' (Buchstaben-Listen) wie diese möglich sind:
        array(2, 5, '%', '$', 'A', 'V') und so...

        Ich hoffe, ich konnte dir damit helfen!

        Liebe Grüße,
        Flo.
        Zuletzt geändert von Fl0; 19.01.2006, 22:24.

        Kommentar


        • #5
          Ist dir schon aufgefallen, dass nur das allererste Wort mit dem zuerst angegebenen Zeichen beginnt und sonst keins? Wo sind zum Beispiel AA, AB, aber auch AAA, AAB und ABD bei dir?!?

          Und das ist nicht der einzige Bug, versuch mal dieses realistische Setting:
          $my_dict = array_merge(range('a', 'z'), range('A', 'Z'));

          ... oder auch nur das hier:
          $my_dict = array_merge(range('a', 'z'), range('A', 'K'));

          Noch ein Tipp zum Resourcenschonen:
          PHP-Code:
          while (strlen($bc base_convert($num10$dict_size)) <= $digits) {
              
          $words[] = strtoupper($bc); 

          Kommentar


          • #6
            Hehe, hast recht. Ich glaub das ganze kann man umgehen, wenn man das irgendwie umstellt, dass man keinen Null-basiertes Array mehr hat. Naja, aber ein Ansatz ist es allemal ^^

            Find ich gut, dass man sich hier so sehr um die Lösung eines Problems kümmert

            Gruß,
            Flo.

            Kommentar


            • #7
              Hi!

              Cool, Leute, gleich so viele Ansätze!

              Das mit dem Zählen ist mir auch schon gekommen. Habs mal bei den hexadezimalen Zahlen verwendet. Einfach in dezimal hochgezählt und dann nach hexadezimal gerechnet.

              Ohne Rekursion scheint dieses Problem nicht zu lösen zu sein.

              Ich hätte gerne auch die Reihenfolge, dass er zuerst alle Lösungen mit einem Buchstaben ausgibt, dann alle mit 2 usw. (a..z, aa..zz,aaa..zzz, usw.).

              Habs auch mit der vorgegeben Funktion range($von, $bis) probiert, aber ist halt recht langsam im Vergleich zu einem rekursiven Beispiel.

              Trotzdem noch mal vielen Dank für eure Ideen!

              Liebe Grüsse.

              Kommentar


              • #8
                Mich hat die Problemstellung nicht losgelassen... Habe eine simple Lösung gefunden, die auf Rekursion basiert.

                Hier das Script, inklusive Test-Zeilen Kann man sofort copy&paste ausprobieren.

                PHP-Code:
                <pre>
                <?php
                // 22:10 Freitag, 20. Januar 2006
                function get_words(&$arr$dict$prefix$len)
                {
                    foreach (
                $dict as $val) {
                        
                $arr[] = $prefix $val;
                        if (
                strlen(end($arr)) < $len) {
                            
                get_words($arr$dict$prefix $val$len);
                        }
                    }
                }

                $words1 $words2 = array();

                $dict1 = array('A''B''C''D''E''F');
                $dict2 = array('%''Z''2''$''/''§');

                get_words($words1$dict1''3);
                print_r($words1);

                get_words($words2$dict2''2);
                print_r($words2);
                ?>
                </pre>
                Der Vorteil hier ist, wie ich finde, dass man die Wörter zur Weiterverarbeitung direkt in einem Array hat

                Liebe Grüße,
                Flo.
                Zuletzt geändert von Fl0; 20.01.2006, 22:56.

                Kommentar


                • #9
                  Hi!

                  So ähnlich sieht meine Rekursion auch aus. Jedoch finde ich es bei einer Wortlänge von 6 oder 7 Zeichen etwas viel für ein Array. Bei Länge 5 und 26 Buchstaben sind es schon 18.000 Möglichkeiten. Aber die Funktion ist gut optimiert!

                  Danke!

                  Liebe Grüsse.

                  Kommentar


                  • #10
                    Aber war das nicht genau das, was du wolltest?

                    Liebe Grüße,
                    Flo.

                    Kommentar

                    Lädt...
                    X