waki: Pattern

Liebes Forum,

es gibt so ein schönes PHP-Pattern, das ich leider vergessen habe...

Das Einzige woran ich mich noch erinnern kann - man kann damit eine Schleife erstellen, die dann folgendes ausgibt:

aaaaaa
aaaaab
aaaaac
aaaaad
aaaaae
aaaaaf
...
usw.
...
bbbbba
bbbbbb
bbbbbc
bbbbbd
...
usw.
zzzzza
zzzzzb
...
zzzzzz

Weiß hier viell. jemand darüber Bescheid und kann mir einen Tipp geben?

Vielen Dank und Gruß,
waki

  1. @@waki:

    nuqneH

    Weiß hier viell. jemand darüber Bescheid und kann mir einen Tipp geben?

    Ja: Beschreibe dein Problem *verständlich*!

    Für stehen die '...'? Was soll nach "aaaaaz" kommen?

    Qapla'

    --
    Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
    1. Hallo,

      Die Punkte stehen für die Zwischenschritte. Alphabetisch folgt auf einem A ja das B und darauf ein C und so weiter.

      Nach aaaaz soll es dann mit aaaba weitergehen - wie gesagt, ich habe mal so eine Lösung/Pattern gesehen, das mit PHP umgesetzt wurde, kann es aber leider nirgends mehr finden...

      Dank und Gruß,
      waki

      1. Nach aaaaz soll es dann mit aaaba weitergehen - wie gesagt, ich habe mal so eine Lösung/Pattern gesehen, das mit PHP umgesetzt wurde, kann es aber leider nirgends mehr finden...

        Also ein Zahlensystem mit der Basis 26 und einem Ziffern-/Zeichenvorrat von [a-z]? Und eine Schleife die einmal alles durchzählt.

        1. Ja, genau so - nur kann ich dazu leider kein Pattern finden...

          Lieben Gruß,
          waki

          1. Ja, genau so - nur kann ich dazu leider kein Pattern finden...

            8 stellige Zahl, Basis 26 = 26^8 = 208827064576 Kombinationen

            for-Schleife die alle Zahlen von 0 bis 208827064576 ausgibt, in basis 26 konvertiert, in einen String umwandelt und dann die Ziffern ersetzt: str_replace().

            0 = A
            1 = B
            ...
            p = Z

            Vorne wird mit A aufgefüllt bis der String 8 stellen lang ist und mit strtolower() in Kleinbuchstaben konvertiert.

            Das ist sicher nicht die optimalste Lösung, aber ein Ansatz.

            1. Das ist sicher nicht die optimalste Lösung, aber ein Ansatz.

              dec2any()

              1. das ist es - supervielen Dank!

                waki

            2. @@suit:

              nuqneH

              8 stellige Zahl,

              Du kannst nicht zählen?

              Basis 26 = 26^8 = 208827064576 Kombinationen

              for-Schleife die alle Zahlen von 0 bis 208827064576 ausgibt

              Du kannst nicht zählen. ;-) Das ist ein Schleifendurchlauf zu viel.

              Das ist sicher nicht die optimalste Lösung

              Die gibt es auch nicht. (Zu „optimal“ gibt es werder Komparativ noch Superlativ.)

              Qapla'

              --
              Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
              1. Du kannst nicht zählen?

                ich hab aufgerundet :p

                Du kannst nicht zählen. ;-) Das ist ein Schleifendurchlauf zu viel.

                Einer? - wohl eher 208518148800 :p

                Die gibt es auch nicht. (Zu „optimal“ gibt es werder Komparativ noch Superlativ.)

                Ich reiche ein "effizienteste" nach :p

            3. @@suit:

              nuqneH

              for-Schleife die alle Zahlen von 0 bis 208827064576 ausgibt, in basis 26 konvertiert, in einen String umwandelt und dann die Ziffern ersetzt: str_replace().

              Vielleicht ist es mit 6 Schleifen doch einfacher?

              for ($i1 = 0x61; $i1 <= 0x7A; $i1++)  
               for ($i2 = 0x61; $i2 <= 0x7A; $i2++)  
                for ($i3 = 0x61; $i3 <= 0x7A; $i3++)  
                 for ($i4 = 0x61; $i4 <= 0x7A; $i4++)  
                  for ($i5 = 0x61; $i5 <= 0x7A; $i5++)  
                   for ($i6 = 0x61; $i6 <= 0x7A; $i6++)  
                    echo chr($i1) . chr($i2) . chr($i3) . chr($i4) . chr($i5) . chr($i6) . "\n";
              

              Qapla'

              --
              Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
              1. Vielleicht ist es mit 6 Schleifen doch einfacher?

                Zumindest sieht das eleganter aus - wenn man dann eine 10-stellige Zahl haben möchte ist es noch cooler - aber irgendwann wird das unübersichlich :p

                for ($i0 = 0x61; $i1 <= 0x7A; $i0++)  
                 for ($i1 = 0x61; $i1 <= 0x7A; $i1++)  
                  for ($i2 = 0x61; $i2 <= 0x7A; $i2++)  
                   for ($i3 = 0x61; $i3 <= 0x7A; $i3++)  
                    for ($i4 = 0x61; $i4 <= 0x7A; $i4++)  
                     for ($i5 = 0x61; $i5 <= 0x7A; $i5++)  
                      for ($i6 = 0x61; $i6 <= 0x7A; $i6++)  
                       for ($i7 = 0x61; $i2 <= 0x7A; $i7++)  
                        for ($i8 = 0x61; $i3 <= 0x7A; $i8++)  
                         for ($i9 = 0x61; $i4 <= 0x7A; $i9++)
                
                1. for ($i0 = 0x61; $i1 <= 0x7A; $i0++)

                  for ($i1 = 0x61; $i1 <= 0x7A; $i1++)
                    for ($i2 = 0x61; $i2 <= 0x7A; $i2++)
                     for ($i3 = 0x61; $i3 <= 0x7A; $i3++)
                      for ($i4 = 0x61; $i4 <= 0x7A; $i4++)
                       for ($i5 = 0x61; $i5 <= 0x7A; $i5++)
                        for ($i6 = 0x61; $i6 <= 0x7A; $i6++)
                         for ($i7 = 0x61; $i2 <= 0x7A; $i7++)
                          for ($i8 = 0x61; $i3 <= 0x7A; $i8++)
                           for ($i9 = 0x61; $i4 <= 0x7A; $i9++)

                    
                  btw: ja, das ist defekt :D
                  
              2. @@Gunnar Bittersmann:

                nuqneH

                for ($i1 = 0x61; $i1 <= 0x7A; $i1++)

                for ($i2 = 0x61; $i2 <= 0x7A; $i2++)
                  for ($i3 = 0x61; $i3 <= 0x7A; $i3++)
                   for ($i4 = 0x61; $i4 <= 0x7A; $i4++)
                    for ($i5 = 0x61; $i5 <= 0x7A; $i5++)
                     for ($i6 = 0x61; $i6 <= 0x7A; $i6++)
                      echo chr($i1) . chr($i2) . chr($i3) . chr($i4) . chr($i5) . chr($i6) . "\n";

                  
                Hm, in jdem Schleifendurchlauf 6× chr() und ebensoviele Stringkonkatenationen?  
                  
                Das geht wohl optimaler. ;-)  
                  
                ~~~php
                for ($i1 = 0x61; $i1 <= 0x7A; $i1++)  
                {  
                 $s1 = chr($i1);  
                 for ($i2 = 0x61; $i2 <= 0x7A; $i2++)  
                 {  
                  $s2 = $s1 . chr($i2);  
                  for ($i3 = 0x61; $i3 <= 0x7A; $i3++)  
                  {  
                   $s3 = $s2 . chr($i3);  
                   for ($i4 = 0x61; $i4 <= 0x7A; $i4++)  
                   {  
                    $s4 = $s3 . chr($i4);  
                    for ($i5 = 0x61; $i5 <= 0x7A; $i5++)  
                    {  
                     $s5 = $s4 . chr($i5);  
                     for ($i6 = 0x61; $i6 <= 0x7A; $i6++)  
                      echo $s5 . chr($i6) . "\n";  
                    }  
                   }  
                  }  
                 }  
                }
                

                BTW, warum geht das nicht so?

                for ($i = "a"; $i <= "z"; $i++) echo $i;

                Das gibt erst wie erwartet a bis z aus, danach aber aa, ab, …, az, ba, …, yz, yy, yz.

                Qapla'

                --
                Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
                1. Hi!

                  Das geht wohl optimaler. ;-)

                  Beispielsweise wie folgt. Wenn man Code wiederholen muss ist das ein Zeichen dafür, dass die aktuelle Lösung wohl nicht optimal ist.

                  function iterate_letters($deep, $prefix = '') {  
                    if ($deep - 1) {  
                      foreach (range('a', 'z') as $letter)  
                        iterate_letters($deep - 1, $prefix . $letter);  
                    } else {  
                     foreach (range('a', 'z') as $letter)  
                       echo "$prefix$letter\n";  
                    }  
                  }  
                    
                  //Anwendungsbeispiel:  
                  iterate_letters(5);
                  

                  Bei 4 Zeichen ist das Ganze noch erträglich, es werden aber immerhin schon 26^4 * 5 = 2'284'880 Zeichen übertragen (26^4 Zeilen à 4 Zeichen plus Zeilenumbruch). Bei 5 Zeichen sind es schon 71'288'256 und bei 6 sind es 2'162'410'432, also circa 2 GB.

                  Anstatt der beiden foreach-Schleifen gibt es sicher auch noch eine Lösung mit nur einer. Allerdings wollte ich das if nicht nach innen legen, weil das dann um eine Potenz öfter ausgeführt werden muss. Was aber vermutlich egal ist, weil der Großteil der Zeit für das Übertragen und Rendern im Browser draufgeht.

                  BTW, warum geht das nicht so?
                  for ($i = "a"; $i <= "z"; $i++) echo $i;
                  Das gibt erst wie erwartet a bis z aus, danach aber aa, ab, …, az, ba, …, yz, yy, yz.

                  Strings sind keine Zahlen. Zahlen werden nach links höherwertiger, Strings nach rechts. a bis y sind kleiner als z, z ist gleich z und erfüllt ebenfalls die Weiterlaufbedingung. aa bis yz sind wieder kleiner als z, erst za ist größer.

                  Lo!