2007年05月10日

FizzBuzzプログラムを書くのが流行っているみたいなので、空気を一切読まずに乱入した。

現在のPerl最短記録はTAKESAKOさんの56byteらしい。
こんなコード

perl -e'die+map{(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/}1..1e2'

まず、元の翻訳文章には「FizzやBuzzや数字のみを出力せよ」とは書いてない事に気づいたので、warnで出してみた。

perl -le'warn((Fizz)[$_%3].(Buzz)[$_%5]||$_)for 1..100'
55byteになった。

次に1から100迄の数値のソースは、別にプログラム側でもっていなくても良い事に気づいたので、これを外だししてみた。
とにかく目的の文字列が出てくればいいのだ。

head -n100 /dev/random|perl -lne'$i++;warn((Fizz)[$i%3].(Buzz)[$i%5]||$i)'
おおすごい!15byte節約に成功して40byteになった!

そういやperl6からsayってのが使えるよね、warnより短くて余計な文字列でないし標準出力でだせるよ!

head -n100 /dev/random|perl -MPerl6::Say -ne '$i++;say((Fizz)[$i%3].(Buzz)[$i%5]||$i)'
39byteになった!

よく考えたら先頭の$i++;いらなくね?

head -n100 /dev/random|perl -MPerl6::Say -ne 'say((Fizz)[++$i%3].(Buzz)[$i%5]||$i)'
36byte!

なんかファイルハンドルの行数取れるやつあったよなぁ、、、$.だっけ?

head -n100 /dev/random|perl -MPerl6::Say -ne 'say((Fizz)[$.%3].(Buzz)[$.%5]||$.)'
sugoi! 34byte!!!!

もう本当にこれが限界じゃないのかしら。

本当はcpan install Acme::FizzBuzzして

perl -MAcme::FizzBuzz -e ''
ってやれば0byteで目的達成するんだけどね。

Posted by Yappo at 2007年05月10日 04:40 | TrackBack | Perl
Comments

head -n100 /dev/urandom|perl -MPerl6::Say -ne 'say+(Fizz)[$.%3].(Buzz)[$.%5]||$.'

Posted by: もう一バイト! at 2007年05月10日 10:07

結局こういうこと(より少ないバイトにするとか)で苦労してるんじゃないの?

かなりの試行錯誤の末に、コードを書こうともがいている人たちというのは、単に大きな問題に対して苦労しているのではないことがわかった。やや小さな問題(連結リストを実装するというような)に対して苦労するということでさえない。彼らはまったくちっぽけな問題に苦労しているのだ。

Posted by: at 2007年05月10日 11:37

-pl 使ったほうが短くなりません?

head -n100 /dev/random|perl -ple'$_=(Fizz)[$.%3].(Buzz)[$.%5]||$.'

Posted by: kazuho at 2007年05月12日 09:37

このコードだったらかなり軽量化できました。これ以上短くなくても充分でしょう。

Posted by: カリビアン at 2007年05月24日 04:37
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。