石取りゲーム2
awkネタ
前回と同様に、一山の石から交互に石を取る。
取る石の数は、相手が直前に取った石の数の2倍を超えてはならない。
最後に石を取ったものの勝ち。
ただし、最初に全部の石を取ってはならならい。
パスは出来ない。
#!/usr/bin/awk -f BEGIN{ f[1] = f[2] = 1; for(i = 3; i <= 20; i++){ f[i] = f[i - 1] + f[i - 2]; } printf("石の数 (2..10000)? "); getline n; if(n < 2 || n > 10000){ exit 1; } max = n - 1; for(my_turn = 1; n != 0; my_turn = xor(my_turn,1)){ printf("%d 個まで取れます\n",max); if(my_turn){ x = n; for(i = 20; x != f[i]; i--){ if(x > f[i]){ x -= f[i]; } } if(x > max){ x = 1; } printf("私は %d 個の石を取ります。\n",x); }else do{ printf("何個取りますか? "); r = getline x; }while(r != 1 || x < 1 || x > max); n -= x; max = 2 * x; if(max > n){ max = n; } printf("残りは %d 個です。\n",n); } if(my_turn){ printf("あなたの勝ちです!\n"); }else{ printf("私の勝ちです!\n"); } }
コンピュータの手はフィボナッチ数列を使って決めている。
これの必勝法もあるみたいだけど、ちょっとまだ理解出来ていないです。
awk -f ishi2.awk 石の数 (2..10000)? 21 20 個まで取れます 私は 1 個の石を取ります。 残りは 20 個です。 2 個まで取れます 何個取りますか? 2 残りは 18 個です。 4 個まで取れます 私は 1 個の石を取ります。 残りは 17 個です。 2 個まで取れます 何個取りますか? 1 残りは 16 個です。 2 個まで取れます 私は 1 個の石を取ります。 残りは 15 個です。 2 個まで取れます 何個取りますか? 2 残りは 13 個です。 4 個まで取れます 私は 1 個の石を取ります。 残りは 12 個です。 2 個まで取れます 何個取りますか? 1 残りは 11 個です。 2 個まで取れます 私は 1 個の石を取ります。 残りは 10 個です。 2 個まで取れます 何個取りますか? 1 残りは 9 個です。 2 個まで取れます 私は 1 個の石を取ります。 残りは 8 個です。 2 個まで取れます 何個取りますか? 1 残りは 7 個です。 2 個まで取れます 私は 2 個の石を取ります。 残りは 5 個です。 4 個まで取れます 何個取りますか? 1 残りは 4 個です。 2 個まで取れます 私は 1 個の石を取ります。 残りは 3 個です。 2 個まで取れます 何個取りますか? 1 残りは 2 個です。 2 個まで取れます 私は 2 個の石を取ります。 残りは 0 個です。 私の勝ちです!