カードを裏返せ

awkでパズルを解いてみる。

Q.1〜100までの番号が書かれた100枚のカードが順番に並べてあります。
最初、すべてのカードは裏返しの状態でおかれています。
ある人が2番のカードから、1枚おきにカードを裏返していきます。
すると、2,4,6・・・,100番のカードが表を向くようになります。
次に、別の人が、3番のカードから2枚おきにカードを裏返していきます。
(裏向きのカードは表を向き、表を向いているカードは裏返されます。)
また、別の人が、4番のカードから3枚おきに、カードを裏返していきます。
このようにn番目のカードからn-1枚おきにカードを裏返す操作を、どの
カードの向きも変わらなくなるまで続けたとします。
カードの向きが変わらなくなったとき、裏向きになっているカードの番号は?

初心者向きの問題です。
特に難しく考えずに配列で考えてみます。

#!/usr/bin/awk -f

BEGIN{
    true = 1;   # 表
    false = 0;  # 裏
    for(i = 1; i <= 100; i++){
        card[i] = false;
    }

    n = 2;

    while(n <= 100){
        for(j = n; j <= 100; j+=n){
            if(card[j] == true){
                card[j] = false;
            }else{
                card[j] = true;
            }
        }
        n++;
    }

    for(i = 1; i<= 100; i++){
        if(card[i] == false){
            printf "%d ",i;
        }
    }
}
awk -f q03.awk 
1 4 9 16 25 36 49 64 81 100 

平方数が答えというのも面白いですね。