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.4k
マインスイーパーSolverの話
UTMC(
http://www.komaba.utmc.or.jp/
)で話した内容です。
gott
February 08, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
プロデザ! BY リクルート vol.18_リクルートのリサーチ実践組織「リサーチブーストコミュニティ」
recruitengineers
PRO
3
240
自動生成を活用した、運用保守コストを抑える Error/Alert/Runbook の一元集約管理 / Centralized management of Error/Alert/Runbook to minimize operational costs using automated code generation
biwashi
9
2.1k
アクセシビリティを考慮したUI/CSSフレームワーク・ライブラリ選定
yajihum
0
160
Databricks におけるデータエンジニアリング
databricksjapan
0
380
KubeCon EU 2024 Recap “Kubernetes Policy Time Machine: Where to Next?”
ryysud
0
120
オブザーバビリティの Primary Signals
onk
PRO
0
550
テストプロセスで大事にしていること #jasstnano
makky_tyuyan
0
130
ChatGPT for IT Service Management (IT Pro)
dahatake
2
160
Data and AI Governance: Existing Challenges and Emerging Trends
scotthsieh825
0
160
「ふりかえりのふりかえり」をふりかえり、実のあるふりかえりにする
naitosatoshi
0
220
開発生産性向上サービスを作るFindyが自分たちで開発生産性を爆上げした組織づくりの歩み / Findy's path to boosting its own development productivity 2024-04-17
ma3tk
3
340
0→1開発における技術選定において一番大切なこと
bicstone
1
330
Featured
See All Featured
Building Effective Engineering Teams - LeadDev
addyosmani
27
1.8k
Bootstrapping a Software Product
garrettdimon
PRO
301
110k
How to train your dragon (web standard)
notwaldorf
72
5.1k
Building Your Own Lightsaber
phodgson
98
5.7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
243
20k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
19
1.9k
Learning to Love Humans: Emotional Interface Design
aarron
266
39k
Debugging Ruby Performance
tmm1
70
11k
Designing for Performance
lara
601
67k
Thoughts on Productivity
jonyablonski
57
3.8k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
154
14k
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.