石取りゲーム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 個です。
私の負けです!

最初、全然勝てませんでしたが、必勝法が分かれば無敵ですね。!!