tonocchoのメモ

軽い気持ちで

ズンドコ問題に挑戦してみた

こんなのがなんかバズってたのでよーし力試しだ!と思って挑戦した。

で、こうなりました(超読みにくい)

public class きよしの {
    private int 下位5ビットマスク = 0x1F;
    private int ズンドコ成立 = 0x1E;

    public static void main(String[] args) {
        new きよしの().ズンドコ節();
    }

    private void ズンドコ節() {
        String[] zundoko = new String[] { "ドコ", "ズン" };
        int history = 0;
        while (true) {
            int index = (int) (Math.random() + 0.5);
            System.out.println(zundoko[index]);
            history = history * 2 + index;

            int last5bits = history & 下位5ビットマスク;
            if (last5bits == ズンドコ成立)
                break;
            history = last5bits;

        }
        System.out.println("きよし!");
    }
}

考え方としては、

0が来たらドコ、1が来たらズンとなりますが、それを2進数に見立てて変数に入れていきます。そのときに2倍して足すことで要は1と0の羅列になりますね。

で、最終5ビットが11110(0x1E)になったらズンズンズンズンドコなので終わってきよし!って出します。

ひたすら足しこんでもいいんだけど、ぶっちゃけ下位5ビット以外はどうでもいいのでそれ以上足しません。