じゃんけんの勝敗を判定するプログラムを書く機会があり、
単純にswitch caseで、
自分が"パー"の時に、相手が"パー"ならあいこ、
自分が"パー"の時に、相手が"グー"なら勝ち、
自分が"パー"の時に、相手が"チョキ"なら負け、
:
と、9通り書いていたのだが、
たったの1行で判定できるロジックというものがあり、
ちょっと感動しました![]()
まず、じゃんけんの判定表は以下の通りです
| 相手 | ||||
| グー | チョキ | パー | ||
| 自分 | グー | あいこ | 勝ち | 負け |
| チョキ | 負け | あいこ | 勝ち | |
| パー | 勝ち | 負け | あいこ | |
ここで、グー、チョキ、パーを以下のように定義します。
グー : 0
チョキ : 1
パー : 2
そして、自分の手から相手の手を引き算します
例えば、自分の手が「グー」で、相手の手が「チョキ」だったら、
「グー(0)」 - 「チョキ(1)」 = -1
という感じで。
結果は、以下の表のようになります
| 相手 | ||||
| グー(0) | チョキ(1) | パー(2) | ||
| 自分 | グー(0) | 0 | -1 | -2 |
| チョキ(1) | 1 | 0 | -1 | |
| パー(2) | 2 | 1 | 0 | |
上記の表から、
あいこは、 0
勝ちは、 -1か2
負けは、 1か-2
という結果になっています
ここで、なんとなく、最初のじゃんけん勝敗表と似たような法則性があることに気づきます
結果の数値に3を足して、さらに3で割った余りを出すとどうなるか
あいこは、0だったので、
(0 + 3) % 3 = 0
勝ちは、-1か2だったので、
(-1 + 3) % 3 = 2
or
(2 + 3) % 3 = 2
負けは、1か-2だったので、
(1 + 3) % 3 = 1
or
(-2 + 3) % 3 = 1
ということは、
| 相手 | ||||
| グー | チョキ | パー | ||
| 自分 | グー | 0 | 2 | 1 |
| チョキ | 1 | 0 | 2 | |
| パー | 2 | 1 | 0 | |
はい。。。
一番初めのじゃんけん勝敗表と全く同じ結果になります![]()
(「自分の手」 - 「相手の手」 + 3) % 3
の式で、勝敗結果が出てくるのです
このロジック、天才ですね