sfondo
Ti svegli per ritrovarti perso in un labirinto monodimensionale! Un genio mistico (o qualcosa del genere) appare e spiega che l'uscita si trova di fronte a te, ma che tra te e l'uscita è una serie di sfide. Mentre avanzi, ti rendi conto che tutte le cosiddette sfide sono semplicemente porte chiuse. Per prima cosa vedi una porta con un buco della serratura a forma di T, e non avendo tale chiave tu stesso, ripercorri i tuoi passi, cercando una chiave con una T
forma.
Frustrato, trovi una zuppa di chiavi dell'alfabeto a terra, nessuna delle quali corrisponde alla porta che hai incontrato. Con un colpo di genio (o idiozia), decidi che la t
chiave a forma di minuscolo potrebbe essere in grado di adattarsi allo slot se la incepphi abbastanza forte. Mentre ti avvicini alla porta con la t
chiave minuscola in mano, il T
buco si illumina di verde e la porta si dissolve davanti a te.
Uno in basso, molti altri per andare ...
Sfida
L'obiettivo di questa sfida è quello di segnare quanti passi ci vogliono per uscire dal labirinto.
L'input di questa sfida è il labirinto: una stringa contenente solo caratteri [A-Za-z^$ ]
. Glossario:
^
- Lo spazio iniziale. L'input conterrà esattamente uno^
.$
- L'uscita (libertà!). L'input conterrà esattamente uno$
.[A-Z]
- Le lettere maiuscole indicano le porte. Puoi attraversare questa porta solo se hai già raccolto la chiave richiesta.[a-z]
- Le lettere minuscole indicano i tasti. Raccogli queste chiavi camminando nello spazio che contiene la chiave.
Ci sarà al massimo una lettera maiuscola nell'input. Ciò significa che il numero totale di porte sarà compreso tra 0 e 26 inclusi.
Ogni porta chiusa [A-Z]
avrà esattamente una chiave in minuscolo corrispondente [a-z]
. Potrebbe esserci un numero qualsiasi di spazi ( ) nell'input.
Tutte le porte saranno a destra dell'inizio ea sinistra dell'uscita. Quindi non ci saranno porte superflue. Tutti gli ingressi saranno risolvibili.
L'output per questa sfida sarà un numero, il numero di passaggi necessari per uscire dal labirinto.
Algoritmo
Il tuo approccio metodico all'uscita da questo disgraziato posto è il seguente:
- Inizia da inizio (
^
) e vai avanti (a destra) raccogliendo tutte le chiavi che incontri. - Quando ti imbatti in una porta, se hai la chiave corretta, procedi in avanti sulla porta. Se non si dispone della chiave corretta, si cammina all'indietro (a sinistra) raccogliendo le chiavi che si incontrano fino a quando non si trova la chiave per la porta più recente che non è possibile aprire.
- Dopo aver raccolto la chiave per l'attuale porta problematica, si gira di nuovo a destra e si procede in avanti.
- Ripeti questo processo finché non passi all'uscita (
$
).
I golfisti esperti capiranno che il tuo codice non deve implementare questo algoritmo specifico purché produca lo stesso risultato come se avessi eseguito questo algoritmo.
Conteggio
Ogni volta che passi da un quadrato ad un altro quadrato, questo conta come un passo. La rotazione di 180º non comporta alcun passaggio aggiuntivo. Non è possibile avanzare su una porta senza la chiave necessaria. È necessario salire su una chiave per raccoglierla e per vincere è necessario uscire all'uscita. Dopo la tua prima mossa, lo spazio iniziale ( ^
) si comporta come qualsiasi altro spazio normale.
Esempi
In questi esempi ho lasciato gli spazi come caratteri di sottolineatura per la leggibilità umana.
L'input è _a_^_A__$__
. L'output è 11
. Fai un 1
passo avanti, noti che non hai la chiave per la A
porta, e poi per il viso. Cammini all'indietro fino ad occupare lo spazio contenente il a
( 3
passi indietro, ora 4
totale). Quindi si cammina in avanti fino ad occupare lo spazio contenente l'uscita ( 7
passi avanti, 11
totale).
L'input è b__j^__a_AJB_$
. L'output è 41
che fai due viaggi separati sul retro del labirinto, uno per ottenere la j
chiave e il successivo per ottenere la b
chiave.
L'input è __m__t_^__x_T_MX_$____
. L'output è 44
. Non farai alcun viaggio extra per ottenere la x
chiave, mentre la prendevi sulla strada dall'inizio alla porta T
.
L'input è g_t_^G_T$
. L'output è 12
. Non puoi spostarti nello G
spazio senza una chiave e immediatamente in faccia. Sei abbastanza fortunato da ritirare la t
chiave sulla strada per la g
chiave, e quindi aprire entrambe le porte sulla strada per la libertà.
L'input è _^_____$
. L'output è 6
. È stato facile.
Linee guida I / O e criterio vincente
Si applicano le regole I / O standard. Questa è una sfida di code-golf .
A
in bA^aB$
non sarebbe superfluo neanche. ;)