FizzBuzzの仕様

しばらく前に盛り上がってた(私はid:sumimさんとこ経由で見た)FizzBuzz問題がまた盛り上がってる。青木靖さんがこの問題を引用しているCODING HORRORの記事を翻訳してくれたからなのだが。
各地の反応がそれぞれ面白すぎるのと、ゴルフコンペがたくさん開催されてるのが素晴らしいんだけど、そのへんはカレーにスルーしてこれを取り上げまーす。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。

ちゃんとしたプログラマであれば、この要求が曖昧であることを指摘するだろう。「3と5両方の倍数」は「3の倍数」でもある。としたら、3の倍数のときには「FizzFizzBuzzの両方」を出すべきか?それともFizzを出すのは「3の倍数であって5の倍数でないとき」なのか?

あああ、実に結城さんらしい(というかid:textfileさんらしい)指摘だなああ。プログラマたるもの、常に仕様が曖昧な箇所に気を配らなくてはならない。でも前に自分でやったときには気になんなかったな。これが何を意味するのか? 即ち、私は(指摘しなかったので)ちゃんとしたプログラマではない(対偶)ということだ!
それはそうかも..というか別に証明しなくてもそうなんだけど、かなしいのでこの翻訳記事の原文の、さらに引用元まで行って見てみると:

Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".

この書き方だと、3の倍数のときに"Fizz"と"FizzBuzz"の両方を出す、という解釈をするのは難しいということがわかる。3の倍数のときと5の倍数のときの挙動を記述して、次の文はその条件の下で3と5の両方の倍数だったときはこうなるというのを解説してる、と解釈するのがまあ自然かと。翻訳では、3と5と両方と、って3つの条件が並列してる感じになっちゃったのがよくなかったんだね。
もちろん原文の方も全く曖昧じゃないというわけじゃない。なんで"BuzzFizz"じゃなくて"FBiuzzzz"とかでもなくて"FizzBuzz"にしなきゃいけないのかとか5の倍数のときは数字はどうするのかとか。でもそれをこれ以上詳しく書こうとしていろいろ厳密にしていくと、プログラムになってしまう^^;。インタヴューには向かないんじゃないかと。だからしゃーないというか。