クリスマスダンジョンに挑んできたよ!

codeiq.jpで開催されていた「FizzBuzzダンジョン」及び「クリスマス版素数のダンジョン」をクリアできたので、せっかくだからとこちらのイベントにもお邪魔して来ました。

FizzBuzz問題を私が60文字、70文字で四苦八苦して解いてる中、twitter上には34文字で出来たとかつぶやいている方がいらっしゃったりするんですよ。いったいどういう回答なのか、どうやったらそれだけ短くなるのか。俄然興味が湧いてくるわけで、その秘密の一端でも垣間見ようと冷たい雨が降る中、ITメディアさんの会場にお邪魔したわけなんです。

いやー、すごかったです。
凄腕のハッカーをウィザードなどと言ったりもしますが、ダンジョンをクリアした中にはウィザードならぬソーサラー(妖術師)がいました。
もうね、何が書いてあるのかわからない。
え、そんな関数あったんだ! というのは序の口。その数字はいったいどこから出てきたんですか、その式はいったいどこをどうこねくり回したら導き出せるんですかという、もうこちらのアタマが理解を拒むようなものがぞろぞろ出てきました。
パソコンの説明書こそは現代の魔術書と朝松健が言ってましたが、今回出てきたのはネクロノミコンとかエイボンの書とかそういうレベルですよ。やってることは単なるFizzBuzzなんですけどね!
さて! せっかくなので今回のFizzBuzz問題に私がどんな答えを書いたのか、ちょっとお披露目したいと思います。
基本となるFizzBuzzを出力する関数は以下のもので、回答者は①に入る部分のコードを答えることになります。

function yourCode() {
   var arr = [];
    for (var i = 1; i <= 100; i ++) {
        arr.push([i, "fizz", "buzz", "fizzbuzz"]
            []);
    }
    return arr;
}

レベル1のテーマは「条件分岐を1行で」ということで、制限事項としては以下が付帯します。

・入力欄の文字数:100文字以内
・禁止文字:なし

これに対し、私は以下の様なコードを書きました。

i%3===0&&i%5===0?3:i%3===0?1:i%5===0?2:0

比較を"==="でやってるあたり、ショートコーディングだということをまったく理解していないことがうかがえますw

レベル2のテーマは「条件分岐なし」でした。制限事項は以下の通りです。

・入力欄の文字数:30文字以内
・禁止文字:「?」「:」「&」「|」「,」「$」「eval」「function」「Function」「if」「switch」「for」「while」「return」

私の書いたコードはこれです。

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

条件分岐が使えないということで、かなり迷いました。ちなみに冒頭の「1*」はなくても成立します。

レベル3のテーマは「演算子の制限」でした。制限事項は以下の通りです。

・入力欄の文字数:40文字以内
・禁止文字:「?」「:」「&」「|」「,」「$」「eval」「function」「Function」「if」「switch」「for」「while」「return」「!」「^」「~」「<」「>」「=」「Math」

私の書いたコードはこれです。

1+(-Boolean(i%3))+2+(-Boolean(i%5)*2)

Boolean型に-1を掛けるという荒業で解決しました。
出題された柳井さんのお話では、isFinite(初めて知った!)やNaNで解決した方、文字列の長さで判定された方やフェルマーの小定理(何だ、それ!)で解決された方もいたそうです。

レベル4のテーマは「剰余を使わない」でした。制限事項は以下の通りです。

・入力欄の文字数:70文字以内
・禁止文字:「?」「:」「&」「|」「,」「$」「eval」「function」「Function」「if」「switch」「for」「while」「return」「!」「^」「~」「<」「>」「=」「Math」「%」

私の書いたコードはこれです。

1-Boolean(+(''+i/3*10).slice(-1))+2-Boolean(+(''+i/5*10).slice(-1))*2

割り算の結果を10倍すると、必ず1の位は0になります。そこに着目しました。あとはおっかなびっくりでカッコ外してくw
小数点の位置などに注目された方が多かったようですが、中には配列うまく活用して解決された方もいたそうです。

今回のイベントはさらに素数をテーマとした問題へと続き、様々な珍回答を見させていただきました。
そして7をテーマとしたLive Coding! 20分ほどの時間で21文字で回答された方がいらっしゃいました。私は23文字まで詰めることができましたが、あと2文字、どうやったらけずれるのかまったくわかりません。
いや、本当に楽しいイベントでした。また次回も参加させて頂きたいですね!