Risolutore di dragamine


34

Abbiamo già generato campi minatori , ma qualcuno deve davvero spazzare quelle miniere generate prima che il PCG esploda!

Il tuo compito è quello di scrivere un Risolutore per dragamine compatibile con una versione leggermente modificata della soluzione accettata di "Lavoratore per dragamine" (le azioni sono separate da spazi per consentire campi più grandi).

Input: un campo minatore, campi separati da spazi. La prima riga indica il numero totale di mine.

  • x: Non trattata
  • !: Bandiera
  • Cifra: numero di mine attorno a quel campo

Esempio:

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

Output: il tuo prossimo passo nel formato action row column(a partire da zero)

Azioni valide:

  • 0: Aprilo
  • 1: Posiziona una bandiera

Esempio:

0 1 2

Regole:

  • Si scrive un programma completo che accetta un singolo campo come input (STDIN o argomenti della riga di comando) e genera una singola azione (STDOUT). Pertanto, non è possibile salvare gli stati, ad eccezione di !.
  • La tua scelta deve seguire le migliori probabilità di sopravvivenza. (cioè se c'è una mossa sicura al 100%, prendila)
  • Questo è ; vince la soluzione più breve (in byte UTF-8)

test:

Questi test hanno lo scopo di testare situazioni chiare comuni; il tuo programma deve funzionare per ogni campo di prova.

Nel:

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

Fuori (uno di questi):

1 1 2
0 0 2
0 1 3

Nel:

2
x x x
1 ! x
1 1 x

Fuori (uno di questi):

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

Nel:

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

Fuori (uno di questi):

1 1 5
1 0 2

Nel:

2
x x x
2 3 1
! 1 0

Fuori (uno di questi):

0 0 1
1 0 0
1 0 2

Bello! 1) Forse per testare qualcuno dovrebbe scrivere un cablaggio di prova: dato un campo, stampa ogni passo fatto e se il programma vince. Il programma dovrebbe vincere su mappe senza alcuna ambiguità. 2) Mi chiedo se qualcuno userà l'azione bandiera. Sembra che non dovrebbe mai essere necessario.
Claudiu,

Per il primo test. Perché sei in grado di passare a 0 0 2o 0 1 3. Non riesco a vedere come uno di questi sarebbe considerato sicuro. (Non devo essere abbastanza bravo a dragamine ...)
FDinoff

1
Forse Fo Psembra migliore bandiera di !:)
VisioN

1
@JonathanVanMatre Il campo è vuoto, ma è garantito che la tua prima apertura non è una miniera, poiché le mine vengono posizionate dopo il primo clic :)
TimWolla

2
Curiosità: ci sono solo un numero finito di schede disponibili (almeno nella versione XP, che è quella canonica nella scena competitiva). La scheda viene spostata mentre fai clic sul primo punto per assicurarti di non fare clic su una miniera, ma a parte questo è già deciso quale scheda utilizzerai.
undergroundmonorail

Risposte:


17

matematica

Non ho ancora giocato a golf. Ha bisogno di altro lavoro sui formati 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}}
*)

Modifica: Bonus Track

Ho creato un parco giochi interattivo che calcola le probabilità della bomba calcolando tutte le possibili soluzioni per una determinata configurazione:

Grafica Mathematica

Istruzioni per testarlo senza Mathematica installato:

  1. Scarica http://pastebin.com/asLC47BW e salvalo come * .CDF
  2. Scarica l'ambiente CDF gratuito da Wolfram Research all'indirizzo https://www.wolfram.com/cdf-player/ (non un piccolo file)

Il cursore cambia le dimensioni della scheda. Questo è solo un programma impreciso, non completamente testato, si prega di segnalare eventuali bug. Non ho implementato una funzione "numero totale di bombe disponibili a bordo". Si presume infinito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.