PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Wettbewerb: 10.000 Zahlen ausschreiben

with 53 comments

Heute kam mir eine nette kleine Programmieraufgabe zu Ohren, und da dachte ich gleich an euch. Das könnte eine interessante Aufgabe sein um zu zeigen wie mit unterschiedlichen Vorgehensweisen das Problem gelöst werden kann.

Die Aufgabe: Die Zahlen 1 bis 10.000 sollen der Reihe nach ausgeschrieben werden, getrennt durch einen Umbruch. So sieht die Ausgabe dann aus:

eins
zwei
drei
vier
fünf
......
eintausendzweihundertdreizehn
eintausendzweihundertvierzehn
....
zehntausend

Ich hoffe die Aufgabe ist verständlich. Mich würde vor allem die Codelänge interessieren, ich glaube die Laufzeit oder Speicherverbrauch sind relativ uninteressant bzw. sehr ähnlich.

Programmiersprachen: Natürlich PHP, aber auch gern andere Sprachen zum Vergleich.

Edit: Eine sehr schöne Zusammenfassung der Ergebnisse hat Rodney Rehm geschrieben, Danke!

Written by Michael Kliewe

Dezember 21st, 2010 at 4:08 pm

53 Responses to 'Wettbewerb: 10.000 Zahlen ausschreiben'

Subscribe to comments with RSS or TrackBack to 'Wettbewerb: 10.000 Zahlen ausschreiben'.

  1. Klingt echt sehr cool. werde ich mich heute Abend mal dran machen.

    Sascha

    21 Dez 10 at 16:26

  2. David Thalmann

    21 Dez 10 at 17:19

  3. 65 Zeilen

    <?php

    function getNumberInWrittenWord($zahl)
    {
    $wert="";
    if ($zahl==1) {$wert="ein";}
    elseif ($zahl==2) {$wert="zwei";}
    elseif ($zahl==3) {$wert="drei";}
    elseif ($zahl==4) {$wert="vier";}
    elseif ($zahl==5) {$wert="fünf";}
    elseif ($zahl==6) {$wert="sechs";}
    elseif ($zahl==7) {$wert="sieben";}
    elseif ($zahl==8) {$wert="acht";}
    elseif ($zahl==9) {$wert="neun";}
    elseif ($zahl==10) {$wert="zehn";}
    elseif ($zahl==11) {$wert="elf";}
    elseif ($zahl==12) {$wert="zwölf";}
    elseif ($zahl==20) {$wert="zwanzig";}
    elseif ($zahl==30) {$wert="dreißig";}
    elseif ($zahl==40) {$wert="vierzig";}
    elseif ($zahl==50) {$wert="fünfzig";}
    elseif ($zahl==60) {$wert="sechzig";}
    elseif ($zahl==70) {$wert="siebzig";}
    elseif ($zahl==80) {$wert="achtzig";}
    elseif ($zahl==90) {$wert="neunzig";}
    return $wert;
    }

    for ($i=1; $i12)
    {
    $zehner_zahl=intval($zahl / 10)*10;
    $zehner=getNumberInWrittenWord($zehner_zahl);
    $zahl=$zahl – intval($zahl / 10)*10;
    $einer_zahl=$zahl;
    $einer=getNumberInWrittenWord($einer_zahl);
    }
    else
    {
    $einer=getNumberInWrittenWord($zahl);
    $zehner_zahl=0;
    $zehner=”";
    $einer_zahl=$zahl;
    }

    $ausgabe=”";
    if ($tausend!=”") {$ausgabe.=$tausend.”tausend”;}
    if ($hundert!=”") {$ausgabe.=$hundert.”hundert”;}
    if ($einer!=”")
    {
    $ausgabe.=$einer;
    if ($einer_zahl==1 AND $zehner_zahl==0) {$ausgabe.=”s”;}
    if ($zehner_zahl>=20) {$ausgabe.=”und”;}
    }
    if ($zehner!=”") {$ausgabe.=$zehner;}
    echo $ausgabe.”";
    }

    ?>

    Blubber

    21 Dez 10 at 17:34

  4. 1. Versuch: 31 Zeilen

    <?php
    $einer = array('', 'eins', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun', 'zehn');
    for($i = 1; $i = 1000){
    $str = $einer[floor($z / 1000)].'tausend';
    $z %= 1000;
    }
    if($z >= 100){
    $str.= str_replace('eins', 'ein', $einer[floor($z / 100)]).'hundert';
    $z %= 100;
    }
    if($z >= 10){
    if($z < 20){
    echo $str.str_replace(array('einszehn', 'zweizehn', 'sieben'), array('elf', 'zwölf', 'sieb'), $einer[floor($z % 10)].'zehn')."";
    continue;
    }
    $tmp = str_replace(array('einszig', 'zwei', 'dreizig', 'sieben'), array('zehn', 'zwan', 'dreißig', 'sieb'), $einer[floor($z / 10)].'zig');
    if(($z %= 10) > 0){
    echo $str.str_replace('eins', 'ein', $einer[$z])."und".$tmp."";
    continue;
    }
    $str.= $tmp;
    }
    if($z > 0){
    $str.= $einer[$z];
    }
    echo $str."";
    }
    ?>

    Philip

    21 Dez 10 at 18:10

  5. arg, gibts hier nen code-tag? Damit keine Zeichen verschluckt werden?

    Philip

    21 Dez 10 at 18:12

  6. Blubber hat vergessen die siebzehn (nicht siebenzehn) zu beachten.

    Anfangs hatte ich es mir einfacher vorgestellt.
    Hat dann doch 10 Minuten gedauert. ;-)

    19 Zeilen:

    $_e = array(”, ‘ein’, ‘zwei’, ‘drei’, ‘vier’, ‘fünf’, ‘sechs’, ‘sieben’, ‘acht’, ‘neun’);
    $_z = array(”, ‘zehn’, ‘zwanzig’, ‘dreißig’, ‘vierzig’, ‘fünfzig’, ‘sechsig’, ‘siebzig’, ‘achzig’, ‘neunzig’);
    for ( $i=1; $i<=9999; $i++ ) {
    list($t,$h,$z,$e) = explode('.', sprintf("%d.%d.%d.%d",$i/1000%10,$i/100%10,$i/10%10,$i/1%10));
    if ($t) $x .= $_e[$t].'tausend';
    if ($h) $x .= $_e[$h].'hundert';
    if ($z1 : $x .= $_e[$e].’und’;
    case $z>1 : $x .= $_z[$z]; break;
    case $e==1 : $x .= ‘elf’; break;
    case $e==2 : $x .= ‘zwölf’; break;
    case $e==7 : $x .= ‘siebzehn’; break;
    default : $x .= $_e[$e].’zehn’; break;
    }
    echo “$x\n”; $x=”;
    }
    echo ‘zehntausend’; #;)

    Eric

    21 Dez 10 at 18:24

  7. @Philip: Normalerweise ist es <code>…</code>

    Michael Kliewe

    21 Dez 10 at 18:25

  8. Die Aufgabenstellung geht ja tendenziell in Richtung Codegolf . Leider ist die Seite aktuell meist down.

    Benjamin Zikarsky

    21 Dez 10 at 18:25

  9. Schön ist anders aber 37 Zeilen:

    “.toWord($number).”\n”;
    }

    function toWord($number, $zehnerstelle = false) {
    var_dump($number);
    if($number > 999) {
    return toWord((int)($number / 1000)).”tausend”.toWord($number % 1000);
    }
    if($number > 99) {
    return toWord((int)($number / 100)).”hundert”.toWord($number % 100);
    }
    if($number > 19) {
    if($number % 10) {
    return toWord($number % 10).”und”.toWord((int)($number / 10), true).”zig”;
    }
    return toWord((int)($number / 10), true).”zig”;
    }
    switch($number) {
    case 0: return “”;
    case 1: return “ein”;
    case 2: return $zehnerstelle ? “zwan” : “zwei”;
    case 3: return $zehnerstelle ? “dreiß” : “drei”;
    case 4: return “vier”;
    case 5: return “fünf”;
    case 6: return “sechs”;
    case 7: return “sieben”;
    case 8: return “acht”;
    case 9: return “neun”;
    case 10: return “zehn”;
    case 11: return “elf”;
    case 12: return “zwoelf”;
    default: return toWord($number – 10).”zehn”;
    }
    }

    Edo

    21 Dez 10 at 18:26

  10. Gemeines Blog mag die spitze klammer nicht. Die ersten 5 zeilen nochmal

    SPITZE-KLAMMER?php

    foreach(range(1,10000) as $number) {
    echo “$number: “.toWord($number).”\n”;
    }

    Edo

    21 Dez 10 at 18:27

  11. Hier noch einmal ohne Zeichenverschluckmonster. ;-)
    http://triff-chemnitz.de/10000.txt

    Eric

    21 Dez 10 at 18:29

  12. Wo Eric recht hat. Warum past ich das auch hier rein :) d’oh

    http://pastebin.com/mbf2agCi

    Edo

    21 Dez 10 at 18:36

  13. Philip

    21 Dez 10 at 18:48

  14. 60 Zeilen in einer Klasse und 10 Minuten Arbeit :)
    http://sandbox.benedict-etzel.de/numbers/source.txt

    Live unter http://sandbox.benedict-etzel.de/numbers/

    B_E

    21 Dez 10 at 18:48

  15. Knapp 200 Zeilen bei großzügiger Formatierung, ein paar Kommentaren, nem Codeheader und dem Beispiel.

    Bekommt man mit Gewalt aber sicher noch wesentlich kleiner.

    Hab die Ausgabe mal grob überflogen, sah im großen und ganzen richtig aus.

    Code + Ausgabe:
    http://s-db.de/num_to_text.php

    Dominik Bonsch

    21 Dez 10 at 19:16

  16. class Zahl {
    private static $einer = array(”, ‘ein’, ‘zwei’, ‘drei’, ‘vier’, ‘fünf’, ‘sechs’, ‘sieben’, ‘acht’, ‘neun’);
    private static $zehner = array(1=>’zehn’, ‘zwanzig’, ‘dreissig’, ‘vierzig’, ‘fünfzig’, ‘sechzig’, ‘siebzig’, ‘achtzig’, ‘neunzig’);
    private static $sonderfaelle = array(10=>’zehn’, ‘elf’, ‘zwölf’, ‘dreizehn’, ‘vierzehn’, ‘fünfzehn’, ‘sechzehn’, ‘siebzehn’, ‘achtzehn’, ‘neunzehn’);

    public static function alsZahl($zahl, $zehner = false) {
    if($zahl > 10000 || $zahl 999) {
    return self::$einer[floor($zahl/1000)].’tausend’.self::alsZahl($zahl % 1000);
    }
    elseif($zahl > 99) {
    return self::$einer[floor($zahl/100)].’hundert’.self::alsZahl($zahl % 100);
    }
    elseif($zahl > 19) {
    return self::alsZahl($zahl%10, true).($zahl%10?’und’:”).self::$zehner[floor($zahl/10)];
    }
    elseif($zahl > 9) {
    return self::$sonderfaelle[$zahl];
    }
    elseif($zahl == 1) {
    return ‘ein’.($zehner?”:’s');
    }
    else {
    return self::$einer[$zahl];
    }
    }
    }

    echo ”;
    for($i=1; $i<10001; ++$i) printf("% 5d : %s\n", $i, Zahl::alsZahl($i));
    echo '’;

    ChrisB

    21 Dez 10 at 19:27

  17. @Michael: Für solche Wettbewerbe solltest du vielleicht nächstes Mal im voraus sicherstellen, dass man Code posten kann, ohne dass dieser von WordPress verunstaltet wird …

    ChrisB

    21 Dez 10 at 19:30

  18. So, hier meine Version auch noch mal auf http://pastebin.com/7Nz5fFb9

    ChrisB

    21 Dez 10 at 19:34

  19. Oder man nimmt einfach einen Gist. Dann können auch andere herumexperimentieren. ;-)

    Benjamin Zikarsky

    21 Dez 10 at 19:45

  20. Oder man nutzt direkt einen pasteservice. Gist würde sich da sogar relativ gut für machen, da kann man noch nachträglich korrigieren.^^

    Flyingmana

    21 Dez 10 at 19:58

  21. Sehr schön. Solche Aufgaben sollten eindeutig häufiger gestellt werden. :-) Meine deklarative Lösung findet ihr auf http://pastebin.com/k31ANGdn.

    Andre

    21 Dez 10 at 20:10

  22. Whao, so viele schon, muss ich gleich erstmal ein paar durchprobieren.

    @B_E: Bei deiner Lösung sind Fehler drin, siehe
    sechundzwanzig
    siebundzwanzig

    Michael Kliewe

    21 Dez 10 at 20:44

  23. Auch mal eine Lösung von mir, die vollkommen auf Kürze getrimmt ist, und das der Lesbarkeit und deprecated Fehlern opfert. Umlaute sind aktuell durch [uoa]e und ß durch sz maskiert, wobei ich zweiteres nicht explizit ausnutze um noch ein paar Zeichen zu sparen. (dreiSZIG wäre sonst (zwan-, vier-, fünfZIG usw kompatibel ;-))

    Spezialfälle sollten alle berücksichtigt werden, also elf, zwoelf undein/eins, sech/sechs, sieb/sieben und.

    Funktionieren sollte es bis auschließlich 999’999’999.

    Benjamin Zikarsky

    21 Dez 10 at 21:51

  24. Glatt den Link vergessen: https://gist.github.com/750568

    Benjamin Zikarsky

    21 Dez 10 at 21:51

  25. Schönes Thema. So etwas habe ich vor einiger Zeit mal benötigt. Die Größe der Klasse ist nicht zu vergleichen mit den bisher gezeigten Lösungen :D Lang ists her.

    http://pastebin.com/XyXJ8VK9

    um die 10000 anzeigen zu lassen müsste man bei mir eine Schleife ausgeben, da die Klasse nur für Einzelausgaben ausgelegt war. In etwa

    $n2w = new NumberToWord;
    echo '';
    for($i = 1; $i setNumber($i);
    echo $n2w->getWord() . '';
    }
    echo '';

    André

    21 Dez 10 at 23:06

  26. Örks.. Code zerissen.
    http://pastebin.com/La5gLKVd (für die Nutzung der Klasse)

    André

    21 Dez 10 at 23:07

  27. Habt ihr Tipps für mich was ich in WordPress einstellen muss damit hier vernünftig Code gepostet werden kann in den Kommentaren?

    Michael Kliewe

    21 Dez 10 at 23:11

  28. Jetzt mal noch den unleserlich-kurzen Algorithmus in einer OO-Version: https://gist.github.com/750787

    Benjamin Zikarsky

    22 Dez 10 at 00:17

  29. So,

    habe mich auf der Heimfahrt auch mal probiert und danach die Ergebnisse mit den anderen Lösungen hier verglichen.

    Lösung 1: Fortlaufende Sequenz
    https://github.com/rodneyrehm/counting/blob/master/codes/globe.php

    Lösung 2: Random Access
    https://github.com/rodneyrehm/counting/blob/master/codes/globe2.php

    Test der bisherigen Lösungen:
    https://github.com/rodneyrehm/counting#readme

    Grüße,
    Rod

    Rodney Rehm

    22 Dez 10 at 01:10

  30. Ich glaube, jetzt habe ich alle Fehler raus…

    Hier meine Lösung: https://github.com/MKuckert/wordednumbers/blob/master/wordednumbers.php

    Ich habe versucht, die eigentliche Logik so zu abstrahieren, dass die Namen der Ziffern über verschiedene Locales angepasst werden können. Als Beispiel liegt das deutsche und englische Locale bei.

    Martin Kuckert

    22 Dez 10 at 09:44

  31. @ Martin: Interessante Idee, auch an die Lokalisierung zu denken!

    …kam schon jemand auf die Idee seinen Code auch noch testbar zu gestalten?

    Igor

    22 Dez 10 at 10:09

  32. Hier mal meine Lösung in Javscript.
    Sollte aber genausogut auf PHP anwendbar sein …

    https://gist.github.com/751313

    Markus Gutbrod

    22 Dez 10 at 10:36

  33. Ich habe mal noch die Fehler entfernt, die Performance leicht erhöht und ein paar Zeichen weniger genutzt. ;)

    https://gist.github.com/751336

    Das Ergebnis ist:
    http://www.triff-chemnitz.de/10000.php

    Eric

    22 Dez 10 at 11:19

  34. @Rodney: Wegen deines Hinweises bzgl split und explode. Das ist mir schon bewusst, aber split (5) hat weniger Buchstaben als explode (7).

    Wobei man das erste split() durch ein array(0,0,2=>’zwan’,3=>’dreißig’) ersetzen kann, das ist genauso lang, und performanter.

    Du scheinst mir aber ohnehin eine falsche (die initiale) Version erwischt zu haben, die aktuelle ist noch ein paar Zeichen kürzer, und macht auch die Fehler nicht mehr.

    Benjamin Zikarsky

    22 Dez 10 at 12:03

  35. ich hab auch nochmal ein Fehler ausgebessert und den Code um 50% gekürzt:

    https://gist.github.com/751394

    Blubber

    22 Dez 10 at 12:10

  36. Eine letzte Variante:
    https://github.com/bzikarsky/counting/blob/master/codes/benjamin3.php

    Laut Rodneys Test die aktuell schnellste Implementierung, und relativ kurz gehalten.

    Benjamin Zikarsky

    22 Dez 10 at 14:54

  37. Da bin ich ja noch richtig lang mit meinen 57 Zeilen und 23 Minuten o.O

    http://pastebin.com/xaLU0Vck

    Nick

    23 Dez 10 at 11:51

  38. Die Auswerung wurde nun auch um Nicks Lösung ergänzt.

    Michael: Werden die verschiedenen Lösungen noch irgendwie analysiert?

    Rodney Rehm

    26 Dez 10 at 12:17

  39. @Rodney: ich finde deine Analyse schon sehr gut und ausreichend, hatte nicht vor da noch was hinzuzufügen, ich versuche lieber neue Artikel zu schreiben wenn es die Zeit erlaubt ;-)

    Michael Kliewe

    27 Dez 10 at 09:22

  40. Ich denke, man könnte schon noch den einen oder anderen Absatz dazu schreiben. Evtl. auch auf “falsche” Aussagen des ursprünglichen Artikels eingehen, denn z.B. haben wir sehr wohl relativ große Laufzeit- und Speicher-Unterschiede, die von der Implementierung abhängen. Beispielsweise tauscht Rodneys “globe” Speicher gegen Geschwindigkeit ein, wenn er die Ergebnisse zwischenspeichert.
    Das Thema taugt fast als Einstieg in ein paar PHP Performance-Eigenheiten im Micro-Optimierungsbereich, wie echo “.” vs “,”, bzw. das langsame String-Zusammenfügen, oder auch der langsame Array-Aufbau.

    Ich habe mal testweise “benjamin3″ als Funktion umgeformt (allerdings ohne Rekursion wie in “benjamin”), da geht der Löwenanteil an den Array-Aufbau verloren. Wenn man das herausnimmt, und beispielsweise als Funktionsparameter übergibt, wird die Geschichte signifikantt schneller.

    Benjamin Zikarsky

    27 Dez 10 at 12:10

  41. Ich sehe das so wie Benjamin. Die meisten der eingereichten Lösungen haben (teilweise signifikante) Probleme. Mit dem enormen Speicherverbrauch meiner Lösungen schließe ich mich da gerne mit ein…

    Benjamin bekommt ein (für Initiative). :)

    Rodney Rehm

    27 Dez 10 at 12:18

  42. 67 Zeilen, aber lesbar:
    “eins”,
    10 => “zehn”,
    11 => “elf”,
    12 => “zwölf”,
    16 => “sechzehn”,
    17 => “siebzehn”,
    20 => “zwanzig”,
    30 => “dreißig”,
    60 => “sechzig”,
    70 => “siebzig”,
    );
    $digits = array(
    1 => “ein”,
    2 => “zwei”,
    3 => “drei”,
    4 => “vier”,
    5 => “fünf”,
    6 => “sechs”,
    7 => “sieben”,
    8 => “acht”,
    9 => “neun”,
    );

    for ($i=1; $i 0; $iSixDigits = floor($iSixDigits / 1000))
    {
    $iThreeDigits = $iSixDigits % 1000;
    $iTwoDigits = $iThreeDigits % 100;
    $lastDigit = $iTwoDigits % 10;
    $sThreeDigits = “”;

    if ($lastDigit > 0 && !array_key_exists($iTwoDigits, $specials))
    {
    $sThreeDigits = $digits[$lastDigit];
    $iTwoDigits -= $lastDigit;
    if ($iTwoDigits >= 20)
    {
    $sThreeDigits .= “und”;
    }
    }

    if (array_key_exists($iTwoDigits, $specials))
    {
    $sThreeDigits .= $specials[$iTwoDigits];
    }
    elseif ($iTwoDigits > 0)
    {
    $sThreeDigits .= $digits[$iTwoDigits / 10] . “zig”;
    }

    $hundreds = floor($iThreeDigits / 100);
    if ($hundreds > 0)
    {
    $sThreeDigits = $digits[$hundreds] . “hundert” . $sThreeDigits;
    }

    array_unshift($sSixDigits, $sThreeDigits);
    }

    echo implode(“tausend”, $sSixDigits) . “\n”;
    }
    ?>

    Carsten Milkau

    31 Dez 10 at 15:51

  43. hopefully more readable:
    <?php
    $specials = array(
    1 => "eins",
    10 => "zehn",
    11 => "elf",
    12 => "zwölf",
    16 => "sechzehn",
    17 => "siebzehn",
    20 => "zwanzig",
    30 => "dreißig",
    60 => "sechzig",
    70 => "siebzig",
    );
    $digits = array(
    1 => "ein",
    2 => "zwei",
    3 => "drei",
    4 => "vier",
    5 => "fünf",
    6 => "sechs",
    7 => "sieben",
    8 => "acht",
    9 => "neun",
    );

    for ($i=1; $i<=10000; $i++)
    {
    $sSixDigits = array();

    for ($iSixDigits = $i % 1000000; $iSixDigits > 0; $iSixDigits = floor($iSixDigits / 1000))
    {
    $iThreeDigits = $iSixDigits % 1000;
    $iTwoDigits = $iThreeDigits % 100;
    $lastDigit = $iTwoDigits % 10;
    $sThreeDigits = "";

    if ($lastDigit > 0 && !array_key_exists($iTwoDigits, $specials))
    {
    $sThreeDigits = $digits[$lastDigit];
    $iTwoDigits -= $lastDigit;
    if ($iTwoDigits >= 20)
    {
    $sThreeDigits .= "und";
    }
    }

    if (array_key_exists($iTwoDigits, $specials))
    {
    $sThreeDigits .= $specials[$iTwoDigits];
    }
    elseif ($iTwoDigits > 0)
    {
    $sThreeDigits .= $digits[$iTwoDigits / 10] . "zig";
    }

    $hundreds = floor($iThreeDigits / 100);
    if ($hundreds > 0)
    {
    $sThreeDigits = $digits[$hundreds] . "hundert" . $sThreeDigits;
    }

    array_unshift($sSixDigits, $sThreeDigits);
    }

    echo implode("tausend", $sSixDigits) . "\n";
    }
    ?>

    Carsten Milkau

    31 Dez 10 at 15:59

  44. 17 lines, a lot less readable: (how do I get it correctly formatted in this blog??)
    <?php
    $fx="explode";
    $T=$fx(" "," ein zwei drei vier fünf sechs sieben acht neun zehn elf zwölf zig hundert tausend sech sieb ßig und zwan \n s");
    $S=$fx(" ",'19,0,13,/ 0,1[49],/ 1,13/10 19,10/10 1,10/11 2,10/12 ([67]),(1[03])/1\1,\2 2,13/20,13 3,13/3,18 1,21/1,22,21 0,15,/');
    for($i=1;$i<=10000;$i++)
    {
    $N=str_split(sprintf("%05d",$i));
    $N="0,{$N[1]},19,{$N[0]},13,15,{$N[2]},14,{$N[4]},19,{$N[3]},13,21";
    foreach ($S as $R)
    {
    list($P,$Q)=$fx("/",$R);
    $N=preg_replace("/\b$P\b/",$Q,$N);
    }
    foreach($fx(",",$N) as $D)
    echo $T[$D];
    }
    ?>

    Carsten Milkau

    31 Dez 10 at 16:03

  45. $ php test.php carsten run
    carsten
    0.3112
    332.73
    1021.32
    1171
    1000, 1001, 1016

    Deine Implementierung macht noch Fehler bei “eintausend”. Aktuell kommt noch “einstausend” heraus ;-)

    Benjamin Zikarsky

    31 Dez 10 at 16:05

  46. @Carsten: Am besten gist, pastie oder sowas benutzen, ich habe keine Ahnung wie ich WordPress beibringe Code in Kommentaren korrekt anzuzeigen.

    Michael Kliewe

    31 Dez 10 at 16:09

  47. Deine 2. Implementierung (die kurze) läuft fehlerfrei ist dafür aber danke RegExp auch sehr langsam. Ergebnisse laut Rodneys Test:

    approach | time | memory | peak | characters | errors
    ———|——–|——–|———|————|——–
    carsten2 | 1.2738 | 332.96 | 1022.95 | 535 | -
    carsten | 0.3123 | 332.73 | 1021.44 | 1171 | 1000, 1001, 1016

    Benjamin Zikarsky

    31 Dez 10 at 16:11

  48. echo ‘eins’;
    echo ‘zwei’;
    echo ‘drei’;
    echo ‘vier’;
    echo ‘sechs’;
    echo ‘sieben’;
    echo ‘acht’;
    echo ‘neun’;
    echo ‘zehn’;
    echo ‘elf’;

    :-)

    Chris

    2 Jan 11 at 07:54

  49. [...] Kliewe hatte vor einiger Zeit erneut zu einem Wettbewerb aufgerufen. Diesmal galt es die Zahlen von 1 bis 10.000 als Zahlworte auszugeben. Relativ schnell kamen dann [...]

  50. Auf vielfachen Wunsch ;) und sehr verspätet hier noch ein Lösungsansatz. Die Klasse kann Zahlen bis zu 999 Quindezilliarden (999 gefolgt von 93 Stellen) umwandeln.

    Ich habe einfach ohne Konzept oder Planung angefangen, erstes Ziel war halt das es funktioniert. Der Kern sind die beiden Methoden _toWord() und _numGroups(). Da steckt mit Sicherheit noch viel Optimierungspotenzial drin.
    Nächstes Ziel soll sein, dass man die Klasse für beliebige Sprachen (Englisch, Französisch, Spanisch, usw) anpassen kann. Dazu müsste man lediglich die Methoden _toWord() und _numGroups(), sowie halt die Zahlennamen austauschen.

    http://pastebin.com/R9vZB8cQ

    Ralf

    15 Jan 11 at 10:24

  51. [...] Fahrradschloss hebt Drahtesel in luftige und sichere Höhe am Laternenpfahl – Engadget German Wettbewerb: 10.000 Zahlen ausschreiben | PHP Gangsta – Der PHP Blog WordPress: Mit PHP und XML-RPC bloggen | felixtriller.de Weiße Flecken auf Schloss Montabaur [...]


  52. <?php
    $namen = array('null','ein','zwei','drei','vier',utf8_decode('fünf'),'sechs','sieben','acht','neun','zehn','elf',utf8_decode('zwölf'));
    for ($i=1; $i=1000) $myNumber.= $namen[intval(substr($number,0,-3))].'tausend';
    if(intval($number) >=100 && intval(substr($number,-3)) > 0)$myNumber.= $namen[intval(substr($number,-3,1))].'hundert';
    while (strlen($number) >2) $number=substr($number,1);
    $myNumber .= (intval($number) <= 12)?($namen[intval($number)]):(($number<20)?(substr($namen[intval(substr($number,1,1))],0,4).'zehn'):(($number == 20)?('zwanzig'):(($number < 30)?($namen[intval(substr($number,1,1))].'undzwanzig'):(($number 29)?((intval($number)<40)?('ssig'):('zig')):('');
    if(substr($myNumber,-4) == "null") $myNumber = substr($myNumber,0,-4);
    if(substr($myNumber,-3) == "ein") $myNumber.= 's';
    echo ''.ucfirst(utf8_encode($myNumber));
    }
    ?>

    maybe

    12 Jan 12 at 16:19

  53. 15 Zeilen mit “”. Vergessen hinzuschreiben :)

    maybe

    12 Jan 12 at 16:20

Leave a Reply

You can add images to your comment by clicking here.