Bombeとかいうゲームについての手記 その6
前回に引き続き実行時重いのでその対応です。
もうこれだけやってて一つもセルをクリアできていないヤツは削除しちゃっていいのでは?と思いましたので、そのようにしてみます。どうせ最適化もできてないほうが多いですし……。
一応この記事にコピペしておきます。
Bombe Rules (14):
💣⠨⢵⠯⣽⡣⡂⣯⠺⠅⡫⠈⢭⠊⠀⢢⠈⠙⠘⢀⠹⡭⡸⣕⢟⠻⡮⠽⡬⢙⠉⠩⢛⣜⢔⠢⡻⣧⠱⡃⠆⠲⠕⢋⢀⣝⣍⣮⣮⡥⢐⢲⠎⢍⣊⡟⠵⢯⢮⣫⡹⠴⢪⠹⡙⢞⢾⠮⡕⡍⠪⡝⣷⣞⡵⡞⢿⣞⠭
⢗⣵⡤⣖⣤⣫⡼⢊⣵⡛⡮⠢⢡⢦⣏⢷⠃⠎⠣⢁⡈⢎⢒⢜⠺⢌⠁⡲⡘⠄⢆⡅⠹⠄⢤⢰⠜⡃⠑⡞⢬⠀⡱⢒⡔⣒⠁⡀⡄⡀⡄⢤⣊⡌⠇⢯⢡⢪⡻⢻⣁⢌⢝⠁⣥⠤⢀⡆⣄⠆⢓⢲⡂⡿⠸⠷⣒⣥⢷⠥
⣊⢟⣣⡞⠅⢟⢺⢗⣫⢓⢢⠂⠦⣵⢻⠎⣴⢁⡺⢧⠒⡲⡿⣐⢁⢊⡋⣇⡤⠈⠂⢫⣨⢨⡱⡖⡮⠇⢽⡔⣡⣟⣌⣯⡐⡧⢼⢏⠩⢪⡢⠪⣒⣫⢨⣯⡧⢔⠊⡃⣏⡢⣙⡝⠹⢏⡼⠯⠡⣐⣒⣖⡄⠑⢜⢤⢕⠩⣍⠮
⠾⣧⡤⠪⢏⡑⢁⠈⡃⢶⡡⢧⢏⢴⣊⣙⡿⢔⣒⡺⢫⠇⣶⡂⢦⠱⠮⠇⢌⣶⢑⠺⢱⡠⢄⢪⣖⢙⠨⣗⣧⡆⠰⣝⢩⠤⢵⢖⢲⠝⡖⣞⣄⠔⠡⠱⠖⡄⣋⠉⡋⢕⣷⠍⠲⠗⢦⡳⡷⣺⣰⣄⡅⠏⠛⡺⡛⠖⢝⡭
⣞⡨⠍⢐⡱⡞⣞⡻⢱⣏⢑⢟⢵⠍⣹⣔⠜⡄⢶⡬⢿⠭⢟⣈⠛⡺⣃⠆⢹⠓⡳⢄⢇⠭⣋⡫⠁🛑
ううむ、それでも重い。次に最適化不足だけどセルのクリア自体はできちゃっているルールを見直しましょう。
![](https://assets.st-note.com/img/1728471561-7HOyqg3zB6YQeDIaTxCSf4vE.png)
これは重そう。簡単な盤面に直しましょう。
![](https://assets.st-note.com/img/1728471796-Z9MY5FdDkInXEi8H2cLKlugW.png?width=1200)
![](https://assets.st-note.com/img/1728472019-hwWlajE76xS2mnDOzRZ0isJK.png)
個数内訳を見ると、2-が全く意味をなしていないのがわかります。
a-bの個数によらず、常にc-d-eについては1,0,1または0,1,0または0,0,0,のどれかになります。つまりこの2-という情報が左のルールを右側に伝搬するのを防いでいるのです。
このルールが右側に伝搬するのを防いでいる状態は、一体何を元にしているのでしょうか?最初に着目するのは、a-eまでのすべての爆弾の個数の総和が一定以下であるという点です。
![](https://assets.st-note.com/img/1728472233-vcYbUTqoVg6RNzLjXneBs7Ea.png)
これは内訳表の通りですから、当然成り立ちます。しかも2-の部分の爆弾の個数によらず、すべての個数で成り立ちます。
![](https://assets.st-note.com/img/1728472300-1ZIzRH8n7QfqVUXoJPdcCADw.png)
一体何故すべての総和は3個以下なのか。?の個数は何個でもいいはずなので、0個として考えます。そうすると、1-と1-の2つの重ね合わせに、追加で一つ1-の情報指定が重なっている状態が見えてきます。
![](https://assets.st-note.com/img/1728472532-1sX2TnR8eZI0Q4SxPkbjCJVd.png)
1-と1-と1-が重なっているとき、それぞれの領域に1つずつあるとしても、最大3つしか爆弾は存在できません。なので、1-,1-,1-の3領域については常に3-であると確定できます。
![](https://assets.st-note.com/img/1728473115-VCuBtZqLcPNJ9WasYvH13IM6.png)
では?にできる領域が他に影響を及ぼさないのは何故でしょうか?それは上記の1-,1-,1-の三領域についてはすべてのマスが必ず3-以下であるので、例えば他の領域と重なったとしても0,1,2,3以外の爆弾の個数が存在することはありえません。なので、上記の通り?になるのです。ただし、条件として?の領域だけが持つますが存在しないことを求められます。例えば下記は成り立ちません。
![](https://assets.st-note.com/img/1728473411-5FsSJGCWBrRoipfc3dP6TXIg.png)
9-の領域のみに属するマスが0個であれば成り立ちます。
![](https://assets.st-note.com/img/1728473425-XB4GlJip178yusQzre52bU36.png)
なので、この4領域にまたがるルールは実質生きていません。このルールだけでクリアできるマスはおそらく存在しないはずです。(3ルールもしくは2ルールで定義できるはずです)なので削除!
![](https://assets.st-note.com/img/1728473793-GfATcad5pt4qDznHkFZMmYSL.png)
次にこの例を考えます。
![](https://assets.st-note.com/img/1728473890-mxhzjDNas9Qn1oLcuB25H6dp.png?width=1200)
![](https://assets.st-note.com/img/1728473983-iyl1QkhaqTup7w45ZAtVnmjs.png)
確かにb-c間の関係性は0/2/4であるでしょう。しかし重要なのはdがχ~χ-2までの範囲になっていることではないでしょうか。もしそうだとすると
![](https://assets.st-note.com/img/1728474179-RtonymSqYVvj4MBxrF2wf63l.png)
このような関係になるというルールさえあれば足ります。もっと言えば、
![](https://assets.st-note.com/img/1728474265-aSYKFAGmnleTwhx23UE9IBbg.png)
このルールと(χ-ψ)+というルールが設定できれば足ります。(ψを引くという動作がこのゲームではできないのでできませんが……)
χ+2の方のルールへ変更しておきます。こちらに変更したところ、適用回数がだいぶ少なくなり、CPU時間もそれほど食わなくなりました。おまけに適用範囲が広がっていくつか問題を解いたようです。