LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-18

コード

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. こちらが汚いコードという意味ではないです。 

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0