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 # =>