6面ダイスで24通りの出目を出す方法

6面ダイスには6個の面があるので、振れば1~6の乱数が得られます。当たり前ですね。
そして8個の頂点があるので、頂点で振れば1~8の乱数が得られます。当たり前ですね。
さらに12個の辺があるので、辺で振れば1~12の乱数が得られます。当たり前ですね。

箱の角にダイスを投げると頂点で振れます。

f:id:syaik:20220301203206j:plain

135が出ました。8個の頂点の中では小さめの数ですが、123よりは大きいです。124よりも大きい。125……は2と5が同時に出ないので存在しなくて、126もなくて、134もあり得ないので、下から3番目、つまり3の目が出たことになります。
めんどくさ。なんかもっと簡単に1~8を特定できる方法ないんですか。

頂点にあつまる数を合計してみると、偶然にも被りがないことが分かります。

123 → 6
124 → 7
135 → 9
145 →10
236 →11
246 →12
356 →14
456 →15

ので、合計値から6引いて、1と2が出てたら1足して、5と6が出てたら1引くと1~8が得られます。
めんどくさ。なんかもっと簡単に1~8を特定できる方法ないんですか。

とりあえず上の表を眺めてみましょう。どの数字も4回ずつ登場していることが分かります。
1が出るのは表の上半分、6が出るのは下半分です。1と6は裏表なので同時に出ることはありません。
他の裏表である2と5はどっちが出ているかを見ると、上から2,2,5,5,2,2,5,5で、3と4は3,4,3,4,3,4,3,4で、あ、これ2進数だ。
2進数なので、裏表になっている3ペアそれぞれに0or1,0or2,0or4を割り当てます。
割り当てますっていうか、もう1と2と4が存在しちゃってますね。
ということでできました。頂点で振って出た3面のうち、1と2と4だけ合計すれば0~7の乱数が得られます。
8面ダイスは6面ダイスで代用できるということです。双対です。


同じ頂点でも3通りの出方があるので、全部別の目とみなせば3倍して24通りの出目を得られます。
例えば、3つのうち一番大きい数が左上に出たら+8、右上に出たら+16するとか。

6面ダイスは実は24面ダイスだったということですね。これからは24個から1個選ぶときに迷わなくて済みます。何時に寝て何時に起きようとか、全部サイコロに任せて気楽に生きてきましょう。

じゃんけん10連勝

「1024人でトーナメントをすると必ず10連勝する人が現れる」的な話がありますが、もし実際に私がそんな大会を開くとしたら、残った1023人で敗者復活戦をやってもう一人10連勝者を出し、11連勝者を作りたくなるでしょう。
同様に、時間をかければ12連勝や13連勝も作れるはずですし、1024人も集めずとも10連勝者は作れるはずです。

大会のルールを以下の様に決めます。
・じゃんけんは勝敗がつくまでを1勝負とする。あいこを挟んだ場合も連勝数は継続する
・じゃんけんは常に自分と同じ連勝数の人間と行う。存在しない場合は現れるまで待機
・全員が自分の対戦相手を見つけ、じゃんけんを1勝負するまでを1回戦と数える
で、N人でX連勝者をつくるには何回戦行えば確定するか、という問題です。

最初のトーナメントでは、log(2)N 回戦で log(2)N 連勝者が作れます。
0連勝者、すなわち直前のじゃんけんで負けた人は初回以外常に N/2 人存在するので、2回戦目以降は毎回 N/2 人による敗者復活トーナメントが発生する感じになります。
N/2 人のトーナメントは Log(2)N-1 回戦で Log(2)N-1 連勝者を作り、これは Log(2)N 回戦目以降毎回1人ずつ供給されて、2人になった次のじゃんけんで Log(2)N 連勝者と0連勝者に別れます。

ログとかよく分かんないんで、Excelにぶっこんで計算させた方が早いです。

f:id:syaik:20190302201914p:plain



縦軸は何回戦目か、横軸は連勝数で、各数字はy回戦目にx連勝した人間が何人いるかを示しています。
1024人でやった場合、10回戦で10連勝者が出現し、13回戦で11連勝者、18回戦で12連勝者が出るってことですね。
一般的に、Nが十分に多ければ log(2)N 回戦で log(2)N 連勝、そこから+3回戦で+1連勝、+8回戦で+2連勝、+17回戦で+3連勝となります。
十分に大きくない場合は自分と同じ連勝者がいなくて待たされる人が増えるので、これより効率が落ちます。
100人でやると10連勝者が出るまでは30回戦。これくらいなら現実的かな?

人数と必要な回戦数はこちら

11 348
12 294
13 260
14 234
15 210
16 189
17 175
18 163
19 151
20 140
30 89
40 65
50 53
100 30
200 19
300 15
400 14
500 13


草野球でみんな集まったのに雨が降っちゃったときとかに、「じゃんけん163回勝負やろうぜ!」などと提案してみましょう。

モールス信号

英語のモールス信号は効率的だけど、日本語はそうでもないというお話。

モールス信号が考えられたとき、アルファベットにどんなトンツーを当てるかは文字の出現頻度によって決めたらしいです。
英語でよく出てくる E とか T は「・」「-」と短く、出てこない Q は「--・-」と長い。
通信時間を減らすための工夫です。

で、日本語で通信するための和文モールス符号というのが作られたとき、各ひらがなの符号をどうしたかというと、いろは順にアルファベットの符号を当てて、い=A=「・-」 のようにしていったとのこと(足りない分は記号とか)。
効率面は考慮されておらず、例えば「・」「-」はそれぞれ「へ」「む」ですが、これは日本語の中でもまるで出てこない音です(下から3位と2位。最下位はぶっちぎりで「ぬ」)。

というわけで、和文モールス符号がどれくらい非効率なのか調べてみました。
某所から五十音の出現頻度表をもってきて、モールス符号用に小文字を大文字にして濁点,半濁点を分解します。
モールス符号の長さはツーが3トン、トンツーの間隔が1トンと決まっているらしいので、この計算で短い符号に頻度の高い文字を当てはめていきます。
できたものがこちら。

f:id:syaik:20180802004203p:plain

出現頻度と符号の長さの積、すなわち1文字あたりの平均符号長は通常版が9.916トンのところ改良版が7.581トンで24%減。
文字と文字の間は3トンの空白を入れることになっているらしいので、これを含めると18%減です。
実際のところは、適当なところに空白(7トン)を入れた分かち書きにする必要があるのでもうちょっと下がります。
ちなみに、順位を反転させた「最悪の和文モールス」は1文字平均13.75トンでした。

うーん、この数字ってどうなんだろ。もっとデカい数字が出てきて「ローマ字の方が早いじゃねーか!」みたいな結論になったら面白かったんですが、さすがにそんなことはないみたいですね。
よくみると、アルファベットの順番をそのまま当てただけではなく少しずれている箇所があったり、最も頻繁に出てくる濁点が「・・」になっていたりするので、もしかしたら効率のことも少しは考えていたのかもしれません。


実際に適当な文章に適当に空白を入れてモールス符号化してみると、通常版が5961トン、効率化版が4707トンで21%削減でした。


今後の展望
同じ情報を英語と日本語にしてそれぞれモールス信号で送ったらどっちが勝つんですかね。
私の英語力では不可能なのでニュース翻訳サイトとか調べてみましたが、あんまり使えそうな感じのはありませんでした。
あと、日本語の文字出現頻度表っていっぱいあってどれを使えば良いのかわかんないですね。
10万文字中に「ぢ」が1件のデータと0件のデータがあって、どっちを使うかで大きな差が...出ないですけど。

ハノイの塔

ネタ切れなので、今回はお蔵入りだったはずのボツネタです。

ハノイの塔というパズルがありまして、簡単に言えば「インドのお坊さんが世界を破滅させるために物凄い速さで円盤を上げ下げするけど時間がかかっちゃって大変」というものです。
例によって細かいルールはWikipediaとかを読んでください。

 

さて、こいつはアルゴリズムとか再帰的処理で良く知られていて、「どんなアルゴリズムで解けるか」「最短手数は何手か」というのが問題になったりします。
ですが、パズルとして考えるとなんというか...あまりに簡単じゃないですかね。アルゴリズム的に考えなくても、適当に動かしていれば大体最短手数でクリアできちゃうと思うんですよ。


いや、ちょっと盛りました。
途中で間違った動かし方をしたとしても、少し進めば「今の手順が間違っていること」「どこでどうすれば正しかったか」が分かるので、その度に「ごめん、さっきの間違ってたからやりなおすわ」ってけばおのずと最短手順になるんじゃないですかね。

迷路でたとえるならばこんな感じ。

f:id:syaik:20180701224245p:plain


行き止まりに着いたら前の分かれ道まで戻ってやり直すだけで自動的に最短ルートが見つかります。

対して、複雑なパズルというのはこんな感じ。

f:id:syaik:20180701224638p:plain


Aルートはゴールできませんが、「ゴールできない」ことを発見するためには時間がかかるかもしれません。
B~Dはどれもゴール可能ですが、どれが最短かは全てのゴール可能なルートを発見して比較しなければ分かりません。

ようするに、ハノイの塔は前者なんじゃねっていう主張です。

 

さて、ハノイの塔では円盤の位置は有限通りで、ある状態からの動かし方は3通りしかないため、状態遷移図を描いてみるのが良さそうです。
状態の表し方として、小さい円盤から順に置いてある棒の番号を並べることとします。
例えば、円盤が3枚のときに[111]は全て1番の棒に刺さっていること、[112]は最小円盤と中円盤が1番の棒に、最大の円盤が2番の棒に差さっていることを表します。円盤は必ず大きい順に刺さるため、複数の円盤が同じ棒の中で何番目か、ということは考える必要がありません。

初期状態は[111]で、ここからできることは最小円盤をどちらかの棒に移す2通りです。どっちに移すのも同じなので同一視して1通りと見なしてもいいのですが、今回は左右対称とかも全て別状態と見なします。
移した後の状態は[211]か[311]。この2つの状態は互いに行き来できますし、[111]に戻ることもできます。
図に表すとこんな感じ

f:id:syaik:20180701224925p:plain

おやおや、これってばシェルピンスキーのギャスケットだ。
フラクタルというやつで、円盤の数を増やしても同じような形になるというやつ。
例えば、円盤を3枚→4枚に増やすと、
1. 円盤を1枚足す毎に状態の数は3倍になる([111]が[1111][1112][1113]の3つに分裂する)ため、上の図を3個描く

f:id:syaik:20180701225043p:plain


2. 一つの三角形から別の三角形への移動は、一番大きい円盤を動かすことと等しいため、三角形の頂点から以下の様にしか移動できない。

f:id:syaik:20180701225104p:plain


3. 繋がりを保ったまま、良い感じに図を動かす

f:id:syaik:20180701225239p:plain


という感じで、以下円盤4枚→5枚以降も同様です。


さて、次はこのパズルを解く人がどう動くのかを検証します。
まず、以下の場所は明らかに通る意味が無い場所です。
f:id:syaik:20180701225118p:plain
次に、以下の動きも明らかな無駄です。

f:id:syaik:20180701225346p:plain


こういう動きをしそうになったら「やっぱやーめた」って言って[231]まで戻ります。
となると、ゴールまで行けるルートはこの2つだけ。

f:id:syaik:20180701225358p:plain


うっかり間違って迂回ルートを進んでしまった場合、[312]→[322]あたりで遠回りしていることに気づいて、
気づい...気づけるのか?

うーん、一番上の円盤は他の円盤に関係なく1手で好きなところへ動かせるから無いものと考えると最小の三角形は一つの点と見なせて再帰のレベルが1つ下がるので無駄ルートだと気づける、としても円盤の数が多くなって再帰のレベルもそれだけ多く下げようとするとルートが無駄かどうかも再帰的に考えなきゃなくなるし判定のために必要な過去の道筋も再帰的に増えるので
ので、
ということで、
つまり、ボツ!

4次元将棋

3次元将棋とか3次元チェスというものがあるらしいですが、私は常に他人の一歩上を行っているので4次元将棋を考えてみました。
3次元将棋に時間軸移動である「待った」を足して……というのは置いといて、
将棋盤は9×9ですが、3×3×3×3だと考えると4次元にぴったりだと思いませんか。

まず、3×3の9マスだけで考えます。
中心のマスからみて、上下左右のマスは以下の4マスです。

f:id:syaik:20180314230554p:plain


高さ方向のマスは、3×3を重ねたときの以下の場所。

f:id:syaik:20180314230701p:plain


4次元方向は、3×3が重なったやつを横に並べて以下の場所。

f:id:syaik:20180314230716p:plain


将棋盤に落とし込むと、こんな感じ

f:id:syaik:20180314230731p:plain


中心を変えるとこんな

f:id:syaik:20180314230739p:plain

さて、ここに将棋の駒を配置していきましょう、というところで問題があります。
どの方向にも2マスしか移動できないため、盤面が狭いんです。
それでいて駒の移動力は強くなるわけで、たぶんゲームバランスはめちゃくちゃ。
ていうか私は将棋が全然ダメなので、ゲームバランスがめちゃくちゃになるのか検証することもできません。

よし、はさみ将棋にしよう。

f:id:syaik:20180314230759p:plain

4方向どれでも、相手を挟んだら取れます。
以下の状態では、左下の歩を動かせば と を挟んで取れるわけです。

f:id:syaik:20180314230809p:plain

敵も自動で動くようにしました。
思考ルーチンはとりあえず「挟めるときは挟み、それ以外はランダム」というだけの雑魚。
まずは軽く肩慣らしと思いきや、うーん、なんだか脳ミソの普段使ってない部分を使ってる感がするぞ。
よーく考えてきゃこんな雑魚には負けないのですが、うっかりすると刺されます。
たとえば、下の青いのが私の指し手ですが……。

f:id:syaik:20180314230821p:plain
思いもよらないとこから取られると思わず時間軸移動したくなっちゃう。

 

 

今後の展望
思考ルーチンに「取られそうなときは逃げる」を足しただけで超強くなりそう。
ゲーム性としては、盤面が狭いせいで端が強いので待ちゲーになる気がします。何か良い追加ルールがあればいいんですが。

そういえば、チェス盤って8×8じゃなくて2×2×2×2×2×2に見えてきませんか?

ガチャ

一部で話題のガチャガチャ東京メトロ立体路線図。欲しいんですが、高いんです。
1回300円で前半4種と後半5種をすべて揃えるには期待値19.75回の5925円。5秒で飽きるだろうものに出す金額ではないですね。
では、どうやったら安く揃えられるのでしょうか。
答えは人と協力することです。ダブったものを交換することで互いに補い合うのです。ああすばらしき助け合いの世界。

さて、複数人の協力はどれくらいお得なのでしょうか。ググっても出ないので計算しました。

その前に1人でガチャコンプを目指す場合の期待値ですが、これは種類数をNとして
N(1+1/2+...+1/N)
で求まります。
考え方としては、
・持っている種類を0→1にするには、何を引いてもいいので期待値は1回
・1→2にするには、前回の以外を引けばいいので期待値はN/(N-1)回
・n→n+1にするには、(N-n)/Nを引けばいいので期待値はN/(N-n)回
で、全ての期待値の合計です。

次に、2人で協力する場合を考えます。
1人の場合、「持っている種類」の状態は(N+1)個でしたが、今回「X種類は2個以上持っていて、Y種類は1個だけ持っている」を1状態とカウントするので、全部で (N+2)C(2) = (N+1)(N+2)/2 種類。
ある状態から1回ガチャって行ける次の状態は、「1個だけ持っているものの2個目を引く」「1個も持っていないものの1個目を引く」の2通りあるので、これを図にするとこんな感じ。

f:id:syaik:20180203134742p:plain
さらに、「今の状態から次の状態に行くために回す数の期待値」と、「次の状態が2つあるとき、どの確率でどちらが選ばれるか」を書き加えたものがこちら。

f:id:syaik:20180203134825p:plain


ここで、スタート地点からコンプリートまで行くルートをひとつ選び、通り道のガチャ回数期待値の合計に、通り道の倍率をすべてかけたものを、そのルートの期待値とします。
以下の図では、2つのルートについて期待値を出しました。

f:id:syaik:20180203134911p:plain
そして、すべてのルートの期待値を合計したものが全体の期待値、すなわち2セットコンプリートするまでのガチャ回数の期待値となります。

N=4だとルートは14通りありますが、これをまとめて計算するためには、ためには、、、、ためにはどうするんですかわかんないでした。
この辺で降参して、ここからは例のごとくコンピュータ様に丸投げします。
2セットコンプリートの期待値を計算したものがこちら

f:id:syaik:20180203135059p:plain
実際にガチャを10万回ほど回して確かめてみると、合っていることがわかります。
ルート毎の倍率を見ると、平均的に真ん中ちょい上のルートを通る感じになります。
つまり、1人でコンプするときの確率をPとして(P+N)/2 ちょい少な目というのが悪くない近似と言えましょうか。

3セット以降も10万回ほどブン回し、頭数で割ったグラフがこちら

f:id:syaik:20180203135351p:plain

 上から、1人でガチャる場合の期待値、2人でガチャる場合の1人あたりの期待値、~5人での期待値です。

ということで、助け合いの大切さが数学的に証明されたわけです。
みんなでガチャれば怖くない。協力して立体路線図を完成させましょう。
人が多ければ多いほど期待値は 300*9=2700円 に近づいて、
まぁ、3秒で飽きそうなものに出す金額じゃないですね。

手を2回叩いてから溜めたり攻撃したりするやつ

以前あれについて考えましたが、今回は別のあれをあれします。
Wikipedia「手を用いた遊び」でいうところの「手を2回叩いた後攻撃などのアクションをする遊び」です。
今回はめんどくさがらずにルール説明をしてあげましょう。

 

①2人のプレーヤーが同時に行動を選択する。(手を2回叩くのはリズムをあわせるためなので今回は無視する)
②選択できる行動は、「溜め」「攻撃」「防御」の3種類
③溜めを選択した場合、パワーを1得る。
④攻撃を選択するためにはパワーを1消費する必要がある。相手が防御していない場合に勝利する。
⑤防御を選択した場合、相手の攻撃を防ぐことができる。パワーは消費しない。
⑥以上を、どちらかが勝利するまで繰り返す

 

ローカルルールが非常に多いですがダルいので無視。
無限防御戦法を無くすために、一定パワー溜めたら勝利(もしくは防御貫通攻撃が出せる)というルールだけ加えましょう。
上限は5とか8とからしいですが、簡単のために3とし、両者同時に3まで達したら引き分けです。

行動は全て自分のパワーと相手のパワーだけで決定することにします。
つまり、防御防御でお見合いのときにいつ溜めに移行するか、みたいな心理戦は考えません。
防御防御やその他の無限ループは引き分けです。

以下、自分のパワーがX,相手のパワーがYの状態を(X,Y)と書くことにします。
パワーの状態は9通り、行動が3通りなので3^9通りの戦法があります。
実際には、
・自分のパワーが0の時は攻撃できない
・相手のパワーが0の時は防御しない
・(0,0)は溜めで確定
・(2,0)は溜めで確定(上限まで溜めて勝利なので)
・(0,2)は溜めで確定(何を出しても相手の溜めで負けなので)
という制約がつくので、2^2*3^4=324通りだけ確かめれば良いです。

324通りで総当りし、勝利数-敗北数を計算すると、ほぼ同じ作戦2つが同率1位となっていました。
それがこちら

f:id:syaik:20180118225822p:plain


116勝57敗151分けの勝ち越し59ですが、勝利数だけなら126勝の作戦もいくつかあります。

作戦の強さの傾向を調べるために、戦法を図にしてみます。

f:id:syaik:20180118225858p:plain


青が溜め、黒が防御、赤が攻撃。下のグラフは勝利数-敗北数で、黄色は勝率50%ラインです。
明らかに見えるのは、(1,1)溜めが弱いということ。(1,1)は必ず出現する場面ですが、ここで攻撃が強そうです。
パワーが0か1かは重要ですが、既に1あるのに2にしても効果が薄いということでしょう。
パワー3で勝利にも関わらず、自分のパワーが2のときに溜める戦法が微妙に弱そうなのも裏づけっぽいです。
(1,2)も大体(1,1)と同じ傾向ですが、攻撃が防御されると負け確なのでリスクがあがっています。
(2,1)と(2,2)は、高レベルの戦いではほぼ差が見られませんが低レベルでは攻撃が強め。
(0,1)は防御が強めですが、勝ちにはいけません。

 

結論としては、とにかく攻撃しとけって感じです。
実際に、パワーがあるかぎり攻撃する脳筋作戦が勝ち越し54で3位(同率で84戦法)です。
パワー上限3でこれなんですから、5とか8とかのときは防御貫通攻撃なんか狙っちダメですね。


今後の展望

今回、行動選択はパワーにしか依存していませんでしたが、今までの相手の選択を考慮に入れると強いAIができそう。
また、明らかに弱い戦法を除外したり、強い戦法の弱点を突く戦法を評価したりするとメタゲームが生まれます。
ローカルルールも色々ありますが、防御にもパワーが必要とかパワーを沢山使って何かするというのばっかりでますます攻撃が有利になる一方。バランス取れるようなルールでも考えてみましょうか。