見出し画像

超動くマンカラ番外編:カラハ一人勝ち問題(2)~「カラハ一人勝ち問題」の数表をスプレッドシートで作成してみる

「超動くマンカラ」。
前回のnoteから、だいぶん経過してしまいました。

今回は、番外編の続きを書きます。

「カラハ一人勝ち問題」の数表をつくっていきます。

手作業だとやっぱりハタンした

カラハの追加アクションを繰り返して、1手ですべての石を取る配列を考えるのが「カラハ一人勝ち問題」です。
この配置を考え方については、第3回目に書きました。

そして、下の方法を用いれば「ある個数の石での配列がつくることができれば、それに1つ石を加えた配列をつくることができるので、結果、無限個の配列をつくることができる」のです。

【作り方】
(1)大穴の手前からみて、1番手前の石が入っていない穴に石を入れていく。
(2)石の入れ方は、(1)できめた穴の途中にある穴から1個ずつ石を取り、さらに大穴の文から石を1個取り、すべて入れる。

何書いているのかさっぱりわかりませんね。
例をだして、まずは通常のマンカラ(カラハ)をプレイしたときの手順を追ってみます。

上が石16個の配置です。
左の大穴から3番目の穴(赤丸)には石が3個あるので、
下のように石を播くと、ピッタリ大穴で終わります。
失敗例も上げます。
同じく、石16個の配置。
左の大穴から6番目の穴(赤丸)には石が6個あるので、
下のように石を播くと、ピッタリ大穴で終わります。
ただし、3番目の穴(青丸)の石が4個になってしまいます。
この穴の石を播くと大穴を超えてしまうので、失敗になります。
【作り方】の例です。
上が石15個の配置です。
左の大穴から3番目の穴(赤丸)に石がない(0個)なので、
下のように大穴と手前の石から石を1個拾い、
3番目の穴(赤丸)に拾った石を播くと、石16個の配置になります。

【作り方】を延々と繰り返すことで、

上のような「ひとりマンカラの解答数表」を手作業でも作り上げることができます。
ただし、人間ですからそのうち計算ミスを犯します
自分も計算ミスを発見修正しながらつくってみました。
結果、石700個くらいでもうミスがわからなくなってハタン。
断念しました。
しかし、前回の番外編では石2520個の解答をお見せしております。
それもこれも、表計算アプリ(スプレッドシート)で、ちまちま数式をコピーペーストし続けて、計算したもらった賜物でございます。

解答を計算する数式

最初に、表計算アプリでどうしたのかをお見せします。
使用した表計算は「Googleスプレッドシート」です。

一番最初の行には、大穴から数えて何番目にある穴を示すためセルに数値をあらかじめ記入します。
一番最初の列には、石の数を示すためセルに数値をあらかじめ記入します。
(※念の為、0個の場合の解答を(二番目の行の右寄せ表示のセルに)あらかじめ記入しています)。
石1個の場合の1番目の穴のセル(B3)に、数式

=IF(OR(A2=A3,A3=A$1),B2,IF(B2=0,B$1,B2-1))


を記入して、ほかのセルにひたすらコピーペースト
以上です。

……でも、なんでこんな数式なの?って話ですよね。
どのように表出したのか、例をあげながら説明してみます。

数式の準備段階

例として、石33個から石36個の解答を用います。
これらの解答で、穴にある石の数がどのように変化しているのか見ていきます。

【注意点】一番左のセルは「大穴」であり、かつ「それぞれの穴にある石の合計数」もあらわしています。

◆石33個→石34個

同じ変化をしている穴には、同じ色をつけています。
<赤>:石の数は前の解答から1個少なくなっています。
<黄>:大穴から一番近い石のない(石0個の)穴。はなれている数だけの石を置いています(今回の場合は、10番目の穴なので、石を10個播いています)。

◆石34個→石35個

こちらも、同じ変化をしている穴には、同じ色をつけています。
<黄>:大穴から一番近い石のない(石0個の)穴。はなれている数だけの石を置いています(今回の場合は、1番目の穴なので、石を1個播いています)。
<緑>:石の数は前の解答と変わりません。
<青>:石の数は前の解答と変わりません。

<緑>と<青>をあえて分けているのは、次の例で説明します。

◆石35個→石36個

先にあげた2つの例が、混在しています。
<赤>:石の数は前の解答から1個少なくなっています。
<黄>:大穴から一番近い石のない(石0個の)穴。はなれている数だけの石を置いています(今回の場合は、10番目の穴なので、石を10個播いています)。
<緑>:石の数は前の解答から変わりません。
<青>:石の数は前の解答から変わりません。

<緑>と<青>の違いですが、これは手前の穴の変化で分けています。
<青>の手前の穴は、<緑>もしくは<青>です。
どちらも石の数は前の解答から変わりません
<緑>の手前の穴は、<黄>です。
前の解答から石の数は変わっています

次に、<赤>と<黄>を見ます。
どちらも手前の穴は<赤>なので、石の数は前の解答から1個少なくなっています(ただし、大穴から一番手前の穴が例外。これについては後述)。
<赤>と<黄>の違いは、前の解答では穴の中に石があるかないかの違いです。
石があると、石を1個減らし(<赤>)、石がないと、大穴からはなれている数だけ石を置きます(<黃>)。

これら4つに分けた状態(<赤><黃><緑><青>)を、数式として落とし込みます。


数式の内訳

=IF(OR(A2=A3,A3=A$1),B2,IF(B2=0,B$1,B2-1))

セルの番号を書き表すと、

+ーー+ーー+
|A1|B1|
+ーー+ーー+
|A2|B2|
+ーー+ーー+
|A3|B3
+ーー+ーー+

です。1の行には「何番目の穴」をあらかじめ記入してあります。
今回の場合は、B3が値を求めたい穴になります。
※2の行は、1個石の少ないすでに解答がある状態で、Aの列は、求めたい穴の手前の穴です。

数式には2つの関数が使われています。
大雑把に説明すると、

・IF(A,B,C)
 Aを判断して、正しいとBの数値に、違うとCの数値にします。
・OR(A,B,……)
 A、B(もしくはそれ以上)を判断して、少なくとも1つが正しければ、正しいとします。

です。
では数式「=IF(OR(A2=A3,A3=A$1),B2,IF(B2=0,B$1,B2-1))」を、分解しつつみていきます。

【注意】
数式に「$」があります。
「$」は数式をほかのセルにコピーペーストするときに関わる記号なので、判断や数値には直接関わりません。
今回はこの程度の説明でとどめます。

まず、OR(A2=A3,A3=A$1)。
「A2=A3」:手前の穴の石の数は変わっていない。
<青>
が当てはまります。
「A3=A$1」:手前の穴の石の数が「大穴から何番目の穴の数」と一致している。
<緑>
が当てはまります。

したがって、<青>と<緑>に入る数値はB2……前の解答と同じ石の数になります。
ということで、当てはまらなかった<赤>と<黃>は、IF(B2=0,B$1,B2-1)に回ります。
「B2=0」は、前の解答では穴にある石の数が0個
<黃>が当てはまります。
なので、<黃>に入る数値はB$1……「大穴から何番目の穴」の数値が入ります。
結局当てはまらずに残ったのは<赤>。<赤>に入る数値はB2-1……前の解答の数から1減った数値になります。

ところで、例外としていた「大穴から一番手前の穴」ですが、この数式で上手い具合に<黃>と<赤>に割り振っています
例外解消。

締め

ということで、またゲームからかけ離れた内容となってしまいました。
折角なので、石1000個までの「ひとりマンカラ解答数表」のファイル(csv形式とtsv形式)を添付します。

いや、なんの役に立つんだ、これ。

次回もよろしくお願いします。
では。

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