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.