Ruby
FizzBuzz

素因数分解を使ったテクくもない遠回りFizzBuzz with Ruby

コード

https://paiza.io/projects/G9B46N0llqn6LCftv0xQpA

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触れて楽しい。

参考

他いくつもFizzBuzz見ましたが、「3と5(と15)をいかに見つけるのか」はFizzBuzz遊びとはちょっと違うのかなと調べていて思ったり。
「もっと短く」や「もっと奇想天外」に、な方面が良さそうですね。


  1. 今回n時間レベルなんで…。
    普段・普通でも3分はしんどそう。 

  2. こちらが汚いコードという意味ではないです。