カードを裏返せ
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
平方数が答えというのも面白いですね。