[Moscow.pm] YAPC::Russia Perl Golf 2009

Eugene Ardarov spleenjack на gmail.com
Вс Май 24 10:29:09 PDT 2009


> В этой и всех предыдущих после фикса с if/o/ версиях -- баг. Проявляется
> только если в левом верхнем углу 1 и первым же шагом мы съедаем 1.
> Фикс такой:
>
> #!perl -naF
> map{/[h-l]/?do{$;[$n]=o;push на p,$n;$;[$p[$t+=$;[$n+=$$_]!=1]]=~s/o/-/;$;[$n]=x}:do{$k-=$j=@F,$h--,$n=@;if/x/;$p[/o/]=@;;$l=1;push@;,$_}}@F}{pop@;;print@

Соптимайзил до такого (-3 символа):

#!perl -naF
map{/[h-l]/?do{$;[$n]=o;push на p,$n;$;[$p[++$t]]='-'if$;[$n+=$$_]!=1;$;[$n]=x}:do{$k-=$j=@F,$l=!$h--,$n=@;if/x/;$p[/o/]=@;;push@;,$_}}@F}{pop@;;print@

Т.е. убрал замену через s///, вытащил прирост головы $n и проверку на
яблоко в пост-условие, сделав обычный инкремент для $t, а присваивание
$l единицы сделал как $l=!$h--.
Врубился наконец, как работает print@ в конце - только при условии
перевода строки после этой конструкции. Тут просто вопрос какой: как
считаем размер кода? Простым размером в байтах, или как-то по-другому?
Просто если байтами - то смысла в print@ с переводом строки нет -
можно добавить точку с запятой.

Извиняюсь, что поднимаю уже мертвого слона, но интерес еще не пропал :)


Подробная информация о списке рассылки Moscow-pm