🔢
条件分岐しない fizzbuzz
状況
if しないで FizzBuzz を書いてみよう的な話があったのでやってみた.
方針
条件と外から入れて計算する.入力の条件を追加すれば処理自体はいじらなくて済むようにできると良い.多分.
実装
const data = [
{ condition: (v) => v % 15 === 0, result: "FizzBuzz" },
{ condition: (v) => v % 5 === 0, result: "Buzz" },
{ condition: (v) => v % 3 === 0, result: "Fizz" },
];
function fizzBuzz(n, data) {
const list = [...Array(n)].map((_, i) => i + 1);
return list
.map(
(i) =>
[...data, { condition: (v) => v % i === 0, result: i }].filter((d) =>
d.condition(i)
)[0].result
)
.join(", ");
}
console.log(fizzBuzz(100, data));
結果
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, FizzBuzz, 31, 32, Fizz, 34, Buzz, Fizz, 37, 38, Fizz, Buzz, 41, Fizz, 43, 44, FizzBuzz, 46, 47, Fizz, 49, Buzz, Fizz, 52, 53, Fizz, Buzz, 56, Fizz, 58, 59, FizzBuzz, 61, 62, Fizz, 64, Buzz, Fizz, 67, 68, Fizz, Buzz, 71, Fizz, 73, 74, FizzBuzz, 76, 77, Fizz, 79, Buzz, Fizz, 82, 83, Fizz, Buzz, 86, Fizz, 88, 89, FizzBuzz, 91, 92, Fizz, 94, Buzz, Fizz, 97, 98, Fizz, Buzz
条件に引っかからないとき用にオブジェクトを追加しているのが若干キモい.
条件の追加
下記みたいに追加すれば良さそう.順番が問題になるようならソートの関数を作って挟めばよい.
const data = [
{ condition: (v) => v % 17 === 0, result: "Hoge" },
{ condition: (v) => v % 15 === 0, result: "FizzBuzz" },
{ condition: (v) => v % 5 === 0, result: "Buzz" },
{ condition: (v) => v % 3 === 0, result: "Fizz" },
];
以上だ( `・ω・)b
Discussion