2011年1月25日火曜日

[Perl] FizzBuzz Code Golf

FizzBuzz の Code Golf サイトを会社の方経由で見つけたので、不意に Perl でやってみました。

まず普通にやってみる。(64 bytes)
print$_%15?$_%3?$_%5?$_:"Buzz":"Fizz":"FizzBuzz","\n"for(1..100)

ダブルクォートとFizzの重複を消してみる。(57 bytes)
print$_%3?$_%5?$_:Buzz:Fizz,$_%15?"":Buzz,"\n"for(1..100)

Buzzの重複を消してみる。(56 bytes)
print(($_%3?"":Fizz).($_%5?"":Buzz)||$_,"\n")for(1..100)

3項演算子に無駄があるので削ってみる。(52 bytes)
print((Fizz)[$_%3].(Buzz)[$_%5]||$_,"\n")for(1..100)

for のカッコを削ってみる。(51 bytes)
print((Fizz)[$_%3].(Buzz)[$_%5]||$_,"\n")for 1..100

頑張ってみたけどここで限界…。
"\n" と for の間のカッコは外せるけど、print が正しく動かなくなってしまう。
48 bytes が 1 位ってどんなコードなんだろうか。。

----- 2011/01/25 追記 -----

どうやらこれが 48 bytes のコードのようです!
print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..100
なるほど、"\n" をセパレータ変数の $/ にしつつ、print() のカッコを無くして + で逃げる。
ここから更には厳しそうですねぇ…

4 件のコメント:

Unknown さんのコメント...
このコメントは投稿者によって削除されました。
Unknown さんのコメント...

面白いですね。
Perl 6なら say 使えば 減らせますね。
手元に試せる環境無いのですが、
正規表現使ったらもっと減らせるかも?
あと、eval使ってコードを生成しちゃうとかですかね?

匿名 さんのコメント...

"\n"は$/で置き換えられると思います

ytk さんのコメント...

更なる縮小コードを追記しておきました。
ひらめきが大事ですね。