Skip to content

Instantly share code, notes, and snippets.

@hanachin
Last active December 14, 2015 04:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hanachin/5028247 to your computer and use it in GitHub Desktop.
Save hanachin/5028247 to your computer and use it in GitHub Desktop.
FizzBuzz in ruby 2.0
#!/usr/bin/env ruby
class FizzBuzz
include Enumerable
def label(n)
@label_definitions.lazy.select {|label, denominator|
n % denominator == 0
}.map(&:first).first
end
def fizzbuzz(n)
label(n) || n
end
def initialize(label_definitions = {fizzbuzz: 15, fizz: 3, buzz: 5})
@label_definitions = label_definitions
end
def each
(1..Float::INFINITY).lazy.each {|n|
yield fizzbuzz(n)
}
end
end
limit, fizz, buzz = ARGV.map(&:to_i)
limit ||= 100
fizz ||= 3
buzz ||= 5
puts FizzBuzz.new(fizzbuzz: fizz.lcm(buzz), fizz: fizz, buzz: buzz).take(limit)
@hanachin
Copy link
Author

{fizzbuzz: 15, fizz: 3, buzz: 5}

のような感じでlabel: xと書いておくとxでnが割り切れた時はlabel、そうでないときはxを返してくれるソレです。
FizzBuzzクラスといいつつやってることちょっと違うしアレかなと思いつつ書いた。

@hanachin
Copy link
Author

fizz * buzz

これだとfizz = 4、buzz = 6のときなど、最小公倍数12のときにfizzbuzzが出ないんじゃね?と突っ込まれたので

fizz.lcm(buzz)

に直しました。

@hanachin
Copy link
Author

キーワード引数使って

  def initialize(fizz: 3, buzz: 5)
    @label_definitions = {fizzbuzz: fizz.lcm(buzz), fizz: fizz, buzz: buzz}
  end

してもいいかもしれないですね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment