shortyBee: 4er-Tupel, Anzahl der Möglichkeiten auflisten

hallo,

ich benötige ein skript, dass mir ein 4er-tupel mit allen möglichkeiten   auflistet.
die elemente sind die ziffern 0-9.

das soll dann so aussehen:

0000
0001
0002

9998
9999

ich versuche schon vergeblich ein skript zu schreiben und bekomme es einfach nicht hin und bin am verzweifeln...

kennt jemand ein fertiges skript?

danke,
shortyBee

  1. Hallo!

    0000
    0001
    0002

    9998
    9999

      
    for($i = 0; $i < 1000; $i++) {  
        echo str_pad($i, 4, 0, STR_PAD_LEFT);  
    }  
    
    

    [link.http://de.php.net/str_pad]

    André Laugks

    --
    Die Frau geht, die Hilti bleibt!
    1. hallo,

      danke für die fixe antwort!!!

      for($i = 0; $i < 1000; $i++) {
          echo str_pad($i, 4, 0, STR_PAD_LEFT);
      }

      
      >   
      > [link.http://de.php.net/str\_pad]  
        
      ich hätte nicht gedacht, dass es so eine einfache lösung gibt.  
      ich habe mit for-schleifen und rekursiven funktionen vergeblich rumgestrickt.  
        
      schönes WE und danke,  
      shortyBee
      
    2. hallo nochmal,

      wie sieht denn das ganze aus, wenn ich anstatt die ziffern 0-9 die elemente a-z haben möchte?
      geht das auch damit?

      vg,
      shortyBee

      1. hallo nochmal,

        wie sieht denn das ganze aus, wenn ich anstatt die ziffern 0-9 die elemente a-z haben möchte?
        geht das auch damit?

        vg,
        shortyBee

        Ja, informier dich mal über bitweise operatoren...

        --
        Käsebrötchen
        1. hallo,

          Ja, informier dich mal über bitweise operatoren...

          damit kann ich in diesem zusammenhang überhaupt nichts anfangen.

          ????

          gruss,
          shortyBee

          1. hallo,

            Ja, informier dich mal über bitweise operatoren...

            damit kann ich in diesem zusammenhang überhaupt nichts anfangen.

            ????

            gruss,
            shortyBee

            Dann informier dich mal über den binären aufbau von ascii - code / zeichen... du wirst merken, dass das garnicht so abwegig ist...

            --
            Käsebrötchen
      2. Hallo!

        wie sieht denn das ganze aus, wenn ich anstatt die ziffern 0-9 die elemente a-z haben möchte?
        geht das auch damit?

        Fast!

        http://www.php-faq.de/q/q-code-alphabet.html

        André Laugks

        --
        Die Frau geht, die Hilti bleibt!
        1. Hallo,

          Fast!

          http://www.php-faq.de/q/q-code-alphabet.html

          hatte ich schon probiert.
          und zwar so:

          for($i = 97; $i < 123; $i++) {
              echo str_pad(chr($i), 8, 0, STR_PAD_LEFT)."<br>";
          }

          hat aber nicht das gewünschte ergebnis geliefert... :-(

          1. Hallo!

            hat aber nicht das gewünschte ergebnis geliefert... :-(

            Bei mir sieht das so aus:

            0000000a
            0000000b
            0000000c
            0000000d
            0000000e
            0000000f
            0000000g
            0000000h
            0000000i
            0000000j
            0000000k
            0000000l
            0000000m
            0000000n
            0000000o
            0000000p
            0000000q
            0000000r
            0000000s
            0000000t
            0000000u
            0000000v
            0000000w
            0000000x
            0000000y
            0000000z

            André Laugks

            --
            Die Frau geht, die Hilti bleibt!
            1. hallo,

              Bei mir sieht das so aus:

              0000000a
              0000000b
              0000000c
              0000000d
              0000000e
              0000000f
              0000000g
              0000000h
              0000000i
              0000000j
              0000000k
              0000000l
              0000000m
              0000000n
              0000000o
              0000000p
              0000000q
              0000000r
              0000000s
              0000000t
              0000000u
              0000000v
              0000000w
              0000000x
              0000000y
              0000000z

              genau.
              und ich möchte haben:

              aaaaa
              aaaab
              aaaac
              .
              .
              .
              zzzzx
              zzzzy
              zzzzz

              wobei es nicht unbedingt ein 5er-tupel sein soll,
              sondern flexibel: ein n-tupel

              gruss,
              shortyBee

              1. Hallo!

                genau.
                und ich möchte haben:

                aaaaa
                aaaab
                aaaac
                .
                .
                .
                zzzzx
                zzzzy
                zzzzz

                wobei es nicht unbedingt ein 5er-tupel sein soll,
                sondern flexibel: ein n-tupel

                Dann überlege mal! Das kan man mich verschachtelten Schleifen machen.

                André Laugks

                --
                Die Frau geht, die Hilti bleibt!
        2. hallo,

          noch ein nachtrag:
          das ganze soll variabel sein für n-tupel.

          gruss,
          shortyBee

          1. Hallo!

            das ganze soll variabel sein für n-tupel.

            Was soll variabel sein?

            André Laugks

            --
            Die Frau geht, die Hilti bleibt!
            1. hi,

              das ganze soll variabel sein für n-tupel.

              Was soll variabel sein?

              na, als n-tupel:

              3er-tupel: abc
              4er-tupel: abcd
              5er-tupel: abcde
              6er-tupel: abcdef
              .
              .
              .
              n-tupel: abcd.......n

              gruss,
              shortyBee

              1. Hallo!

                3er-tupel: abc
                4er-tupel: abcd
                5er-tupel: abcde
                6er-tupel: abcdef

                Das machst Du mit einer Rekursion!

                André Laugks

                --
                Die Frau geht, die Hilti bleibt!
      3. gudn tach!

        wie sieht denn das ganze aus, wenn ich anstatt die ziffern 0-9 die elemente a-z haben möchte?
        geht das auch damit?

        nicht ganz so einfach, aber fast.
        wenn du rekursionen vermeiden willst, dann gibt es u.a. folgende moeglichkeit:
        bei einer laenge von insg. n zeichen eines alphabetes mit m zeichen, also z.b. n=5 (laenge) und m=26 (anzahl der zeichen im alphabet), koenntest du eine bijektion zwischen den zahlen von 0 bis (m^n)-1, hier also 0 bis (26^5)-1, und den worten aaaaa bis zzzzz erstellen. "bijektion" heisst, dass du jeder zahl von 0 bis (26^5)-1 genau ein "wort" aus aaaaa bis zzzzz zuweist.
        das geht z.b. indem du die zahl ganzzahlig durch 26 teilst, dann das ergebnis durch 26, dann dessen ergebnis usw. insg. n mal. der jeweilge rest wird einem zeichen zugeordnet. 0 fuer a, 1 fuer b, ... 25 fuer z.
        allgemein:
        gegeben sei die zahl x:
          x/m = a_1 rest r_1 (merke r_1 fuer die n-te stelle)
        a_1/m = a_2 rest r_2 (merke r_2 fuer die (n-1)-te stelle)
        a_2/m = a_3 rest r_3 (merke r_3 fuer die (n-2)-te stelle)
        ...
        a_{n-2}/m = a_{n-1} rest r_{n-1} (merke r_{n-1} fuer die zweite stelle)
        a_{n-1}/m = a_n rest r_n (merke r_n fuer die erste stelle)

        r_1, r_2, ..., r_{n-1}, r_n muss nun nur noch zeichenweise uebersetzen und ist fertig.

        ein paar beispiele sollen das verdeutlichen:
        die zahl 0:
        0/26 = 0 rest 0 (merke 0 fuer die fuenfte stelle)
        0/26 = 0 rest 0 (merke 0 fuer die vierte stelle)
        0/26 = 0 rest 0 (merke 0 fuer die dritte stelle)
        0/26 = 0 rest 0 (merke 0 fuer die zweite stelle)
        0/26 = 0 rest 0 (merke 0 fuer die erste stelle)
        0,0,0,0,0 -> aaaaa
        fertig.

        die zahl 1:
        1/26 = 0 rest 1 (merke 1 fuer die fuenfte stelle)
        0/26 = 0 rest 0 (merke 0 fuer die vierte stelle)
        0/26 = 0 rest 0 (merke 0 fuer die dritte stelle)
        0/26 = 0 rest 0 (merke 0 fuer die zweite stelle)
        0/26 = 0 rest 0 (merke 0 fuer die erste stelle)
        0,0,0,0,1 -> aaaab

        die zahl 26:
        26/26 = 1 rest 0 (merke 0 fuer die fuenfte stelle)
         1/26 = 0 rest 1 (merke 1 fuer die vierte stelle)
         0/26 = 0 rest 0 (merke 0 fuer die dritte stelle)
         0/26 = 0 rest 0 (merke 0 fuer die zweite stelle)
         0/26 = 0 rest 0 (merke 0 fuer die erste stelle)
        0,0,0,1,0 -> aaaba

        die zahl 123456:
        123456/26 = 4748 rest  8 (merke  8 fuer die fuenfte stelle)
          4748/26 =  182 rest 16 (merke 16 fuer die vierte stelle)
           182/26 =    7 rest  0 (merke  0 fuer die dritte stelle)
             7/26 =    0 rest  7 (merke  7 fuer die zweite stelle)
             0/26 =    0 rest  0 (merke  0 fuer die erste stelle)
        0,7,0,16,8 -> ahaqi

        hilfsmittel hierfuer sind:
        modulo-operator (fuer den jeweiligen rest), ganzzahlige division.

        falls die kombinationen die anzahl der verfuegbaren zahlen uebersteigt, so sollte man sich aber besser ein eigenes zahlen-system basteln, das die eigenschaften des dezimalsystems imitiert, bis auf die tatsache, dass es nicht zehn sondern eben m verschiedene "ziffern" gibt. z.b. so: (ich verwende abkuerzende pseudo-code-schreibweisen)

        max_ziffer = 26-1;             // (anzahl der alphabet-zeichen)-1, weil man in c-aehnlichen sprachen normalerweise bei 0 anfaengt zu zaehlen.
        anz_ziffern = 5;               // laenge des wortes
        zahl[0..(anz_ziffern-1)] = 0;  // die zahl werde durch ein array repraesentiert
        while(incr(zahl, max_ziffer)){ // erhoehe wert in array jeweils um 1
          print zahl2wort(zahl);       // gebe zur zahl gehoerendes zeichen aus
        }

        function incr(&zahl, max_ziffer){ // call-by-reference: "erhoehe" zahl
          last = length(zahl);            // letzte ziffer
          ++zahl(last);                   // erhoehe letzte ziffer
          for i=last backto 1{            // laufe rueckwaerts durchs array
            if(zahl[i]>max_ziffer){       // uebertrag?
              zahl[i]=0;
              if(i>0) ++zahl[i-1];
              else return false;          // falls zahl groesser als erlaubt
            }
          }
          return true;
        }

        function zahl2wort(z){            // ersetze zahl durch buchstaben
          return_char='';
          for i=1 to length(z){
            return_char.=ascii(z[i]+97);// 97='a'
          }
          return return_char;
        }

        alles ungetestet, aber die idee sollte klar sein.

        prost
        seth

        1. hallo seth,

          danke für deinen beitrag.
          das ist eine menge gedankenfutter...

          schönen sonntag noch,
          shortyBee

        2. Hallo Seth,

          das ist eine tolle, einfallsreiche Lösung!!!!
          Du hast mir damit sehr weitergeholfen!

          Danke,
          shortyBee