Sei un viaggiatore che attraversa il deserto tra due città. Non puoi trasportare abbastanza acqua per attraversare senza fermarti. Questa è una variante di un puzzle classico.
Le regole
Un deserto si presenta così: una griglia WxH di spazio per lo più vuoto. Lo spazio segnato S
è dove inizi, E
è dove vuoi finire e un quadrato contrassegnato con il numero N contiene N unità di acqua. I quadrati contrassegnati con una .
sospensione zero acqua.
.....................................
........S............................
.....................................
.........7...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Si inizia da S con 5 unità di acqua.
Puoi trasportare al massimo 5 unità di acqua.
Ogni turno ti
- sposta di un quadrato in alto, in basso, a sinistra o a destra,
- consuma 1 unità di acqua che stai trasportando,
- raccogliere o rilasciare un numero di unità di acqua.
Un turno è notata così: (direction)(+|-)(units of water)
, +
indica che si sta raccogliendo l'acqua, -
che si sta farlo cadere.
Giri di esempio:
D+0 Move Down
R+0 Move Right
D+2 Move Down, pick up two units of water.
U-1 Move Up, drop one unit of water.
Se esegui queste mosse iniziando da S nell'esempio sopra, il deserto si presenta così dopo.
.....................................
........S............................
.........1...........................
.........5...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Non puoi raccogliere più acqua di quella che è già sulla tua piazza. Quando raccogli l'acqua, deduci quel numero di unità dal conteggio delle tessere.
Puoi raccogliere solo acqua per contenere un massimo di 5 unità.
Nessuna tessera può contenere più di 9 unità, ad eccezione di S che contiene unità di infinito.
Puoi far cadere solo quanta più acqua stai trattenendo.
L'acqua sul terreno rimane invariata fino a quando non la riprendi.
Se ritorni a S, puoi raccogliere qualsiasi quantità di acqua senza esaurirla.
Se raggiungi E, allora vinci . Vinci ancora se consumi l'ultima unità di acqua su E.
Se, dopo il tuo turno, non hai acqua e non sei su E, muori .
Ingresso e uscita
Il tuo programma riceverà una mappa iniziale di dimensioni arbitrarie su STDIN
come arte ASCII nel formato sopra. Puoi supporre che sia rettangolare, cioè tutte le linee della stessa lunghezza, che ci siano esattamente uno S
e un E
quadrato, tutte le linee sono terminate \n
e l'intero STDIN sarà conforme a questa regex:/^[SE1-9\.\n]+$/
Il programma scriverà il seguente output su STDOUT:
- l'elenco delle mosse,
- lo stato finale della mappa.
È possibile visualizzare l'elenco delle mosse in qualsiasi formato conveniente.
Lo stato finale della mappa verrà stampato nello stesso formato dell'input, tranne per il fatto che mostrerà inoltre il percorso che hai intrapreso nel deserto contrassegnando tutte le tessere visitate con #
, se quella tessera non contiene acqua e non è S o E (es. lo è .
).
Ingresso ESEMPIO :
.....S.
.......
.......
E......
....8..
ESEMPIO output vincente:
D+0
D+0
D+0
D+0
L+5
L+0
L+0
L+0
L+0
U+0
.....S.
.....#.
.....#.
E....#.
####3#.
Nontriviality
Quando pubblichi il tuo codice, pubblica un input di mappa di esempio in cui il tuo codice trova una soluzione per la quale soddisfa le seguenti condizioni di non banalità:
- S ed E sono distanti almeno 10 mosse.
- Ogni quadrato che inizialmente contiene N unità di acqua deve essere circondato da un bordo di larghezza N in cui sono presenti tutti i quadrati
.
(niente acqua, non S o E)
ESEMPIO
........2.
..........
..........
S.1..2....
..........
..........
........1.
..3.......
.........E
Se aumenti la quantità di acqua su qualsiasi piastrella, quanto sopra diventa banale.
Requisiti
Presumibilmente il tuo programma incontrerà una serie di tentativi falliti prima di trovare una soluzione, se presente.
- Il tuo programma deve eventualmente risolvere qualsiasi input risolvibile.
- Voglio vederti morire - il tuo programma produrrà le mosse e la mappa finale del percorso verso la morte per ogni tentativo fallito di trovare una soluzione.
- Se trovi una soluzione vincente, stampa l'output completo per quello e termina.
- Esegui fino a quando non viene trovata una soluzione, ma non tentare la stessa soluzione due volte : tutti i decessi dovrebbero avvenire secondo percorsi distinti.
- Usa questo un input di test:
(richiede almeno una mossa per rilasciare una cache d'acqua ad un certo punto medio).
S........
.........
.........
........E
Vince il codice più breve che viene pubblicato con un input dimostrativo non banale che risolve .