Solucionador de buscaminas

34

¡Ya generamos campos de Buscaminas , pero alguien realmente tiene que barrer esas minas generadas antes de que PCG explote!

Su tarea es escribir un Solucionador de buscaminas que sea compatible con una versión ligeramente modificada de la solución aceptada de "Buscaminas de trabajo" (las acciones están separadas por espacios para permitir campos más grandes).

Entrada: un campo Buscaminas, campos separados por espacios. La primera línea denota el número total de minas.

  • x: Sin tocar
  • !: Bandera
  • Dígito: número de minas alrededor de ese campo

Ejemplo:

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

Salida: su próximo paso en el formato action row column(comenzando en cero)

Acciones válidas

  • 0: Abrelo
  • 1: Coloque una bandera

Ejemplo:

0 1 2

Reglas:

  • Usted escribe un programa completo que toma un solo campo como entrada (ya sea STDIN o argumentos de línea de comando) y genera una sola acción (STDOUT). Por lo tanto, no puede guardar estados, excepto !.
  • Su elección debe seguir las mejores probabilidades de supervivencia. (es decir, si hay un movimiento 100% seguro, tómalo)
  • Este es el ; gana la solución más corta (en bytes UTF-8)

Pruebas:

Estas pruebas sirven para probar situaciones claras comunes; su programa debe funcionar para cada campo de prueba.

En:

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

Fuera (cualquiera de estos):

1 1 2
0 0 2
0 1 3

En:

2
x x x
1 ! x
1 1 x

Fuera (cualquiera de estos):

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

En:

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

Fuera (cualquiera de estos):

1 1 5
1 0 2

En:

2
x x x
2 3 1
! 1 0

Fuera (cualquiera de estos):

0 0 1
1 0 0
1 0 2
TimWolla
fuente
¡Agradable! 1) Quizás para probar alguien debería escribir un arnés de prueba: dado un campo, imprime cada paso dado y si el programa gana. El programa debería ganar en los mapas sin ninguna ambigüedad. 2) Me pregunto si alguien usará la acción de la bandera. Parece que nunca debería ser necesario.
Claudiu
Para la primera prueba. ¿Por qué eres capaz de mover a 0 0 2o 0 1 3. No puedo ver cómo ninguno de los dos se consideraría seguro. (No debo ser lo suficientemente bueno en buscaminas ...)
FDinoff
1
Posiblemente Fo se Pve mejor bandera que !:)
VisioN
1
@JonathanVanMatre El campo está en blanco, pero se garantiza que su primera apertura no es una mina, ya que las minas se colocan después del primer clic :)
TimWolla
2
Dato curioso: solo hay un número finito de placas disponibles (al menos en la versión XP, que es la canónica en la escena competitiva). El tablero cambia de lugar cuando haces clic en el primer lugar para asegurarte de que no estás haciendo clic en una mina, pero aparte de eso, ya se ha decidido qué tablero usarás.
undergroundmonorail

Respuestas:

17

Mathematica

Todavía no golf. Necesita más trabajo en formatos de 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}}
*)

Editar: Bonus Track

Creé un patio de juegos interactivo que calcula las probabilidades de bomba calculando todas las soluciones posibles para una configuración dada:

Gráficos de Mathematica

Instrucciones para probarlo sin Mathematica instalado:

  1. Descargue http://pastebin.com/asLC47BW y guárdelo como * .CDF
  2. Descargue el entorno CDF gratuito de Wolfram Research en https://www.wolfram.com/cdf-player/ (no es un archivo pequeño)

El control deslizante cambia las dimensiones del tablero. Este es solo un programa incompleto, no completamente probado, por favor reporte cualquier error. No he implementado la función "número total de bombas disponibles a bordo". Se supone infinito.

Dr. belisario
fuente