@lchin: "FizzBuzz、4年前に飽きたわー"って誰かまだ言っていないか?あくまで省力化のための足切りとしてのものだけど、出まわりすぎた時点でかなり効果が低下しているはずだ。まぁ、採用基準よりも「不採用基準」として使うだろう
http://twitter.com/#!/lchin/status/124138347819053058
こういう話が上がっていたので,FizzBuzz より複雑で,でも簡単にかけるものは何か考えた.確かにFizzBuzzはわたしも__コードを暗記してるようなものだし__,そろそろ時代遅れなのではないかと思った.
FizzBuzz... Fizz... Fib... FibBuzz... ということで FibBuzz という言葉が思いついた.
Fib はフィボナッチ数列を求めるメソッドなどでよく使われる名前というか略称.Fibonacci の頭文字になる.つまり,ルールはこうだ
FibBuzz
FibBuzz: フィボナッチ数を1番目から順番に列挙していく.ただし,3で割り切れるならFizz, 5で割り切れるならBuzz, 3と5両方で割り切れる場合はFizzBuzzを出力する事.3と5どちらも割り切れない場合はそのまま出力して良い.
(実際に問題にするときは100まで等と制限をつけましょう)
ゴルフ
shinhさんのゴルフ場 に問題を作成しました.
http://golf.shinh.org/p.rb?FibBuzz
ゴルフはコードをなるべく短くするスポーツです.詳細はぐぐってください.
FibBuzz 実装例 (Ruby)
100 までの FibBuzz.
puts (1..100).inject([1,1]){|s| s<<s[-1]+s[-2] }.map{|i| i%15==0 ? "FizzBuzz" : i%3==0 ? "Fizz" : i%5==0 ? "Buzz" : i }
BuzzFib
初期の FibBuzz のルールはこうだった:
BuzzFib: 1から数を列挙していく.それがフィボナッチ数ならFib, 5で割り切れるならBuzz, その両方ならBuzzFib, その両方でもない場合はその数を出力してください
同じように100まで等と制限をかけましょう.実際は.
これは後述する理由で FibBuzz とは別にした.
BuzzFib の実装例 (Ruby)
100 までの BuzzFib.
puts (1..100).inject([[1,1],[]]){|(s,r),n|[s<<s[-1]+s[-2],r<<((_="#{s.include?(n)?:Fib:""}#{n%5==0?:Buzz:""}").empty?? n:_)]}[-1]
ゴルフ
BuzzFib のゴルフ問題も作成した.
http://golf.shinh.org/p.rb?BuzzFib
経緯
フィボナッチ数 + FizzBuzz は楽しそうだなーとルールを考え, 最初,上記のBuzzFibのルールを考えてFibBuzzを定義したのだけど…
このルールだとちょっと複雑というかそれ以前に結果が
["Fib", "Fib", "Fib", 4, "FibBuzz", 6, 7, "Fib", 9, "Buzz", 11, 12, "Fib", 14, "Buzz", 16, 17, 18, 19, "Buzz", "Fib", 22, 23, 24, "Buzz", 26, 27, 28, 29, "Buzz", 31, 32, 33, "Fib", "Buzz", 36, 37, 38, 39, "Buzz", 41, 42, 43, 44, "Buzz", 46, 47, 48, 49, "Buzz", 51, 52, 53, 54, "FibBuzz", 56, 57, 58, 59, "Buzz", 61, 62, 63, 64, "Buzz", 66, 67, 68, 69, "Buzz", 71, 72, 73, 74, "Buzz", 76, 77, 78, 79, "Buzz", 81, 82, 83, 84, "Buzz", 86, 87, 88, "Fib", "Buzz", 91, 92, 93, 94, "Buzz", 96, 97, 98, 99, "Buzz"]
こんな感じ.
見て分かる通り,Fib が少なすぎる.
理由は fib(12) の段階で fib(12) > 100 を満たしてしまう.つまりフィボナッチ数列のほうが変化が大きいため Fib が少なくなってしまう.
これじゃ見栄え悪いし,しかもちょっと複雑すぎるなぁと思って,冒頭のルールを最終的に自分の中で fibbuzz として,このルールは buzzfib とすることにした.
よければ自分の好きな言語で fibbuzz, buzzfib をといてみてください.