石取りゲーム1
awkネタ
一山の石から交互に石を取る。最後に石を取ったものが負け。
1回に取れる最大数は予め決めておく。パスは出来ない。
コンピュータは次のように考える。例えば1回に取れる最大数を3個とする。
相手が1,2,3個取ればそれぞれ3,2,1個取ることにすれば、石は毎回4個減る。
したがって、残りの石の数を4k+1(kは整数)の形にすれば、必ず最後に相手に1個残せる。
このような形に出来なければ1個だけ取って相手の敗着を待つ。
これは、途中で入力が求められるので、getlineが必要ですね。
初めて使いました。getline
初心者は使わないほうが良いということですが、getlineを使わないで作る方法が思いつかないので、使用します。
#!/usr/bin/awk -f BEGIN{ printf("石の数? "); getline n; printf("1回に取れる最大の石の数? "); getline m; if(n < 1 || m < 1){ print("Error!"); } for(my_turn = 1; n != 0; my_turn = xor(my_turn,1)){ if(my_turn){ x = (n - 1) % (m + 1); if(x == 0){ x = 1; } printf("私は %d 個の石を取ります。\n",x); }else do{ printf("何個取りますか?"); r = getline x; }while(r != 1 || x <= 0 || x > m || x > n); n -= x; printf("残りは %d 個です。\n",n); } if(my_turn){ printf("あなたの負けです!\n"); }else{ printf("私の負けです!\n"); } }
awk -f ishi1.awk 石の数? 13 1回に取れる最大の石の数? 2 私は 1 個の石を取ります。 残りは 12 個です。 何個取りますか?2 残りは 10 個です。 私は 1 個の石を取ります。 残りは 9 個です。 何個取りますか?2 残りは 7 個です。 私は 1 個の石を取ります。 残りは 6 個です。 何個取りますか?2 残りは 4 個です。 私は 1 個の石を取ります。 残りは 3 個です。 何個取りますか?2 残りは 1 個です。 私は 1 個の石を取ります。 残りは 0 個です。 私の負けです!
最初、全然勝てませんでしたが、必勝法が分かれば無敵ですね。!!