今さらFizzBuzz

なんかへんなの流行ってるなとスルーしてたけどこういう煽りがあったのか。
どうしてプログラマに・・・プログラムが書けないのか?

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

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


こういうふうに言われると書いたる!という気になりますね。


まぁ2分でと言われるとPerlでこんな感じかな。

for(1..100){
  $_%3 or print "Fizz";
  $_%5 or print "Buzz";
  $_%3 && $_%5 and print;
  print "\n"
}

(いろいろ余計なこと考えちゃって2分じゃできてなかった・・・)


拡張性というのを少しだけ考えてみるとこんな感じかな。さらに7の倍数で「Mikeda」、というのが簡単にできる。

@keys = (3,5,7);
@values[@keys] = ("Fizz","Buzz","Mikeda");

for $i (1..100){
  $out="";
  for $key (@keys){
    $out .= $values[$key] unless $i % $key;
  }
  print $out ? $out : $i, "\n";
}

@valueのメモリのムダ使い、出力文字列に0や空文字列を指定できない、とか、もちろん直しませんが。




で、この後にもっとシンプルにワンライナで、と考えたわけですが・・・
まぁまず3項演算子つなげるか、と思ったところで息抜きがてらググってしまったのがよくなかった。
ひおにっき

perl -le 'print+(Fizz)[$_%3].(Buzz)[$_%5]||$_ for 1..100'

ちょwwwww 勝てねえwwww



ついでに最初に書いたのはこんなのと3項演算子のも書かれてる。

perl -le 'print $_%15==0 ? "FizzBuzz" : $_%5==0 ? "Buzz" : $_%3==0 ? "Fizz" : $_ for 1..100'

みんな最初に考えることは同じか。自分の考えてたのに「==0」はなかったけど。ぐっと読みづらくなりますが。

$ perl -le 'print $_%15 ? $_%5 ? $_%3 ? $_ : "Fizz" : "Buzz" : "FizzBuzz" for 1..100'