Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マインスイーパーSolverの話
Search
gott
February 08, 2019
Technology
0
2.7k
マインスイーパーSolverの話
UTMC(
http://www.komaba.utmc.or.jp/
)で話した内容です。
gott
February 08, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
1
740
マイクロサービスへの5年間 ぶっちゃけ何をしてどうなったか
joker1007
18
7.4k
mairuでつくるクレデンシャルレス開発環境 / Credential-less development environment using Mailru
mirakui
5
590
2025年 開発生産「可能」性向上報告 サイロ解消からチームが能動性を獲得するまで/ 20251216 Naoki Takahashi
shift_evolve
PRO
2
210
20251222_サンフランシスコサバイバル術
ponponmikankan
2
130
子育てで想像してなかった「見えないダメージ」 / Unforeseen "hidden burdens" of raising children.
pauli
2
320
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
370
さくらのクラウド開発ふりかえり2025
kazeburo
2
300
Fashion×AI「似合う」を届けるためのWEARのAI戦略
zozotech
PRO
2
1.1k
ActiveJobUpdates
igaiga
1
300
AIエージェント開発と活用を加速するワークフロー自動生成への挑戦
shibuiwilliam
4
810
Amazon Bedrock Knowledge Bases × メタデータ活用で実現する検証可能な RAG 設計
tomoaki25
6
2.1k
Featured
See All Featured
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
25
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
580
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
15
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
GraphQLとの向き合い方2022年版
quramy
50
14k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
750
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Transcript
マインスイーパー Solverの話 gott
自己紹介 • ‘16入学 • システム創成学科 システムデザイン&マネジメントコース • ‘13-’16 GNEX Inc.
• ‘16- UNIPRO Inc. • Web屋 PHP / JavaScript • 趣味を書いたりする
マインスイーパーとは 初級:9×9のマスに10個の地雷 中級:16×16のマスに40個の地雷 上級:30×16のマスに99個の地雷
課題 http://save.sys.t.u-tokyo.ac.jp/~fujii/lecture/pgmkiso/
制約 • マインスイーパーのライブラリが用意されている • Java使う
結果
自明な確定マス・安全マス 旗の立っているマスは,中心の 1マスの情報だけで爆弾があると分かる。 →自明な確定マス 右下のマスは自明な確定マスの情報だけで安全だと分かる →自明な安全マス
非自明な安全マス 右下のマスは自明な安全マスではないが,矛盾しない全ての 爆弾配置パターンにおいて安全 →非自明な安全マス
どうやって探すの
自明な安全マス すぐに思いつくように,全てのマスについて周囲 8マスを探索して確定マスを探し続ければよい
非自明な安全マス 全探索! 周囲の爆弾の個数がわかっているから,それまで考えたパターンと無矛盾なものを全列挙
定義 NumEdge 周囲8マスの中に,確定マスでない未オープンのマスがあるような数字マスの集合。 BoxEdge 周囲8マスの中に数字マスがあるような,確定マスでない未オープンのマスの集合。 関連する relates :: NumEdge ->
BoxEdge -> Bool relates a b = a `next_to` b -- next_to: 斜めに隣接
非自明な安全マス (0, 1)はすでに爆弾が確定したマス。 a = (1, 1), b = (2,
1), c = (3, 1) d = (1, 2), e = (2, 2), f = (3, 2) cから出発したとする。 cの周りの爆弾配置は右の 2通り。 relates(c, f) ∧ relates(b, f)なので, b,続いてaについて調べる。 aについて調べると,左は矛盾する。
それでも見つからなかったら 運ゲーをやるしかないが,場所によって爆弾のありそうな確率は異なる →事前確率(なにも情報がないマスに爆弾がある確率 )より有意に小さければ開ける価値あり
変な工夫 double default_probability = (double)countNotFixedBombs() / board.count( (i) -> !i.isOpen()
& !i.isFixed() && !i.isSafe() , this); // なにも情報がないマスに爆弾がある確率 if (min_prob < default_probability - BIAS) { min_cell.setSafe(); return true; } BIAS = 0.014で一番勝率が高くなった
書き方の話: 素の制御構文をたくさん書くな 例えばこんなfor文をたくさん書くとする。 for (int i = n - 1;
i >= 0; i--) { /*...*/ } 一箇所でも赤が抜けると黙ってバグる。 こうしよう。 this.board.numEdge.forEach((i) -> { i.relatedEdges = new BoardCellSet(); i.getIterator(this).apply_around((j) -> j.isBoxEdge() && i.relatedEdges.add(j.getCell())); });
書き方の話: 抽象化 public class ProbPlayer extends Player このクラスのmainメソッドがエントリポイント。 Playerはコンパイル済みのライブラリ内にある。 player.open(int
x, int y) を呼ぶと親クラスであるPlayerの public final boolean open(int x, int y) が呼ばれ,実際に(x, y)マスを開ける処理が走る。 →何が問題か?
書き方の話: 抽象化 答え: モジュールが密結合していてテストが難しい 関連ワード: テスタビリティ,依存性注入 (DI) Playerはあくまでinterfaceであるべき。その上で,ランダムに盤面を生成するようなロジックを implements Playerなるクラスに実装するべき。そうすれば,ユニットテストに都合のいい盤面を与えてやり,自分で書いたロ
ジックがそれにきちんと対応できているか自動で調べることができるようになる。
書き方の話: 適切なクラスを使う public class GameClear extends RuntimeException おばけ。ゲームクリアは異常事態なのか? これのせいでtry-catchがうまくいかなくて詰まってた https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/
Fin.