コード
require 'prime'
(1..100).each do |n|
output = ''
divided_n = n.prime_division.map {|p,n| p }.uniq
# 上限未指定ならテスト環境タイムアウトで完了しない。
# 3と5を隠蔽してみようかと無駄な遠回りを試みたものの、結局上限値指定each(5)で5が出てくるか、
# each.take(3)で3は素数を表してはいないけれどどちらかが出て微妙
prime_list = Prime.each.take(3).to_a
# 無駄が多いループだけど、100以下が持つ素数なんて最大3回でしょという怠慢
divided_n.each do |p|
if prime_list.index(p) == 1 then
output += 'Fizz'
next
elsif prime_list.index(p) == 2 then
output += 'Buzz'
break
end
end
# エルビス演算子なさそうで、||はnull確認なので+=の連結とcollision…
puts(output == '' ? n : output )
end
雑記
どうもFizzBuzzが書けないプログラマ人です。
奇跡的に書けても(就職試験に間に合わないだろうほど)時間がかかります。1
また出力を3回呼び出すきれいなコードではなく、必ず文字列を連結するコードになってしまいます…。2
今回は素数に3と5があるなとふと思い、素因数分解デフォルトでできる言語ないかなと調べたらRubyにあったので書いてみました。
改めて自分に資質が無いことが浮き彫りになるのでFizzBuzz嫌い…
なおFizzBuzzは「如何に正解を見ずに先達が居ないか探す」ことが面白難しいと思いました。
コレだけのコードですがRuby触れて楽しい。
参考
- library prime (Ruby 2.2.0)
- Rubyで素数で遊ぶ(prime モジュール) - Qiita
-
RubyのPrimeクラスを使う - Qiita
両方すごく、丁寧。 -
不適切の、不適切による、不適切のための『FizzBuzz』結果発表!|CodeIQ MAGAZINE
素因数分解を使った美しい方のコードがある -
FizzBuzz Checker - JSFiddle
結果に普通に自信が持てない
他いくつもFizzBuzz見ましたが、「3と5(と15)をいかに見つけるのか」はFizzBuzz遊びとはちょっと違うのかなと調べていて思ったり。
「もっと短く」や「もっと奇想天外」に、な方面が良さそうですね。