fundo
Você acorda e se vê perdido em um labirinto unidimensional! Um gênio místico (ou algo assim) aparece e explica que a saída está à sua frente, mas que entre você e a saída há uma série de desafios. À medida que você avança, percebe que todos os desafios são meramente portas trancadas. Você vê pela primeira vez uma porta com um buraco de chave em forma de T e, sem essa chave, refaça seus passos, procurando uma chave com uma T
forma.
Frustrado, você encontra uma sopa de letras do alfabeto no chão, nenhuma das quais corresponde à porta pela qual você se deparou. Por algum golpe de gênio (ou idiotice), você decide que a t
chave em forma de minúscula pode caber no slot se você o apertar com força suficiente. Quando você se aproxima da porta com a t
chave minúscula na mão, o T
buraco brilha em verde e a porta se dissolve à sua frente.
Um para baixo, muito mais para ir ...
Desafio
O objetivo deste desafio é marcar quantas etapas são necessárias para sair do labirinto.
A entrada desse desafio é o labirinto: uma sequência contendo apenas caracteres [A-Za-z^$ ]
. Glossário:
^
- O espaço inicial. A entrada conterá exatamente um^
.$
- A saída (liberdade!). A entrada conterá exatamente um$
.[A-Z]
- Letras maiúsculas significam portas. Você só pode passar por esta porta se já tiver coletado a chave necessária.[a-z]
- Letras minúsculas significam chaves. Você coleta essas chaves caminhando para o espaço que contém a chave.
Haverá no máximo uma de cada letra maiúscula na entrada. Isso significa que o número total de portas estará entre 0 e 26, inclusive.
Cada porta trancada [A-Z]
terá exatamente uma chave minúscula correspondente [a-z]
. Pode haver qualquer número de espaços ( ) na entrada.
Todas as portas estarão à direita do início e à esquerda da saída. Assim, não haverá portas supérfluas. Todas as entradas serão solucionáveis.
O resultado desse desafio será um número, o número de etapas necessárias para sair do labirinto.
Algoritmo
Sua abordagem metódica para sair deste lugar miserável é a seguinte:
- Comece no começo (
^
) e siga em frente (direita) coletando as chaves que encontrar. - Quando você se deparar com uma porta, se tiver a chave correta, prossiga para a porta. Se você não tiver a chave correta, caminhe para trás (esquerda) coletando as chaves que encontrar até encontrar a chave da porta mais recente que não pôde abrir.
- Depois de coletar a chave da porta problemática atual, você vira para a direita e prossegue.
- Repita esse processo até passar para a saída (
$
).
Jogadores experientes entenderão que seu código não precisa implementar esse algoritmo específico, desde que produza o mesmo resultado como se você tivesse executado esse algoritmo.
Contando
Cada vez que você pula de um quadrado para outro, isso conta como um passo. Girar 180º não exige etapa adicional. Você não pode avançar para uma porta sem a chave necessária. Você deve pisar em uma chave para buscá-la e pisar na saída para vencer. Após seu primeiro movimento, o espaço inicial ( ^
) se comporta como qualquer outro espaço regular.
Exemplos
Nestes exemplos, deixei os espaços como sublinhados para a legibilidade humana.
Entrada é _a_^_A__$__
. A saída é 11
. Você dá um 1
passo à frente, percebe que não tem chave para a A
porta e depois sobre o rosto. Você caminha para trás até ocupar o espaço que contém os a
( 3
passos para trás, agora 4
total). Você então avança até ocupar o espaço que contém a saída ( 7
avança, 11
total).
Entrada é b__j^__a_AJB_$
. O resultado é que 41
você faz duas viagens separadas para a parte de trás do labirinto, uma para pegar a j
chave e a próxima para pegar a b
chave.
Entrada é __m__t_^__x_T_MX_$____
. A saída é 44
. Você não fará nenhuma viagem extra para pegar a x
chave, pois a pegou no caminho desde o início até a porta T
.
Entrada é g_t_^G_T$
. A saída é 12
. Você não pode se mover para o G
espaço sem uma chave e imediatamente inverter. Você tem sorte o suficiente para pegar a t
chave no caminho para a g
chave e, assim, abrir as duas portas no seu caminho para a liberdade.
Entrada é _^_____$
. A saída é 6
. Essa foi fácil.
Diretrizes de E / S e critério de vencimento
Aplicam-se as regras de E / S padrão. Este é um desafio do código-golfe .
A
em bA^aB$
não seria supérfluo qualquer um. ;)