1. Munich Perl Mongers Perlgolf-Wettbewerb

Aufgabenstellung

Gesucht wird das kürzeste Programm, das die zwei jeweils nächsten Termine (jeweils der dritte Mittwoch in ungeraden Monaten) der MPM-Treffen korrekt im ISO8601-Datumsformat yyyy-mm-dd ausgibt.

Das Programm muss die Daten bis einschliesslich des Jahres 2037 korrekt ausgeben. Ob ein Termin am Tag der Programmausführung noch ausgegeben wird, bleibt freigestellt, weil ich vergessen habe, das zu definieren und zwei der Einsendungen sich schon unterschiedlich verhalten haben. Vielleicht sind inzwischen sogar wieder alle gleich?

Vielen Dank an Christoph Stock für die rechtzeitige Lieferung der Testsuite!

Die Kandidaten

1. Platz: Jens - 101 Zeichen

($/,$%,$.,$-)=(gmtime($^T+=86400))[3..6]while($/-18)/4|$%%2|$--3||++$"&printf 1900+$.."-%02d-$/\n",++$%

Alles in einer Berechnung. Nett.

2. Platz: Sec - 104 Zeichen

($a,$;,$_,$f)=(gmtime($^T+=86400))[3..6],/1/,$p+=++$;&$f==3&4>abs$a-18&&printf"20$'-%02d-$a\n",$;while$p<2

Besonders hübsch ist die Idee, mit $_, /1/ und $' die 1900 zu vermeiden. Damit ließe sich der erste Platz um ein weiteres Byte kürzen!

3. Platz: Christoph&Jörg - 110 Zeichen

($d,$-,$y,$_)=(gmtime$i++*86400+$^T)[3..6],++$-%2&/3/&$d>14&$d<22&&++$c&printf"%d-%02d-$d\n",$y+19e2,$-while$c<2

Zuviel Scheu vor dem Verändern von $^T?

4. Platz: Eike - 114 Zeichen

$#='%03g';@d=localtime($^T+=86400),$d[6]-3|$d[4]++%2|$d[3]/7.2%3-2||++$c&&print$d[5]+1900,-$d[4],-$d[3],$/while$c<2

Die Verwendung von localtime ist zu anständig in diesem Gewerbe, aber die Idee mit $# verdient Respekt! Das Array anstelle der einzelnen Werte wäre eine andere Möglichkeit, ein Byte aus dem ersten Platz rauszuknautschen, kann aber leider nicht mit Secs Trick kombiniert werden.

Neko: 130 Zeichen

while($c<2){@t=gmtime$^T+$a*86400;$a++;next if$t[6]!=3|$t[3]<15|$t[3]>21|$t[4]%2;
$c++;printf"%d-%02d-%d\n",$t[5]+1900,$t[4]+1,$t[3];}

Das gibt den Sonderpreis für lesbaren Code!


Nachgereicht

Sec - 103 Zeichen

(@q=gmtime($^T+=86400))[5]=~1,$p+=++$q[4]&$q[6]==3&4>abs$q[3]-18&&printf"20$'-%02d-%d\n",@q[4,3]while$p<2

Auch hübsch, einen Array slice hatten wir noch nicht.

Verantwortlich: Harald Jörg, E-mail: haj.perl-mongers@arcor.de
The use of the camel image in association with the Perl language is a trademark of O'Reilly & Associates, Inc. Used with permission.