2012年1月8日日曜日

fizz-buzz challenge


以下の記事を読んでいて、初めて見る単語「fizzbuzz問題」。
Scala的な考え方 - Scalaがとっつきにくいと思っている人へ
こういうものらしい。

http://ja.wikipedia.org/wiki/Fizz_Buzz
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードがかけないプログラマ志願者を見分ける手法を Jeff Atwood が FizzBuzz問題 (FizzBuzz Question)として提唱した。その提唱はインターネットの様々な場所で議論の対象になっている。
また、実際に「制限時間2分以内」「剰余(%記号等)を用いない」「1行でできる限り短く(ワンライナー)」等の縛りでゲーム条件を満たすコード記述の腕試しをする者が続出した。

その場で、自分で書いてみたコードは以下。
工夫点は、「3で割り切れる」というロジックと「5で割り切れる」というロジックが重複するので、その結果をキャッシュしたというだけヽ(`Д´#)ノ

調べてみたら、"FizzBuzz" = "Fizz" + "Buzz"であることを利用して短くまとめている回答もメジャーのよう。javaだとこんな感じ。


しかし、圧巻はPerl。短いなあ。$_で直前に評価した値が参照できる点が効いてるのか。



以下のページがよくまとまってて、引用させていただいた。
Fizz Buzz Test

しかし、中にはスタックトレースでFizzBuggする変態さんもいるようでw


Javaでちゃんと数字も表示されるFizzBuzz書いた

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javaapplication1.FizzBuzzNewClass.main(FizzBuzzNewClass.java:18)
Caused by: java.lang.StackOverflowError

at 8911.fizzbuzz(FizzBuzzNewClass.java:80)
at 8910.number(FizzBuzzNewClass.java:32)
at 8909.number(FizzBuzzNewClass.java:40)
at 8908.fizz(FizzBuzzNewClass.java:58)
at 8907.number(FizzBuzzNewClass.java:34)
at 8906.buzz(FizzBuzzNewClass.java:75)
at 8905.fizz(FizzBuzzNewClass.java:56)
at 8904.number(FizzBuzzNewClass.java:34)

ちなみに、この記事Hacker Schoolには、FizzBuzzCodeを応募時に貼付けさせている。

このボリューム、間違いなく3日坊...

0 件のコメント:

コメントを投稿