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
embA^aB$
não seria supérfluo qualquer um. ;)Respostas:
CJam, 45
Experimente online
Explicação:
fonte
Pitão, 51 bytes
some a distância entre a porta e sua chave (dobrada, para fazer a viagem de ida e volta), ignorando as chaves "aninhadas" e a distância do início ao fim:
mesmo algoritmo em python2.7:
fonte
Python 2,
155154134128 bytesEdit: Obrigado a @ user2357112 e @loovjo por seus comentários que me ajudaram a remover outros
2026 bytes da minha solução!fonte
i
é desnecessário?i
rastreia a posição da porta que está sendo processada no momento e é necessária se a chave ainda não tiver sido apanhada (por exemplo, sek
- a posição da chave - for menor quef
- a mais à esquerda em que andamos -, precisamos adicionar2*(i-k-1)
passos para a nossa total (curta para a esquerda para pegar a chave, e caminhar de volta até a porta) ...?i
ser substituídol.index(d)
na quinta linha e a tarefa removida na quarta?e
e asf
variáveis parecem redundantes. Além disso, você pode salvar vários caracteres salvandol.index
em uma variável.x
é redundante também. Acho que meu noob-iness de golfe está aparecendo. :) Obrigado pela ajuda!C, 136 bytes
fonte
PHP 5.3, 123 bytes
Este é o meu primeiro post no Code Golf, espero que seja de qualidade de golfe alta o suficiente para um primeiro post. Definitivamente um desafio divertido e uma pergunta incrível!
Este programa abusa muito bem do fato de que o PHP não precisa que você pré-declare nenhuma variável antes de usá-lo.
Também se revelou alguns bytes mais curto na minha solução final para iniciar em 0 e redefinir a contagem de etapas quando o caractere de início for encontrado, em vez de iniciar no '^'.
Todas as dicas são definitivamente bem-vindas!
fonte
JavaScript (ES6), 110 bytes
Porto da resposta de Pyth de Rob.
fonte
Python 2.7,
234199179fonte
AWK, 174 bytes
Provavelmente existe um algoritmo mais rígido, mas foi isso que eu criei.
Observe que estou usando
gawk
. Algumas implementações deAWK
podem não dividir uma string""
dessa maneira.fonte
C #, 309 bytes
Versão não destruída:
Nada sofisticado aqui, basta percorrer a string e mudar de direção com base no caractere e se a chave está contida em uma string de chaves.
m = a corda do labirinto
k = a sequência de teclas
f = a direção (true está à frente no labirinto)
b = a chave a ser pesquisada ao retornar
c = espaço reservado para m [j] salvar alguns bytes devido ao uso frequente
j = o índice de caracteres da string a ser observada
t = a contagem
Ainda relativamente novo no golfe, por isso, se você vir algum lugar, eu posso reduzi-lo, avise-me!
fonte