ついに来たズンドコキヨシブーム
毎週メールが来る "先週ストックが多かった投稿ベスト20" を見ていたら、
ズンドコキヨシまとめ
というめっちゃ気になる謎のタイトルがありました
twitter で話題になっていたらしく、
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了
ということらしいです
FizzBuzz のズンドコキヨシ版みたいな感じですね
※ズンドコキヨシ版て何だよ
そんなズンドコキヨシが意味わからないくらいたくさんの言語で実装されています
javascript でズンドコキヨシ
試しにやってみようと思い javascript で書いてみました
あんまり特徴はありませんが、クロージャで定義したところと、再帰で表現してるところがポイントです
ブラウザでも node.js でも動きます
// ズンドコ定義
var zundoko = function(){
var word = ['ズン', 'ドコ'];
function play(n){
n &= 31;
if(n === 1){
console.log('キ・ヨ・シ!');
}else{
var rand = +(Math.random()<0.5);
console.log(word[rand])
play(n*2 + rand);
}
};
return play(31);
};
// ズンドコ実行
zundoko();
解説
処理内容を要約すると、"ズン"、"ドコ"の文字をそれぞれビット符号化し、
0 → ズン、 1 → ドコ
として扱います
直前の5回分が
00001 → ズンズンズンズンドコ
となったら、"キ・ヨ・シ!" を表示して終了します
最低でも5周はさせる必要があるので、
play の初期値は 31 (つまり 11111) としています
※補足
どんなパターンでも5周するまで 00001 と一致しなければいいので、下位5ビットを最上位ビットを反転させた値にすればいいと考えました
これは十分条件なので他にも条件を満たす値はあります
ビット演算の部分は
jsでズンドコキヨシのコードゴルフ(87byte)
を参考にさせていただきました
これはすごすぎます
上記の記事でほとんど解説されているので特筆するところはほとんどありませんが、
31 は2進数で 11111 なので、それとの論理積を取ることで末尾の5ビットだけ抜き出せるわけですね
他には、以下の部分では論理値から数値に変換してます
+(Math.random()<0.5);
黒魔術感がハンパないですね・・・!