見出し画像

「篠澤と20を数えたら負けゲーム」の必勝法の解説と、一般化された「n を数えたら負けゲーム」の必勝法の定理と追加ルールによる先手必勝への影響に関する考察


前書き

篠澤と20を数えたら負けゲーム、やってみました。なんだこれ。

で、数学を嗜む者なら知っているであろう某「先手必勝」の有名なゲームのパロディであり、当然勝ったのですが。。。。

Pより優れた篠澤など存在しない

「そういえば、なぜ先手必勝なんだろう?」
「後手が必勝のパターンって無いんだろうか?」
などと考えてカタカタと手を動かしていたら、いつの間にかこの記事の草稿が出来上がっていましたとさ。

この記事「で、俺が生まれたってワケ」

結論

以下の前提条件のとき、任意の整数 m に対して先攻が勝利する n の条件は n を (m+1) で割り算した時、余りが 1 以外である

  • プレイヤーはCPU(篠澤)と交互に +1 から +m(ただし、m は 2 以上の任意の正の整数)の範囲の整数を宣言し、その合計値が正の整数 n に到達した時点の宣言者が負ける。

  • 宣言できる整数の回数に制約は存在しない。

論理記号っぽく書き換えると
∀m∈ℕ, ∃n∈ℕ, [前提条件]∧¬(n≡1 (mod m+1)) ⇔ [先攻必勝]
となる。

これだけだとピンと来ない方がいるかもしれないので、一般的な先攻必勝の例と一般的ではないであろう先攻必勝ではない例を示します。

(一般的)先攻必勝の例

m=9, n=100の場合を例に挙げてみよう。
m+1=9+1=10なので、100÷10=10で割り切れるから、余りは1ではない。ので、先手必勝であるはずだ。
実際に先手必勝かを示そう。

後手に合計100を出させるには、先手は合計99を出す必要がある。
先手が合計99を出すには、後手に合計90-98を出させる必要がある。
後手に合計90-98を出させるには、先手は合計89を出す必要がある。
先手が合計89を出すには、後手に合計80-88を出させる必要がある。
・・・・・・
後手に合計20-28を出させるには、先手は合計19を出す必要がある。
先手が合計19を出すには、後手に合計10-18を出させる必要がある。
後手に合計10-18を出させるには、先手は合計9を出す必要がある。

と、まぁ、途中割愛しているが、要するに先手は最初に9を出し、その後は後手が何をやろうが特定の合計値になるよう数字を出し続ければ勝てる訳である。これが先手必勝という理屈だ。

(not一般的)先攻必勝ではない例

それでは、先攻が必勝ではない(一般には稀有であろう)パターンを紹介する。
m=10, n=100の場合を例に挙げてみよう。
m+1=10+1=11で、100÷11=99あまり1となるので、筆者の結論が正しければ先手は必勝ではない。
こちらも、実際に見てみよう。

後手に合計100を出させるには、先手は合計99を出す必要がある。
先手が合計99を出すには、後手に合計89-98を出させる必要がある。
後手に合計89-98を出させるには、先手は合計88を出す必要がある。
先手が合計88を出すには、後手に合計78-87を出させる必要がある。
・・・・・・
後手に合計12-21を出させるには、先手は合計11を出す必要がある。
先手が合計11を出すには、後手に合計1-10を出させる必要がある。
後手に合計1-10を出させるには、先手は合計0を出す必要がある。

と、またまた途中割愛しているが、結論としては先手は0も11も出せないので先手必勝とはならない。
後手が手加減してくれない限りは、先手には勝てない可能性が存在するのだ。
と言っても、このゲームをやる機会自体そもそも滅多に無いんですけどね。

この先は数学オタク向け

結論は示したし、篠澤と20を数えたら負けゲームで篠澤に勝てるようになったら充分という方はこの先は見る必要が無いかもしれないです。
なぜならば、殴り書きのメモなので読みにくいからです。

それでも読みたければ、社会人の筆者が貴重な休憩時間を浪費して生成された怪文書をご覧いただき、あわよくば批判的なご指摘をいただけると非常に嬉しいです。

学マスの布教・宣伝 注)数学オタクは本節を読み飛ばしてもOK

あ、あと学園アイドルマスター、面白いので是非やってね!(必死

一番の推しは篠澤広です。可愛いでしょう?(圧

リリース前からずっと気になってた子で、巷ではガガンボとかマゾとか言われてるけど普通に篠澤広は良い子なので……!そんなこと言わないであげてくれ……!
どうか、どうか……ッ!!
贅沢言わないので、この記事読んでくれた全人類~~!!!!
篠澤広の親愛度10コミュ見てくれ~~~~!!!!!(クソデカ大声

で、推し楽曲はこちら!(まだ話が続くんです
姫崎莉波ちゃんのclumsy trick!!!

作詞作曲の渡辺翔さんの個人的なファンというのもありますが、
そもそも
「この曲、良い……ッ!!!」
になったきっかけがありまして……(話が長い

入手後のプロデュースアイドルの選択画面で流れたサビを何度か受動喫煙的に聴くうちに
「おや……どうやら神曲っぽいぞ……つべでMV観てみっか……」
となり、まんまとclumsy trickにハマったという経緯があります。

いや~~、マジでエグいですね、clumsy trick。
最近まで毎日ヘビーローテーションしてましたわ。
エグいっす、マジ(語彙
ちなみに姫崎莉波ちゃんも良い子なので、プロデュースしましょう(圧
と言いつつ、筆者も親愛度10コミュはまだ見れてないのでプロデュース頑張りますわ。サポカが足りねぇ~~!!

殴り書きのメモ

ということで、本題に入ります。

1章: まずは篠澤に勝とう - 20を数えたら負けゲームの解法(+1から+3の範囲で)

前提条件:

  • プレイヤーはCPUと交互に+1から+3の整数を宣言し、その合計値が20に到達した時点の宣言者が負ける。

  • 先攻、後攻をじゃんけんで決める。

  • 宣言できる整数の回数に制約は存在しない。

解法検討:
20にしてもらうには?
19を渡せば良い

19を渡すためには?
16-18を貰えば良い
16-18を貰うためには?
15を渡せば良い

15を渡すためには?
12-14を貰えば良い
12-14を貰うためには?
11を渡せば良い

11を渡すためには?
8-10を貰えば良い
8-10を貰うためには?
7を渡せば良い

7を渡すためには?
4-6を貰えば良い
4-6を貰うためには?
3を渡せば良い

↑つまり、じゃんけんで勝利した先攻が有理なゲーム。

2章: ちょっと一般化してみよう - n を数えたら負けゲームの解法(+1から+3の範囲で)

条件を一部だけ一般化し、先攻、後攻の優位性を確認してみる。

前提条件:

  • プレイヤーはCPUと交互に+1から+3の範囲の整数を宣言し、その合計値が先攻が勝利する適当な正の整数 n に到達した時点の宣言者が負ける。

  • 先攻、後攻をじゃんけんで決める。

  • 宣言できる整数の回数に制約は存在しない。

n にしてもらうには?
(n-1) を渡せば良い・・・(0)

(n-1) を渡すためには?
(n-4)-(n-2) を貰えば良い
(n-4)-(n-2) を貰うためには?
(n-5) を渡せば良い・・・(1)

・・・

(n-1-4*i) を渡せば良い・・・(i) 

ただし、i は以下の条件を満たす正の整数である。

条件: +1 <= n-1-4*i <= +3

この時、正の整数が満たす n の条件(つまり、先攻が勝利する n の条件)を調べる。

+1 <= n-1-4i <= +3
+2 <= n-4i <= +4
4i+2 <= n <= 4i+4

ここで、n は整数であるから、任意の正の整数 i を用いて以下のように表現できる。

n = 4i +2 または 4i +3 または 4*i +4

つまり、n を 4 で割った時の余りが 2, 3か、あるいは4で割り切れる場合に、先攻が勝利する

ここで、先攻が勝利するという語の定義を行う。
「先攻が勝利するとは、先攻・後攻がともに自分自身が勝利するために論理的に最良手のみを選択した結果、必ず先攻が勝利する」という意味と定義する。

そういえば定義してなかったなと思い、このタイミングで語義の定義をしている

現在、示せている事実は

先攻が勝利する適当な n ⇒ n = 4i +2 または 4i +3 または 4i +4

であり、命題として逆である

n = 4i +2 または 4i +3 または 4i +4 ⇒ 先攻が勝利する

を示した訳ではない。

……が、何となく~自明な感じがするので~必要十分性の証明は割愛する。唐突にゆるふわすぎる

3章: もっと一般化してみよう - n を数えたら負けゲームの解法(+1から+mの範囲で)

では、前提条件を更に一般化してみよう。

前提条件:

  • プレイヤーはCPUと交互に+1から+ m (ただし、mは2以上の任意の正の整数)の範囲の整数を宣言し、その合計値が先攻が勝利する適当な正の整数 n に到達した時点の宣言者が負ける。

  • 先攻、後攻をじゃんけんで決める。

  • 宣言できる整数の回数に制約は存在しない。

n にしてもらうには?
(n-1) を渡せば良い・・・(0)
(n-1) を渡すためには?
(n-(m+1))-(n-2) を貰えば良い
(n-(m+1))-(n-2) を貰うためには?
(n-1-(m+1)) を渡せば良い・・・(1)
・・・
(n-1-(m+1)*i) を渡せば良い・・・(i)

ただし、i は以下の条件を満たす正の整数である。
条件: +1 <= n-1-(m+1)*i <= +m

この時、正の整数が満たす n の条件(つまり、先攻が勝利する n の条件)を調べる。

+1 <= n-1-(m+1)*i <= +m
+2 <= n-(m+1)*i <= +m+1
(m+1)*i +2 <= n <= (m+1)*i +m+1
(m+1)i + 2 <= n <= (m+1)(i+1)

ここで、n は整数であるから、任意の正の整数 i を用いて以下のように表現できる。

n=(m+1)*i + 2, (m+1)*i + 3, ……, (m+1)*i +m+1

コラム
mに対して、先攻が勝利する n の個数は (m+1)-2+1=m 個である。

ソースは俺

すなわち、任意の整数 m に対して、先攻が勝利する n は
n を (m+1) で割り算した時、余りが 1 以外である
という条件を満たす。

これを、必勝法の定理と本記事では呼ぶ。

3.1章: 「必勝法の定理」を具体例で検証してみよう

では、「n を (m+1) で割り算した時、余りが 1 の時に先攻が勝利しない」ことを検証してみよう。

なぜ「n を (m+1) で割り算した時、余りが 1 以外の時に勝利する」ことを検証しないか?
こっちの命題は面白くないからである。まだ見たことのない結果を見てみたい。そうは思わないだろうか?

ソースは俺

以下の前提条件では、n=51、m=9と設定している。

条件の確認
51÷(9+1)=5あまり1である。
ちなみに余談だが、筆者はこの割り算の表記が少し苦手だ。
51 ≡ 1 (mod (9+1)) の方が、今回の場合はより本質的に割り算のあまりを表現出来ていると思うが、
誰にも伝わらないよりかは一般に広まっている表現が良いと考え、あえて小学校の割り算の表記を用いた。

ソースは俺

前提条件:

  • プレイヤーはCPUと交互に+1から+ 9 の範囲の整数を宣言し、その合計値が 51 に到達した時点の宣言者が負ける。

  • 先攻、後攻をじゃんけんで決める。

  • 宣言できる整数の回数に制約は存在しない。

51 にしてもらうには?
50 を渡せば良い
50 を渡すためには?
41-49 を貰えば良い
41-49 を貰うためには?
40 を渡せば良い
40 を渡すためには?
31-39 を貰えば良い
31-39 を貰うためには?
30 を渡せば良い
・・・・・・
10 を渡すためには?
1-9 を貰えば良い
1-9 を貰うためには?
0 を渡せば良い

ここで、宣言できる数字に 0 は含まれていないため、先攻は勝利しない

3.2章: n を数えたら負けゲームのルールを変えれば必勝法の定理に抗えるのか?

さて、では勝てない先攻を少し勝たせてあげたくなるので、宣言できる数字に 0 を含ませたくなる。

しかし、やはり、先攻は勝利しない。

なぜか?
平等なルールであれば後攻も(実質的な「先攻」となることを避けるために) 0 を宣言するため、将棋でいう所の「千日手」となってしまうからだ。
すなわち、永遠に誰も勝利することが出来ないゲームと化す。

また、当然だが、負の整数を含めてもゲームは終了しない。

3.3章: n を数えたら負けゲームのルールをもっと一般化……は難しくなりすぎるので考えるのを辞めた

さらなる一般化の方向性としては、例えば連続しない正の整数しか宣言できないゲームにしたらどうか?といったものが挙げられる。

簡単な例で言えば、偶数縛りだったらどうなるか?など。
偶数縛りだと整数間の差が一定(差が全部2)なので、ここでは証明までは興味ないしやらないが、元ルールの先攻が勝利する条件を用いれば簡単に条件が出せそうだ。

複雑な例で言えば、素数縛りだったらどうなるか?が今思いついたものだ。
これは整数間の差が一定ではないし、そもそも m を素数とした時の条件の数式化が難しそうだ。

4章: 各数字の宣言回数に制約を設けても必勝法の定理は使えるのか?

加えて、一般化とはちょっと違うが、宣言できる数字の回数に上限を設けたら先攻が勝利する条件は変化するのか?だ。

例えば、ジョーカーを除いたトランプを2組だけ用意して、2人のプレイヤーに1組(52枚、1-13までの数字がそれぞれ4枚ある)ずつ配分して、トランプのカードを数字の宣言として消費するゲームを仮定する。

トランプの数字の上限は13であるから m は 13 であり、m+1=14 で割り切れる 140 を n とした場合、先攻は勝利するだろうか?

無限に同じ数字が宣言できた状況と比べて、後攻には「反撃手段」があるように見える。
なぜならば、常に先行に特定の数字を宣言させるよう後攻が数字を宣言することで、先行の特定の数字を0にさせることが出来るからだ。

勝利条件メモ
139←125←111←97←83←69←55←41←27←13
↑右から見て、先攻は後攻に対して合計値を13にして渡す、27にして渡す、・・・、139にして渡す、という見方だ。

ソースは俺
先攻は、初手で13を使うしかない。が、もし後攻が 1 を出したら?
14を貰った先攻は、27にしたいので13を使う。さらに、後攻は1を出す。28になる。
28を貰った先攻は、41にしたいので13を使う。さらに、後攻は1を出す。42になる。
42を貰った先攻は、55にしたいので13を使う。さらに、後攻は1を出す。56になる。(ここで先攻の13、後攻の1が消える)
├56を貰った先攻は、69にしたかったが13が無い。後攻に主導権を与える訳にはいかないので、12を出す。
│└68を貰った後攻は、69にしたかったが1が無い。先攻に主導権を与える訳にはいかないので、2を出す。
│ 70を貰った先攻は、83にしたかったが13が無い。後攻に主導権を与える訳にはいかないので、12を出す。
│ 82を貰った後攻は、83にしたかったが1が無い。先攻に主導権を与える訳にはいかないので、2を出す。
│ 84を貰った先攻は、97にしたかったが13が無い。後攻に主導権を与える訳にはいかないので、12を出す。
│ 96を貰った後攻は、97にしたかったが1が無い。先攻に主導権を与える訳にはいかないので、2を出す。
│ 98を貰った先攻は、111にしたかったが13が無い。後攻に主導権を与える訳にはいかないので、12を出す。(ここで先攻の12が消える)
│ 110を貰った後攻は、111にしたかったが1が無い。先攻に主導権を与える訳にはいかないので、2を出す。(ここで後攻の2が消える)
│ 112を貰った先攻は、125にしたかったが13が無い。後攻に主導権を与える訳にはいかないので、11を出す。
│ ├123を貰った後攻は、125にしたかったが2が無い。先攻に主導権を与える訳にはいかないので、3を出す。
│ │└126を貰った先攻は、139にしたかったが13が無い。後攻に主導権を与える訳にはいかないので、11を出す。
│ │ 137を貰った後攻は、139にしたかったが2が無い。1も無い。3を出すしかない。後攻の負けだ。
│ └123を貰った後攻は、125にしたかったが2が無い。先攻に主導権を与える訳にはいかないので、4を出す。
│  ├127を貰った先攻は、139にしたかったが12が無い。後攻に主導権を与える訳にはいかないので、11を出す。
│  │└138を貰った後攻は、139にしたかったが1が無い。2も無い。3を出すしかない。後攻の負けだ。
│  └127を貰った先攻は、139にしたかったが12が無い。後攻に主導権を与える訳にはいかないので、10を出す。
│   └137を貰った後攻は、139にしたかったが2が無い。1も無い。3を出すしかない。後攻の負けだ。
└56を貰った先攻は、69にしたかったが13が無い。適当に1を出す。
 └57を貰った後攻は、69にしたいので12を使う。さらに、何かを閃いた先攻は2を出す。71になる。
  71を貰った後攻は、83にしたいので12を使う。さらに、先攻は2を出す。85になる。
  85を貰った後攻は、97にしたいので12を使う。さらに、先攻は2を出す。99になる。
  85を貰った後攻は、97にしたいので12を使う。さらに、先攻は2を出す。99になる。(ここで先攻の2、後攻の12が消える)
  99を貰った後攻は、111にしたかったが12が無い。諦めて適当に2を出す。
  101を貰った先攻は、111にしたいので10を使う。さらに、何かを閃いた後攻は4を出す。
  115を貰った先攻は、125にしたいので10を使う。さらに、後攻は4を出す。129になる。
  129を貰った先攻は、139にしたいので10を使う。後攻の負けだ。

といった形で、宣言できる数字に上限があると元ルールのロジックだけでは先攻が勝利するとは断言できない状況が発生する。

だが、適当に数字を出してもなんだかんだ先攻が勝利している。

今、筆者は仕事で疲れてあんまり頭が回っていないのもあり、なんだかなぁという気持ちだ。もうめちゃくちゃ

4.1章: 各数字の宣言回数に制約を設けるとワンチャン面白い

それに、極端な話。
n が増大すると、やはり勝者は不在となる。
なぜならば、先攻も後攻も有限回しか数字を宣言できないからだ。

トランプ1組の数字を全て足すと、4Σ_{k=1}^{13}{k}=491=364である。
2人いても、1000に届かない。すなわち、1400なんかをnに設定すると、先ほどのルールでは勝者が不在となる。平和だね。虚無とも言う。

とにかく「宣言できる回数に上限を設けるとゲーム性が向上するのではないか?」という気持ちと「いや、でも結局先攻が勝ってんじゃねーか。はぁ~、つまんな」という諦観の気持ちの両方がある。どっちやねん

5章: 結論(原文)

だいぶ深く考えてみたが、もう疲れたし明日も忙しいので結論としては以下だ。

前提条件:

  • プレイヤーはCPUと交互に+1から+ m (ただし、mは2以上の任意の正の整数)の範囲の整数を宣言し、その合計値が先攻が勝利する適当な正の整数 n に到達した時点の宣言者が負ける。

  • 先攻、後攻をじゃんけんで決める。

  • 宣言できる整数の回数に制約は存在しない。

このとき、任意の整数 m に対して、先攻が勝利する n の条件は「n を (m+1) で割り算した時、余りが 1 以外である」である。

後書き

んで、悪用する場面はこんな感じか。

Tom「先に20になったら負けになるゲームやろうぜ」
You「いいぜ、俺後攻で良い?
Tom「(こいつ、先攻が勝つって知らないのか)いいぜ」
You「(20÷□=△あまり1になる整数は19しかない、つまりm+1が19ということは……)代わりに宣言できる数字は+1から+18で良い?
Tom「は???」
You「あれぇ~?」

必勝法の定理、使えねぇ~~~~💢💢💢💢
終わり💢💢💢💢💢💢💢💢💢💢💢💢💢💢💢💢💢←これ強素数17個分の💢wwwwwwwwwwwwwwww

この記事が気に入ったらサポートをしてみませんか?