Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マインスイーパーSolverの話
Search
gott
February 08, 2019
Technology
0
2.6k
マインスイーパーSolverの話
UTMC(
http://www.komaba.utmc.or.jp/
)で話した内容です。
gott
February 08, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
大量配信システムにおけるSLOの実践:「見えない」信頼性をSLOで可視化
plaidtech
PRO
0
390
サービスを止めるな! DDoS攻撃へのスマートな備えと最前線の事例
coconala_engineer
1
180
Microsoft Defender XDRで疲弊しないためのインシデント対応
sophiakunii
1
320
How Do I Contact Jetblue Airlines® Reservation Number: Fast Support Guide
thejetblueairhelpsupport
0
150
対話型音声AIアプリケーションの信頼性向上の取り組み
ivry_presentationmaterials
3
1.1k
VS CodeとGitHub Copilotで爆速開発!アップデートの波に乗るおさらい会 / Rapid Development with VS Code and GitHub Copilot: Catch the Latest Wave
yamachu
3
460
TLSから見るSREの未来
atpons
2
310
〜『世界中の家族のこころのインフラ』を目指して”次の10年”へ〜 SREが導いたグローバルサービスの信頼性向上戦略とその舞台裏 / Towards the Next Decade: Enhancing Global Service Reliability
kohbis
3
1.5k
microCMSではじめるAIライティング
himaratsu
0
150
毎晩の 負荷試験自動実行による効果
recruitengineers
PRO
5
180
Digitization部 紹介資料
sansan33
PRO
1
4.5k
CDK Vibe Coding Fes
tomoki10
1
630
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Gamification - CAS2011
davidbonilla
81
5.4k
A Modern Web Designer's Workflow
chriscoyier
695
190k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
Code Review Best Practice
trishagee
69
19k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
750
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Six Lessons from altMBA
skipperchong
28
3.9k
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.