前書き
最近JavaScriptを触っていないので、気分転換でFizzBuzz問題でもやろうと思いました。
普通に解いても面白くないので、今回は配列を使うこととワンライナーで書くことを考えて問題を解きました。
ワンライナーのため可読性が悪いのでその点は注意してください。
コード
Array.from(Array(100)).map((_, i) => [i+1, 'fizz', 'buzz', 'fizzbuzz'][[1,0,0][(i+1)%3]+[2,0,0,0,0][(i+1)%5]]).forEach(item => console.log(item));
解説
簡単に解説を行なっていきます。
メソッドなどがわからない場合は下記の「メソッドなどの参考リンク」をのリンク先などをみていただければと思います。
定義形
Array(100)
長さが100の新しい空の配列を作成しております。
要素は全てundefinedで初期化されとるらしいです。
map((_, i)...略)
アンダーバーは仮引数。
mapの関数内で使用されないことを示しとります。
i
はArray(100)
で定義した配列のキーなんで 0
スタートになります。
[i+1, 'fizz', 'buzz', 'fizzbuzz']
FizzBuzz用の配列を定義。
[[1,0,0][(i+1)%3]+[2,0,0,0,0][(i+1)%5]]
数値によって呼び出すキーの配列を定義。
[1,0,0][(i+1)%3]
3の倍数の余りでキー設定をしている。
[2,0,0,0,0][(i+1)%5]
5の倍数の余りでキー設定をしている。
15の倍数
[1,0,0][(i+1)%3]
と[2,0,0,0,0][(i+1)%5]
を足すことで15の倍数を判断できるようになるわけです。
動きに関して
i+1が3の倍数になる時(i=2など)
[(i+1)%3]
が割り切れるため0
になるから[1,0,0][(i+1)%3]
が1
になり、
[(i+1)%5]
は割り切れないので0
となることがないので[2,0,0,0,0][(i+1)%5]
が0
になります。
[[1,0,0][(i+1)%3]+[2,0,0,0,0][(i+1)%5]]
が[1]
になるので
[i+1, 'fizz', 'buzz', 'fizzbuzz']
からfizz
が呼び出されるようになります。
i+1が5の倍数になる時(i=4など)
[(i+1)%3]
は割り切れないので0
となることがないので[1,0,0][(i+1)%3]
が0
になり、
[(i+1)%5]
が割り切れるため0
になるから[2,0,0,0,0][(i+1)%5]
が2
になります。
[[1,0,0][(i+1)%3]+[2,0,0,0,0][(i+1)%5]]
が[2]
になるので
[i+1, 'fizz', 'buzz', 'fizzbuzz']
からbuzz
が呼び出されるようになります。
i+1が15の倍数になる時(i=14など)
[(i+1)%3]
が割り切れるため0
になるから[1,0,0][(i+1)%3]
が1
になり、
[(i+1)%5]
が割り切れるため0
になるから[2,0,0,0,0][(i+1)%5]
が2
になります。
[[1,0,0][(i+1)%3]+[2,0,0,0,0][(i+1)%5]]
が[3]
になるので
[i+1, 'fizz', 'buzz', 'fizzbuzz']
からfizzbuzz
が呼び出されるようになります。
i+1が3,5,15の倍数以外の場合
[1,0,0][(i+1)%3]
と[2,0,0,0,0][(i+1)%5]
の両方が0
になるので[i+1, 'fizz', 'buzz', 'fizzbuzz']
からi+1
呼び出されるようになります。
終わりに
FizzBuzz問題を久しぶりに解きましたが、この方法で実装を行わなければならないという制限を設けた状態でコードを書くのは良い刺激になるなと感じました。
弊社開発課でXもやっていますので是非フォローをしてください
私のXのフォローもしてくれると喜びます
メソッドなどの参考リンク
Array.from()
map
アロー関数
(_, i) => [i+1, 'fizz', 'buzz', 'fizzbuzz'][[1,0,0][(i+1)%3]+[2,0,0,0,0][(i+1)%5]]
など
forEach