マインスイーパソルバー


34

マインスイーパフィールド既に生成されていますが、PCGが爆発する前に、生成された地雷を掃く必要があります!

あなたの仕事は、「Working Minesweeper」の承認されたソリューションのわずかに修正されたバージョンと互換性のあるマインスイーパソルバーを作成することです(アクションはスペースで区切られ、より大きなフィールドを可能にします)。

入力:マインスイーパフィールド、スペースで区切られたフィールド。最初の行は、鉱山の総数を示しています。

  • x:そのまま
  • !:フラグ
  • 桁:そのフィールドの周囲の地雷の数

例:

10
0 0 1 x x x x x
0 0 2 x x x x x
0 0 2 ! x x x x
0 0 1 2 x x x x
0 0 0 1 x x x x
1 1 0 2 x x x x
x 1 0 2 x x x x
1 1 0 1 x x x x

出力:フォーマットの次のステップaction row column(ゼロから開始)

有効なアクション:

  • 0: それを開く
  • 1:旗を置く

例:

0 1 2

ルール:

  • 単一のフィールドを入力(STDINまたはコマンドライン引数)として受け取り、単一のアクション(STDOUT)を出力する完全なプログラムを作成します。したがって、を除く状態を保存することはできません!
  • あなたの選択は、生存のための最高のオッズに従う必要があります。(つまり、100%安全な動きがある場合は、それを取る)
  • これはです。最短のソリューション(UTF-8バイト)が勝ちます

テスト:

これらのテストは、一般的な明確な状況をテストする目的に役立ちます。プログラムはすべてのテストフィールドで機能する必要があります。

に:

4
x x x x
1 2 x x
0 1 2 x
0 0 1 x

アウト(これらのいずれか):

1 1 2
0 0 2
0 1 3

に:

2
x x x
1 ! x
1 1 x

アウト(これらのいずれか):

0 0 0
0 0 1
0 1 2
0 2 2
1 0 2

に:

10
x x x x x x x x
1 3 3 x x x x x
0 1 ! 3 3 4 x x
0 2 3 ! 2 3 x x
0 1 ! 2 2 ! x x

アウト(これらのいずれか):

1 1 5
1 0 2

に:

2
x x x
2 3 1
! 1 0

アウト(これらのいずれか):

0 0 1
1 0 0
1 0 2

いいね!1)おそらく、テストのために誰かがテストハーネスを作成する必要があります。フィールドを指定すると、各ステップが実行され、プログラムが勝つかどうかが出力されます。プログラムは、あいまいさのないマップで勝つはずです。2)誰もフラグアクションを使用するのだろうか。決して必要ではないようです。
クラウディウ

最初のテスト。0 0 2またはに移動できるのはなぜですか0 1 3。それらのいずれかが安全であるとみなされる方法がわかりません。(私は掃海艇で十分によくないにちがいない...)
FDinoff

1
おそらくFPルックスより良いフラグよりも!:)
ビジョン

1
@JonathanVanMatreこのフィールドは空白ですが、最初のクリック後に地雷が配置されるため、最初のオープニングは地雷ではないことが保証されています:)
TimWolla

2
おもしろい事実:利用可能なボードの数には限りがあります(少なくとも、XPのバージョンでは、これは競合シーンの標準的なものです)。最初のスポットをクリックするとボードが移動し、地雷をクリックしないようにしますが、それ以外は使用するボードが既に決定されています。
地下

回答:


17

Mathematica

まだゴルフをしていません。I / O形式でさらに作業が必要です。

t = {{0, 0, 1, x, x, x, x, x}, {0, 0, 2, x, x, x, x, x}, {0, 0, 2, F, x, x, x, x}, 
     {0, 0, 1, 2, x, x, x, x}, {0, 0, 0, 1, x, x, x, x}, {1, 1, 0, 2, x, x, x, x}, 
     {x, 1, 0, 2, x, x, x, x}, {1, 1, 0, 1, x, x, x, x}};
(*Sqrt[2] is  1.5*)
c = Sequence; p = Position;
nums = p[t, _?NumberQ];
fx = Nearest[p[t, x]];
flagMinus[flag_] := If[Norm[# - flag] < 1.5, t[[c @@ #]]--] & /@ nums
flagMinus /@ p[t, F];
g@x_List := Tr[q[#] & /@ x]
eqs = MapIndexed[t[[c @@ (nums[[#2]][[1]])]] == g[#1] &, (fx[#, {8, 1.5}] & /@nums)];
vars = Union@Cases[eqs, _q, 4];
s = Solve[Join[eqs, Thread[0 <= vars < 2]], vars, Integers];
res = (Transpose@s)[[All, All, 2]];
i = 1; plays = Select[{i++, #[[1]], Equal @@ #} & /@ res, #[[3]] &];
Flatten /@ ({#[[2]] /. 1 -> F, List @@ vars[[#[[1]]]] - 1} & /@ plays)

(*
{{0, 0, 3}, {F, 1, 3}, {F, 2, 4}, {0, 3, 4}, {0, 4, 4}, 
 {F, 5, 4}, {F, 6, 0}, {F, 6, 4}, {0, 7, 4}}
*)

編集:ボーナストラック

特定の構成で考えられるすべてのソリューションを計算することにより、爆弾の確率を計算するインタラクティブなプレイグラウンドを作成しました。

Mathematicaグラフィックス

Mathematicaをインストールせずにテストする手順:

  1. http://pastebin.com/asLC47BWをダウンロードし、*。CDFとして保存します
  2. https://www.wolfram.com/cdf-player/の Wolfram Researchから無料のCDF環境をダウンロードし ます(小さなファイルではありません)

スライダーはボードの寸法を変更します。これは単なるプログラムであり、完全にはテストされていません。バグを報告してください。「搭載されている爆弾の総数」機能を実装していません。無限と仮定されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.