4er-Tupel, Anzahl der Möglichkeiten auflisten
shortyBee
- php
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:
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
Hallo!
0000
0001
00029998
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
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
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
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...
hallo,
Ja, informier dich mal über bitweise operatoren...
damit kann ich in diesem zusammenhang überhaupt nichts anfangen.
????
gruss,
shortyBee
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...
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
Hallo,
Fast!
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... :-(
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
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
Hallo!
genau.
und ich möchte haben:aaaaa
aaaab
aaaac
.
.
.
zzzzx
zzzzy
zzzzzwobei 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
hallo,
noch ein nachtrag:
das ganze soll variabel sein für n-tupel.
gruss,
shortyBee
Hallo!
das ganze soll variabel sein für n-tupel.
Was soll variabel sein?
André Laugks
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
Hallo!
3er-tupel: abc
4er-tupel: abcd
5er-tupel: abcde
6er-tupel: abcdef
Das machst Du mit einer Rekursion!
André Laugks
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
hallo seth,
danke für deinen beitrag.
das ist eine menge gedankenfutter...
schönen sonntag noch,
shortyBee
Hallo Seth,
das ist eine tolle, einfallsreiche Lösung!!!!
Du hast mir damit sehr weitergeholfen!
Danke,
shortyBee