読者です 読者をやめる 読者になる 読者になる

唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

FizzBuzzダンジョンに挑戦した

結構前の話ですが↑に挑戦しました
JavaScriptFizzBuzzコードゴルフ(できるだけコードを短く)する問題です
以下の空欄を埋めるような1行の式を入力します

[i, "fizz", "buzz", "fizzbuzz"][空欄]

レベルが上がるごとに一部の文字が禁止されていきます('%'禁止とか

↑解説記事が公開されています

コードゴルフをやるのは初めてだったので面白かったです

この問題の作者の次の次の問題↓も公開されているみたいです

レベル1

禁止はなし

自分の回答

[i, "fizz", "buzz", "fizzbuzz"][2*(i%5<1)+(i%3<1)]

解説の面白い回答

解説を見ると1との比較ではなく!を使って0かどうか判定した方が短くできるみたいです

2*!(i%5)+!(i%3)

レベル2

以下の文字列が禁止
「?」「:」「&」「|」「,」「$」「eval」「function」「Function」「if」「switch」「for」「while」「return」

条件分岐などが使えなくなっています

自分の回答

レベル1と同じ

[i, "fizz", "buzz", "fizzbuzz"][2*(i%5<1)+(i%3<1)]

レベル3

以下の文字列が禁止
「?」「:」「&」「|」「,」「$」「eval」「function」「Function」「if」「switch」「for」「while」「return」「!」「^」「~」「<」「>」「=」「Math」

比較演算子が使えなくなってるのがつらいです

自分の回答

あらかじめ15個の要素の文字列を作っておいて、剰余をとって切り出してきます

[i, "fizz", "buzz", "fizzbuzz"]['300102100120100'[i%15]]

解説の面白い回答

解説を見ると以下のフェルマーの小定理を使った方法が短いし面白いです

3-i*i%3-i*i*i*i%5*2
http://codezine.jp/article/detail/7546?p=3

レベル4

以下の文字列が禁止
「?」「:」「&」「|」「,」「$」「eval」「function」「Function」「if」「switch」「for」「while」「return」「!」「^」「~」「<」「>」「=」「Math」「%」

%が禁止されるので一気につらくなります

自分の回答

基本的にレベル3の回答と同じですが、剰余の部分を書き換えて定義通り計算しています

[i, "fizz", "buzz", "fizzbuzz"]['300102100120100'[i-parseInt(i/15)*15]]

解説の面白い回答

解説を見ると、以下の2つの方法がすごいです

剰余を取る代わりに、中身が空の配列にjoinすることで、文字列を必要な長さの分くりかえしています(最大100までしかやらないので

Array(8).join(300102100120100)[i]
http://codezine.jp/article/detail/7546?p=4

剰余を取る代わりに、割り切れたかどうかを正規表現で小数点を調べることで計算しています

3-/\./.test(i/3)-/\./.test(i/5)*2
http://codezine.jp/article/detail/7546?p=4
-->