LoginSignup
11
11

【JavaScript】FizzBuzz問題をワンライナーで書いてみた

Last updated at Posted at 2024-02-07

前書き

最近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の関数内で使用されないことを示しとります。
iArray(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

11
11
4

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
11
11