gotin blog

Whatever gotin wanna write

FizzBuzz

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。

どうしてプログラマに・・・プログラムが書けないのか?

↑この記事が発端?で、FizzBuzzプログラムをいかに短く書くのか、というのが流行ってる?ようです。
ということで僕も考えてみました。最初に思いついたのはこれ↓

for(i=0;i++<100;)print((i%3?"":"Fizz")+(i%5?"":"Buzz")||i)

58文字。

でも()がたくさんあるのと""って二回も書くのが無駄な気がするけどどうにかならんかなぁと悩んだあげく思いついたのがこれ↓

for(i=0;i++<100;print(i%5?x||i:x+"Buzz"))x=i%3?"":"Fizz"

56文字。

2分とかからず書き出すなんて無理でしたけどね。余裕で1時間ぐらいは試行錯誤してしまった気がするです。

ん?ちょっと待て、printってなんだ?って思いますよね。java6にも搭載されてるrhinoのシェルにあらかじめ定義されているプロンプトに出力する関数だったり、
gotinの日記 - twitter_liteでtwitter検索
↑とかで紹介している自作twitterクライアントtwitter_litejavascript機能を使ったときに出力処理をするための関数です。
twitter_liteの入力欄なら

:js for(i=0;i++<100;print(i%5?x||i:x+"Buzz"))x=i%3?"":"Fizz"

と打てば実行できます。
実際今回の試行錯誤もtwitter_liteでがんばりました。ちなみに

:keep js

と打っておくと普段なら普通に文字入力するとtwitterに投稿するところを、毎回":js "を追加して処理するようになって、javascriptといつまでも戯れていられます。
もどすときは

:keep twit

で。
ん?それならrhinoで試せばいいじゃんって感じすね。。。

ちなみに間違ってもHTMLに張り込んだり、Firebugでそのまま試そうとしないでください。印刷しまくろうとしちゃいますから。