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