LoginSignup
4
3

More than 5 years have passed since last update.

Enumerator::Lazyを使ってFizzBuzz

Posted at

FizzBuzz流行っているようだったので、、、
lazyを知った時に使い方を覚えたくて、FizzBuzzに応用してみた事があります。
その時のコードにキャッシュ機能を追加したバージョンを載っけてみます。
変態度は0。

class FizzBuzz
  def initialize(n)
    @fizzbuzz = (1..n).lazy.map{ |i| fizzbuzz i }
    @cache = []
  end

  def first(n = 1, cache: true)
    return @fizzbuzz.first n unless cache
    add_cache n
    @cache.first n
  end

  def at(n, cache: true)
    return if n > @fizzbuzz.size
    add_cache n if cache
    fizzbuzz n
  end

  def to_s
    @cache.join(',')
  end

  private

  def add_cache(n)
    if n > @cache.size
      @cache.concat @fizzbuzz.drop(@cache.size).first n - @cache.size
    end
  end

  def fizzbuzz(i)
    {0 => i, i%3 => 'Fizz', i%5 => 'Buzz', i%15 => 'FizzBuzz'}[0]
  end
end

fizzbuzz = FizzBuzz.new 15
p fizzbuzz.first 10 # => [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz"]
p fizzbuzz.at 15    # => "FizzBuzz"
p fizzbuzz.at 20    # => nil
puts fizzbuzz       # => 1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz

fizzbuzz = FizzBuzz.new 15_000
p fizzbuzz.first 10, cache: false   # => [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz"]
p fizzbuzz.at 15_000, cache: false  # => "FizzBuzz"
puts fizzbuzz                       # =>
4
3
0

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
4
3