Trama : manca Jimmy; dobbiamo trovarlo. Dovremmo dividerci.
Trama : Jimmy è già morto.
Ma il nostro cast non lo sa, quindi devono comunque cercare in tutta l'area. C'è una N colonne x M righe (1 <= M, N <= 256) griglia di celle, entrambe contrassegnate come "S" per il punto iniziale, "." per spazio aperto o "#" per un ostacolo. Questa è la mappa .
Ci sono 0 <= p <= 26 costar , 0 <= q <= 26 extra e 1 stella . Ognuno è inizialmente nella cella contrassegnata con S.
Le regole
Ogni persona ha un raggio visivo mostrato di seguito:
...
.....
..@..
.....
...
La stella è indicata con "@", le costar con lettere maiuscole, che iniziano con "A", e gli extra con lettere minuscole, che iniziano con "a". Inizialmente, il raggio visivo che circonda il punto iniziale è già contrassegnato come cercato. Se questo costituisce l'intero spazio aperto della mappa, il gioco termina. Ogni turno, nel seguente ordine :
- Ogni persona fa simultaneamente una mossa del re (fermandosi o spostandosi su una delle 8 celle vicine).
- Tutte le celle nel raggio visivo intorno a ogni persona vengono contate come cercate.
- Se una costar non può vedere nessun altro, muore. Se un extra non riesce a vedere né una costar, la stella o almeno altri 2 extra, muore. Questi accadono simultaneamente - cioè, non può esserci alcuna reazione a catena di morti in un singolo turno; le condizioni di cui sopra vengono verificate e tutti coloro che stanno per morire muoiono immediatamente.
- Se è stato cercato tutto lo spazio aperto sulla mappa, la ricerca è terminata.
Gli appunti
Più persone possono trovarsi sullo stesso quadrato in qualsiasi momento e queste persone possono vedersi.
Gli ostacoli non ostacolano mai la vista, solo il movimento; le persone possono vedersi attraverso, ehm ... lava?
Gli spazi aperti sulla mappa sono garantiti per essere collegati da mosse re.
Anche la "S" iniziale è considerata come spazio aperto, piuttosto che un ostacolo.
Qualsiasi mossa del re che atterra su uno spazio aperto è valida. Ad esempio, la seguente mossa è legale:
.... ....
.@#. ---> ..#.
.#.. .#@.
.... ....
Ingresso
L'input sarà nel formato
N M p q
[N cols x M rows grid with characters ".", "#", and "S"]
Ingressi campione:
6 5 0 0
......
......
..S...
......
......
e
9 9 1 1
S.......#
.......##
......##.
..#####..
...##....
...##....
...#.....
....#..#.
.........
p e q sono il numero di costar ed extra, rispettivamente.
Produzione
L'uscita dovrebbe essere, per ogni giro, le mosse che vengono effettuate, con le direzioni indicate da
789
456
123
L'ordine delle mosse non ha importanza, poiché sono tutte messe in atto simultaneamente. Non elencare una mossa per una persona va bene ed equivale a muoverla nella direzione 5. Le mosse devono essere elencate nel seguente formato:
@9 A2 a2 B7.
"" indica la fine delle tue mosse per un turno.
Dopo che la mappa è stata cercata, la riga finale di output dovrebbe essere tre numeri interi, separati da spazi: il numero di turni necessari per completare la ricerca nel tabellone, il numero di costar viventi e il numero di extra viventi. Per il primo esempio di input
6 5 0 0
......
......
..S...
......
......
il seguente è un output valido:
@4.
@6.
@6.
@6.
4 0 0
Un'ultima nota: la stella non può morire e lo spazio aperto sulla mappa è garantito per essere collegato, quindi alla fine la ricerca avrà sempre successo.
punteggio
Il tuo punteggio è il numero totale di turni effettuati su una serie di test di riferimento; sei invitato a inviare il tuo test case insieme alla tua risposta. La somma del numero di costar viventi rispetto al set di riferimento verrà utilizzata come pareggio e, nel caso in cui vi sia ancora un pareggio, verrà utilizzata la somma del numero di extra viventi.
Set di test e controller
Attualmente, 5 mappe sono online su https://github.com/Tudwell/HorrorMovieSearchParty/ . Chiunque presenti una risposta può anche inviare un caso di prova, che mi riservo il diritto di rifiutare per qualsiasi motivo (se rifiuto la tua mappa per qualche motivo, puoi inviarne un'altra). Questi saranno aggiunti al set di test a mia discrezione.
Un controller Python (testato in 2.7.5) è fornito su github come controller.py . Un secondo controller lì, controller_disp.py , è identico, tranne per il fatto che mostra un output grafico durante la ricerca (richiede la libreria Pygame).
Utilizzo :
python controller.py <map file> <your execution line>
Vale a dire:
python controller.py map1.txt python solver.py map1.txt
Il controller ha emesso (allo stdin del tuo programma ) il modulo
Turn 1
@:2,3 A:2,3 B:2,3.
##...##
#ooo..#
ooooo..
ooooo..
ooooo..
#ooo...
##.....
###....
----------------------------------------
Questo è il numero del turno (il turno 1 è prima che tu ti sia spostato), un elenco '.' Terminato di tutti gli attori e le loro coordinate x, y (il carattere in alto a sinistra è (0,0)), una rappresentazione dell'intero tavola e una linea con 40 '. Quindi attende l'input (dallo stdout del programma ) del modulo
@9 A2 B7.
Questo è il formato di output sopra specificato. Il controller emette una "o" per lo spazio aperto che è stato cercato "." per lo spazio aperto che non è stato cercato e '#' per gli ostacoli. Include solo le persone viventi nel suo elenco di persone e le loro coordinate e tiene traccia di tutte le regole del gioco. Il controller uscirà se si tenta di effettuare una mossa illegale. Se le mosse per un dato turno terminano la ricerca, l'output non è come sopra; invece è della forma
Finished in 4 turns
4 1 0
"4 1 0" indica qui 4 turni totali, 1 costar vivente e 0 extra viventi. Non è necessario utilizzare il controller; sentiti libero di usarlo o modificarlo per la tua voce. Se decidi di utilizzarlo e riscontri problemi, fammi sapere.
Grazie a @githubphagocyte per avermi aiutato a scrivere il controller.
Modifica: per una voce casuale, puoi scegliere qualsiasi corsa su una particolare mappa come punteggio per quella mappa. Nota che, a causa dei requisiti di punteggio, dovresti sempre scegliere il minor numero di curve, quindi il minor numero di costar morti, quindi il minor numero di extra morti per ogni mappa.