Entwicklergolf bei //SEIBERT/MEDIA: Alle Programmierer sind eingeladen

Gesucht: Der schlankeste Code

Wenn sich die Weihnachtszeit nähert, wird natürlich auch den Entwicklern von //SEIBERT/MEDIA warm ums Herz. Doch anstatt nach Plätzchen- und Glühweinrezepten zu googeln und feierliche Dekoideen zu recherchieren, haben sie ein weihnachtliches Golfturnier ausgetragen – allerdings eine Variante, für die kein Schlägerarsenal und kein Caddy, sondern Kreativität und ausgezeichnete Programmierkenntnisse nötig sind.

Beim Golf auf dem Rasen gewinnt der Spieler, der die wenigsten Schläge zum Einlochen benötigt. Daran orientiert sich auch der Golfwettbewerb unter Entwicklern: Ziel ist es, eine bestimmte Programmieraufgabe mit möglichst wenig Aufwand zu erledigen. Schnelligkeit und selbst Schönheitspreise spielen dabei untergeordnete Rollen, vielmehr zählen Kreativität und technologisches Know-how. Sieger des Wettbewerbs ist in der Regel der Teilnehmer mit dem schlankesten Code und damit derjenige, der die höchste Effizienz und Effektivität an den Tag legt. (siehe auch Golf [Programmierung] bei Wikipedia.de)

Beim Entwicklergolfturnier der //SEIBERT/MEDIA-Programmierer ging es nun stilecht darum, mit einem Programm in einer beliebigen Sprache (wobei möglichst viele verschiedene gewünscht waren) einen ASCII-Weihnachtsbaum auszugeben. Unsere Technologies-Abteilung ließ sich nicht lange bitten, bot sich über Wochen hinweg im //SEIBERT/MEDIA-Wiki einen anregenden und inspirierenden Wettstreit und geizte nicht mit Kommentaren – natürlich mit einer gehörigen Portion Augenzwinkern.

Unser Aufruf: Machen Sie mit und posten Sie eigene Vorschläge als Kommentare

An dieser Stelle laden wir alle Programmierer herzlich ein, sich am Entwicklergolfturnier von //SEIBERT/MEDIA zu beteiligen und eigene Vorschläge einzubringen:

Posten Sie bis zum 31.12.2008 einfach Ihren eigenen Code als Kommentar zu diesem Artikel und gewinnen Sie einen nagelneuen iPod Shuffle!

Den Sieger küren wir nach bestem Wissen und Gewissen per Losentscheid. Welche Programmiersprache Sie verwenden, überlassen wir ganz Ihnen. Der Code muss aber funktionieren.

Gewinnen können Sie natürlich auch, wenn Sie kein Programmierer sind und einfach einen netten Kommentar zu diesem Artikel bzw. zu unserem Blog hinterlassen. In diesem Fall setzen wir Ihre Chancen bei der Auslosung allerdings etwas geringer an. Der Gewinner wird im Januar im //SEIBERT/MEDIA-Weblog bekannt gegeben. Wir sind gespannt auf Ihre guten Ideen und Ihren Input!

In diesem Zusammenhang möchten wir Sie gerne darauf hinweisen, dass wirklich gute Entwickler bei //SEIBERT/MEDIA stets willkommen sind und legen erfahrenen Internet- und Perl-Programmierern unsere ausführliche Stellenbeschreibung wärmstens ans Herz. Bewerben Sie sich!

Effizient und kreativ: Unsere internen Ergebnisse

Nun ist es an der Zeit, den internen Sieger zu küren. Wir gratulieren dem Gewinner Christian zu seinem Vorschlag in Perl 5.10 mit -E Switch:

Darüber hinaus möchten wir Ihnen einige weitere hochwertige und kreative Ideen nicht vorenthalten. Mit diesem Vorschlag in Groovy musste sich Micha knapp geschlagen geben:

Eine ebenfalls sehr schlanke Lösung hat Dennis in Python erarbeitet:

Ein Code in Python

Einige andere Kollegen nahmen es mit dem Code-Umfang wiederum nicht ganz genau, müssten aber eigentlich mit Ehrenpreisen für die kreativsten Ergebnisse bedacht werden. Diesen Schneewald hat Armin in C++ umgesetzt:

Um diese Perl-Weihnachtsbäume zu generieren, sucht das Script von Joachim via Google-Suche ein Zufallsbild aus:

Lösungen wurden unter anderem in den Programmiersprachen Perl, Haskell, (N)ASM, Brainfuck, Vim, Python, Erlang, Groovy, Java, C, C++, C# .net, TCL, Python, XSLT, SVG, SQL, PHP und Ruby eingereicht.

Die rege Betiligung am Entwicklergolfturnier und die durchweg sehr guten Ergebnisse verdanken wir Jonas, Dennis, Micha, Manuel, Tobias, Sven, Maik, Benjamin, Christian, Armin, Joachim, Michael und – außer Konkurrenz – Martin Seibert. Dieser wollte den Technologies-Experten weismachen, dass es offenbar ungeahnte Möglichkeiten hinsichtlich der Ausgabe in ASCII gibt. Den Code ist er allerdings bislang schuldig geblieben. 😉

In diesem Sinne wünschen wir allen Mitarbeitern, Kunden und Lesern eine schöne und sorgenfreie Advents- und Weihnachtszeit und freuen uns auf die weitere erfolgreiche Zusammenarbeit im kommenden Jahr!

Und nicht vergessen:

Unten kommentieren und einen iPod Shuffle gewinnen.

ACHTUNG!
Unsere Blogartikel sind echte Zeitdokumente und werden nicht aktualisiert. Es ist daher möglich, dass die Inhalte veraltet sind und nicht mehr dem neuesten Stand entsprechen. Dafür übernehmen wir keinerlei Gewähr.

41 thoughts on “Entwicklergolf bei //SEIBERT/MEDIA: Alle Programmierer sind eingeladen”

  1. Hier ein kleiner Perl-Beitrag:

    $n=”\e[0;40;32m”;$s=0.5;for(1..10){print”\ec$n$/”.$”x(15).”\e[1;35mY$n”.$”x15;for(1..13){print$/.$”x($b=16-$_);$p=int rand($d=2*$_);for(2..$d){$f=31+int rand(5);print($_-$p?”X”:”\e[$f;1mo$n”)}print$”x$b}print$/.$”x(14).”X”x(2);print$/.$”x(14).qq(X)x(2);print $/.$/.$”x(6).”\e[0m”.”Frohe Weihnachten!!”.$/;select $x,$m,$a,$s}

  2. Sehr gut. Danke. Für die Auswertung, an der ja auch DAUs, wie ich beteiligt sein werden, wäre eine Ausgabe in Ascii oder ein Link zu einem Screenshot cool. Natürlich nur wenn einfach machbar.

  3. Die Lösung in Brainfuck würde mich auch intressieren. Wieviel tausend Zeilen wurden dabei denn benötigt?

  4. Hier mal ein kleiner Beitrag in ANSI-C, das ganze laesst sich wie folgt kompilieren und ist ‘-Wall’ sicher 🙂

    $ gcc christmas-tree.c -o christmas-tree

    #include 
    #include 
    int draw(int x, char *p) {
            if (x > strlen(p)) { printf("%*c%s%c\n", (int)strlen(p), p[0], "|", p[0]); return -1; }
            printf("%*.*s%s%.*s\n", (int)strlen(p), x, p, "|", x, p);
            return draw(x + 1, p);
    }
    
    int main() {
            return (draw(0, "xxxxxxxxxx")<0);
    }
    

    Die Ausgabe des wunderschoenen Baums 🙂 sieht dann so aus:

              |
             x|x
            xx|xx
           xxx|xxx
          xxxx|xxxx
         xxxxx|xxxxx
        xxxxxx|xxxxxx
       xxxxxxx|xxxxxxx
      xxxxxxxx|xxxxxxxx
     xxxxxxxxx|xxxxxxxxx
    xxxxxxxxxx|xxxxxxxxxx
             x|x
    
  5. Aloha. Ich habe mal eben auf die Schnelle rudimentäres PHP-Knowhow aus den etwas verstaubten Tiefen des Unterbewusstseins hervorgekramt, um eine Variante zu erstellen, die vom Ergebnis her zwar wie eine der Gewinnerlösung ausschaut, letztendlich aber (leider) nur durch ein paar zusätzliche Anschläge zustande kommt 😉

    echo ”; $i=0; while($i<40) echo str_repeat(‘x’,$i+=2).””; echo ‘xx’;

    Bessere und effektivere PHP-Lösungen würden mich aber auf jeden Fall interessieren.

  6. Nicht unbedingt effektiver als Steffens, dafür aber ASCII art für die Konsole.
    php -r ‘while($i<42)echo($i+=2)%40?str_repeat(” “,20-$i/2%20).str_pad(“”,$i%40,”#”,2).”\n”:””;’

    anyway, PHP wasn’t made for golfing 😉

  7. Ich hab das Beispiel von mir oben in C nochmal etwas optimiert, den folgenden Einzeiler kann man jetzt einfach ausfuehren (GCC vorausgesetzt).

    echo -e “#include \n#include \nint main() { int x; char *p = \”xxxxxxxxxx\”; for (x = 0; x < strlen(p); x++) { printf(\”%*.*s%s%.*s\\\n\”, (int)strlen(p), x, p, \”|\”, x, p); } printf(\”%*c%s%c\\\n\”, (int)strlen(p), p[0], \”|\”, p[0]); return 0; }” | gcc -x c – -o christmas-tree && ./christmas-tree

    Danach sollte eigentlich ein schoenes Baeumchen erscheinen. 🙂

  8. kein wirklich huebscher baum, aber immerhin 😉

    perl -e ‘@”=split”,”,”H\n,”.(“\\\n,/,”x3).”^\n”;print” “x$_,pop@”for(split””,21111032)’

  9. Beim Eindampfen eines Mehrzeilers bin ich schließlich bei diesem Einzeiler angekommen:

    perl -e ‘$s=25;printf” %${s}s%-${s}s\n”, (“#”x$_)x2 for 0..$s,1,1;’

  10. Der Python-Code lässt sich noch etwas komprimieren:

    for x in range(1,20)+[1]*3: print (‘**’*x).center(42)

    Ein etwas hübscherer Baum in 136 Bytes:

    print ‘\n’.join([‘\n’.join([(‘/%s\\’ % ((‘ ‘*i if i<n else ‘__’*i))).center(40) for i in range(n+1)]) for n in range(4)]+[‘ ‘*19+’||’])

  11. Hier mein Beitrag, nicht ganz so kurz, aber auf das Ergebnis kommt es an…

    for($anzahl = 2; $anzahl <= 28; $anzahl += 2) {
    $text = str_repeat(“*”, $anzahl);
    echo $text . “”;
    }
    echo str_repeat(“||||||”, 3) ;

  12. Entschudligt bitte, das “br” Tag wurde zweimal entfernt,
    Also nochmal mit Entitäten:

    for($anzahl = 2; $anzahl <= 28; $anzahl += 2) {
    $text = str_repeat(“*”, $anzahl);
    echo $text . “<br />”;
    }
    echo str_repeat(“||||||<br />”, 3) ;

    Hoffe jetzt passt es 🙂

  13. #!/usr/bin/perl
    my $h=9;
    for(0..($h-3)){
    printf(“%si%s%s%s%s\n”,’ ‘x($h-3-$_),($_>1)?(‘/’x($_-1)):”,($_>0)?’|’:”,($_>1)?(‘\\’x($_-1)):”,($_>0)?’i’:”);
    }
    print (((‘ ‘x($h-4).’|||’).”\n”)x2);

    Ausgabe:

    i
    i|i
    i/|\i
    i//|\\i
    i///|\\\i
    i////|\\\\i
    i/////|\\\\\i
    |||
    |||

  14. Hier mal ein etwas andere Ansatz in Perl mittels Exponentialfunktion, die aber mit dem internen Sieger mithalten können:

    Hat 2 Vorteile:
    1. Mit der Basis (hier 4) stellt man die Steigung des Baumes nahtlos ein, weil auch Brüche erlaubt sind.
    2. Ersetzen der Zahlenmuster taugen für Texturen wie Baumschmuck.

    Ich habe in den Grafiken die Leerzeichen mit . ersetzt, um sie darstellen zu können (bitte letzten Post löschen)

    ____________________

    .35Bytes: printf”%20d%d\n”,(4**$_)x2for 1..17
    .
    ………………..44
    ……………….1616
    ……………….6464
    ………………256256
    ……………..10241024
    ……………..40964096
    …………….1638416384
    …………….6553665536
    ……………262144262144
    …………..10485761048576
    …………..41943044194304
    ………….1677721616777216
    ………….6710886467108864
    …………268435456268435456
    ………..10737418241073741824
    ……………….-1-1
    ……………….-1-1
    .____________________
    .
    .35Bytes: printf’%20d%1$d’.$/,4**$_ for 1..17
    .
    ………………..44
    ……………….1616
    ……………….6464
    ………………256256
    ……………..10241024
    ……………..40964096
    …………….1638416384
    …………….6553665536
    ……………262144262144
    …………..10485761048576
    …………..41943044194304
    ………….1677721616777216
    ………….6710886467108864
    …………268435456268435456
    ………..10737418241073741824
    ……………….-1-1
    ……………….-1-1
    .____________________
    Geschmückter Baum, lässt sich noch optimieren…
    .57Bytes: ($x=4**$_)=~y/1-9/”/,printf”%22s%s\n”,($x)x2for 1..20,0,0
    .
    ………………….””
    …………………””””
    …………………””””
    ………………..””””””
    ……………….”0″””0″”
    ……………….”0″””0″”
    ………………””””””””””
    ………………””””””””””
    ……………..””””””””””””
    …………….”0″”””””0″””””
    …………….”””””0″”””””0″
    ……………””””””””””””””””
    ……………”””0″””””””0″”””
    …………..””””””””””””””””””
    ………….”0″””””””””0″”””””””
    ………….””””””””””””””””””””
    …………””””””””””””””””””””””
    …………””””””””””””””””””””””
    ………..”””””””0″””””””””””0″”””
    ……….”0″”””””””””””0″””””””””””
    ………………….””
    ………………….””
    .____________________
    .

  15. Also Proportionalschrift ist noch ein anderes Problem …

    *TIP*
    Alle missglückten Grafiken lassen sich im Firefox einigermaßen entschlüsseln indem man sie selektiert und per Rechtsklick auf “Quelltext anzeigen” geht!

  16. Danke für die Nachfrage. Der Gewinner ist bereits ausgelost, informiert und nimmt den Preis auch an. Allerdings hat er angeboten, selbst einen Blog-Artikel als Gastbeitrag bei uns zu veröffentlichen und wir werden die Bekanntgabe auch im Weblog durchführen. Daher bitten wir noch um ein bisschen Geduld.

  17. Ja, aus meiner Sicht gab es keinen einzigen “Einreicher”, den ich herausgenommen hätte. Anhand welcher Kriterien hätte die Auswahl stattfinden sollen? Ganz abgesehen davon, war es auch so angekündigt: “Den Sieger küren wir nach bestem Wissen und Gewissen per Losentscheid. “

  18. Ok, Losentscheid sehe ich heute zum erstenmal, Golfing hört sich halt nach Minimierung der Zeichen und nicht nach Tombola an!

    In einem nachvollziehbaren Verfahren hätte man:

    1. Korrekte Ergebnisse auswählen müssen.
    2. Diese lokal nachvollzogen.
    3. Den oder die Kürzesten gekürt.
    (4. evntuell bei mehreren Gewinnern den Hauptgewinn gelost)

    Das ist zugegeben deutlich aufwändiger als Losen… zu blöd dass ich’s übersehen habe… mea culpa!

  19. Kein Problem. Sinn der Sache war allerdings nicht den Aufwand einzusparen, auch wenn die Mitarbeiter, die den Weblog betreiben, eher weniger Programmierkenntnisse haben. 🙂

    Nur Kürze finde ich nicht sinnvoll und hat auch bei uns intern nicht die coolsten Ergebnisse vorgebracht. Es geht ja um den Spass und die Originalität. Die können natürlich aus der Kürze entstehen. Aber die Lösung meines Bruders, die nach einem Zufallsbild bei Google sucht und dann in Asci einen Baum daraus generiert, fand ich schon ziemlich cool.

    Zudem gibt es Programmiersprachen, die für reine “Kürze” nicht geeignet sind. Die hätten dann gar nicht teilnehmen können, oder?

    Ich find’s okay so. 🙂

  20. Fürs Protokoll: Der kürzeste Code war IMHO in J, allerdings habe ich noch nie von J gehört, und wenn *jede* Sprache erlaubt ist, dann schlag ich eine 1 Byte-Lösung in XMAS vor! XMAS ist eine zu entwickelnde “Sprache” die nur einen Befehl kennt, nämlich T für “Tree” und dann einen Weihnachtsbaum zeichnet.

    > Nur Kürze finde ich nicht sinnvoll und hat auch bei uns intern nicht die coolsten Ergebnisse vorgebracht.

    Der gekürte interne Sieger war aber der kürzeste, nicht der coolste!

    > Zudem gibt es Programmiersprachen, die für reine “Kürze” nicht geeignet sind. Die hätten dann gar nicht teilnehmen können, oder?

    Die Wahl der Sprache war dem Entwickler ja auch freigestellt! Anders gefragt: die interne Pythonlösung ist die minimalst mögliche in dieser Sprache, wieso bekam sie keinen Preis “zugelost”?

    Golfing heißt laut verlinkter WP-Seite “Gewinner ist der Programmierer, der für die erfolgreiche Lösung des Problems den kleinsten Quellcode…”

    ich zitiere mal den zwoten Absatz hier:

    “Beim Golf auf dem Rasen gewinnt der Spieler, der die wenigsten Schläge zum Einlochen benötigt. Daran orientiert sich auch der Golfwettbewerb unter Entwicklern: Ziel ist es, eine bestimmte Programmieraufgabe mit möglichst wenig Aufwand zu erledigen. Schnelligkeit und selbst Schönheitspreise spielen dabei untergeordnete Rollen, vielmehr zählen Kreativität und technologisches Know-how. Sieger des Wettbewerbs ist in der Regel der Teilnehmer mit dem schlankesten Code und damit derjenige, der die höchste Effizienz und Effektivität an den Tag legt.”

    Sach mal, dein Schwerpunkt liegt eher im Verkauf als in der Technik, oder?

  21. Jep, vollkommen richtig. 🙂

    Es mag sein, dass der Text etwas missverständlich zu Beginn ist. Trotzdem haben wir von Beginn an vorgehabt zu losen, haben es so geschrieben und so gemacht.

    Mir bleibt eigentlich nur, mich auf Deine neue Programmiersprache “XMAS” zu freuen. 😀

  22. Da J zumindest ne Webseite und einen Wikieintrag hat, will ich mal hoffen dass Martin Neitzel ausgelost wurde…

  23. Nach 10 Tagen Luft anhalten Gruesse von mir an anderen Teilnehmer und ein paar Anmerkungen:

    Ich finde die LanX-Loesungen ganz toll! Wahres Hackertum in Reinkultur, das auch alle meine Kollegen sehr erfreut hat.

    Wenn ich alles richtig verglichen habe, ist mein J Code tatsaechlich sehr sehr kurz, aber “Auslosen” halte ich
    auch fuer ein adaequates Verfahren: So sind am meisten Leute eingeladen mitzumachen, und zwar auch mit Ansaetzen, die absehbar nicht die kuerzesten Ergebnisse leifern koennen, dafuer aber vielleicht schoen perverse.
    Vielen Dank zum Beispiel fuer die “Assembler-Quetschungen”! Es ist so lange her, dass ich selbst mal Assembler gemacht habe, dass ich gar kein Gefuehl mehr dafuer habe, wie lang sowas auf diesem Weg wird. Schoen, das mal wieder sehen zu koennen.

    Auch schoen: Die vielen Beitraege, die das bekannte Verfahren einfach nur uebernommen und andere Sprachen uebertragen haben. Das ist immer eine gute Gelegenheit, mal ein bisschen quer zu gucken und evtl. auch die Scheu zu verlieren, eine der noch unbekannten Sprachen anzugehen. So etwas geht ja IMMER irgendwie auf der Ebene “Hello World!” oder eben “Weihnachstbaum” los.

    Ich habe vom Wettbewerb uebrigens ueber eine der Newsgroups (de.comp.lang.misc?) Ende Dezember mitbekommen — vielen Dank an den Poster des Hinweises!

    Und zu guter letzt:

    Zusammen mit einem Kollegen fand ich letzte Woche einen weiteren Ansatz in J, der noch mal 4 Zeichen kuerzer ist. See you next year 🙂

  24. > “Ich finde die LanX-Loesungen ganz toll! Wahres Hackertum in Reinkultur, das auch alle meine Kollegen sehr erfreut hat.”

    Allerdings!

    > aber “Auslosen” halte ich
    auch fuer ein adaequates Verfahren: So sind am meisten Leute eingeladen mitzumachen, und zwar auch mit Ansaetzen, die absehbar nicht die kuerzesten Ergebnisse leifern koennen, dafuer aber vielleicht schoen perverse.

    Eine Abstimmung der Beteiligten wäre noch besser … so bleibt der schale Nachgeschmack einer Onlinemarkingaktion mit BWLer-Floskeln!

  25. Der Vorwurf ist nicht auszuräumen. Das ganze ist eine Online-Marketing-Aktion mit BWLer-Floskeln. 😀

    Beim nächsten Mal werden wir mal schauen, ob wir einen Entwickler zur Organisation überreden können. Ansonsten müssen wieder die BWLer mit ihrem Blabla für die Orga herhalten. Ich hoffe, dass Du trotzdem dabei sein wirst.

Schreibe einen Kommentar