Minesweeper Solver

34

Nous avons déjà généré des champs Démineurs , mais quelqu'un doit vraiment balayer ces mines avant que PCG explose!

Votre tâche consiste à rédiger un solveur de démineur compatible avec une version légèrement modifiée de la solution acceptée de «travail de démineur» (les actions sont séparées par des espaces pour permettre l'utilisation de champs plus grands).

Entrée: un champ Démineur, champs séparés par des espaces. La première ligne indique le nombre total de mines.

  • x: Intacte
  • !: Drapeau
  • Chiffre: Nombre de mines autour de ce champ

Exemple:

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

Sortie: votre prochaine étape dans le format action row column(à partir de zéro)

Actions valides:

  • 0: Ouvrez-le
  • 1: Placer un drapeau

Exemple:

0 1 2

Règles:

  • Vous écrivez un programme complet qui prend un seul champ en entrée (STDIN ou arguments de ligne de commande) et génère une seule action (STDOUT). Par conséquent, vous ne pouvez pas enregistrer des états, à l'exception de !.
  • Votre choix doit suivre les meilleures chances de survie. (c.-à-d. s'il y a un déménagement 100% sécuritaire, prenez-le)
  • C'est du ; la solution la plus courte (en octets UTF-8) gagne

Tests:

Ces tests servent à tester des situations claires et communes; votre programme doit fonctionner pour tous les domaines de test.

Dans:

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

Out (aucun de ceux-ci):

1 1 2
0 0 2
0 1 3

Dans:

2
x x x
1 ! x
1 1 x

Out (aucun de ceux-ci):

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

Dans:

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

Out (aucun de ceux-ci):

1 1 5
1 0 2

Dans:

2
x x x
2 3 1
! 1 0

Out (aucun de ceux-ci):

0 0 1
1 0 0
1 0 2
TimWolla
la source
Agréable! 1) Peut-être que pour le test, quelqu'un devrait écrire un test de harnais: dans un champ donné, il imprime chaque étape effectuée et indique si le programme gagne. Le programme devrait gagner sur les cartes sans aucune ambiguïté. 2) Je me demande si quelqu'un utilisera l'action drapeau. On dirait que cela ne devrait jamais être nécessaire.
Claudiu
Pour le premier test. Pourquoi pouvez-vous vous déplacer vers 0 0 2ou 0 1 3? Je ne vois pas comment l'un ou l'autre de ceux-ci seraient considérés comme sûrs. (Je ne dois pas être assez bon au dragueur de mines ...)
FDinoff
1
Peut F- être ou a l' Pair meilleur drapeau que !:)
VisioN
1
@JonathanVanMatre Le champ est vide, mais il est garanti que votre première ouverture n'est pas une mine, car les mines sont placées après le premier clic :)
TimWolla
2
Fait amusant: il n'y a qu'un nombre fini de cartes disponibles (du moins dans la version XP, qui est la version canonique de la scène compétitive). Le tableau est déplacé lorsque vous cliquez sur le premier emplacement pour vous assurer de ne pas cliquer sur une mine, mais en dehors de cela, il est déjà décidé du tableau que vous utiliserez.
undergroundmonorail

Réponses:

17

Mathematica

Toujours pas joué au golf. Besoin d'un peu plus de travail sur les formats d'E / S.

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}}
*)

Edit: Bonus Track

J'ai créé un terrain de jeu interactif qui calcule les probabilités de bombe en calculant toutes les solutions possibles pour une configuration donnée:

Mathematica graphiques

Instructions pour le tester sans que Mathematica soit installé:

  1. Téléchargez http://pastebin.com/asLC47BW et enregistrez-le au format * .CDF
  2. Téléchargez l'environnement CDF gratuit de Wolfram Research à l' adresse https://www.wolfram.com/cdf-player/ (ce n'est pas un petit fichier)

Le curseur modifie les dimensions du tableau. Ceci est juste un programme sommaire, pas complètement testé, veuillez signaler tout bogue. Je n'ai pas implémenté de fonctionnalité "nombre total de bombes disponibles à bord". C'est supposé infini.

Dr. belisarius
la source