プログラミングコンテストでは、たとえば2次元マップと移動体が与えられ、設定されたスタート地点から、複数の方向転換および移動を行った上で、最終的にその移動体はどの位置(座標)にいるか?が問われるような問題があります。

 その際に重要となるのが、方向の状態確認です。そこで今回はその方向の状態を確認する方法を紹介します。

 下図のように、4方向がそれぞれ N, E, S および Wとして与えられ、今の段階で移動体は方向Nを向いているとします。

 これに対して、時計回りに90度向きをかえることを「右を向く」、さらに時計回りに90度(はじめから言えば180度)向きをかえることを「後ろを向く」、さらにさらに時計回りに90度(はじめから言えば270度)向きをかえることを「左を向く」と言うとします。

例えば、(図1)の状態から
1. 「右を向けば」方向はE、
2. そこから「後ろを向けば」方向はW、
3. そして「左を向けば」方向はS となります。

これを管理するには、方向を数字として扱いmod( % )を使えば良いです。
ざっくり言えば、4方向を管理する場合、0〜3までの4つの数字で方向を表すようにし、向きをかえた場合は、これに加算を行います。方向転換を行い続けると3を超える数字が出現しはじめますが、その際は4で割った余り(mod)を取得すれば、0〜3までの4つの数字に収まります。

念のために、0~9までの数字を4で割ったあまりがどうなっていくのかをみてみます。

for i in range(10):
    print(i%4)

# --> 0
# --> 1
# --> 2
# --> 3
# --> 0
# --> 1
# --> 2
# --> 3
# --> 0
# --> 1

結果は0~3の間にきちんとおさまっていますね。


より具体的に方向について考えてみます。
まず(図2)のようにそれぞれの方向を数字に置き換えます。

そして 変数として direct を用意すれば、(図1)の状態は以下のように表せます。

direct = 0%4
# direct = 0 = N

これに対して、上記の例で考えれば、

1. 「右を向けば」方向はE、

に対しては、direct に1を足してやれば良さそうです。

direct = (direct + 1)%4
# direct = 1 = E


2. そこから「後ろを向けば」方向はW、

に対しては、direct に2を足してやれば良さそうです。

direct = (direct + 2)%4
# direct = 3 = W


3. そして「左を向けば」方向はS

に対しては、注意が必要で、direct から1を引けば、良さそうですがこれをやってしまうと例えば direct = 0の場合に direct = -1 となりマイナスの値が発生しはじめます。このマイナスの値に対する mod の使用は、プログラミング言語により出力結果が異なるので、あまり好まれないようです。よってここでは、「左を向く」に関しては direct が正の値であることを担保するために +3 とすることにします。よって、

direct = (direct + 3)%4
# direct = 2 = S

となります。


改めて、4方向の状態を確認したい場合は、

・4方向を0〜3の数字で表す。

・時計回りに考えて、
 右を向くは +1
 後ろを向くは +2
 左を向くは +3
 として、先の数字に加算する。

・modを用いて(%4)、その数字の剰余を算出する。

以上になります。