条件文を使用しない*FizzBuzzです、加えて状態(state)が一切ありません。
applicators = {3 => "fizz", 5 => "buzz"}
fizzbuzz =
(1..100).map do |n|
fb = applicators.
select{|a| n % a == 0}.
values.join
[n.to_s, fb].max # "1" > "" and "fizz" > "100000" since "1" < "a"
end
puts fizzbuzz
例えばFizzBuzzの亜種にはFizzBuzzWoofと言うのがありますが、こういうアプローチだとapplicators
に"woof" => 7
と記入するだけで動作を拡大。もしくはapplicators
ごとデータベースに移せます。こうすることによってコードはデータを変更する最低限のロジックを実装し、簡単に新しいケースを処理できます*。
*一応Rubyの場合select
はCコードレベルでは条件文がありますが理論上select
,filter
等は条件を必要としません。例えばHaskellではパターンマッチングを使って実装されています。
*条件文のある基本的なFizzBuzzだと新しいケースごとにコード自体を書き換えなければいけません。