Premissa
Recentemente, eu estava com meia hora de antecedência para um compromisso e decidi esperar do lado de fora. Eu também determinei que pareceria estranho se eu apenas ficasse imóvel na frente da casa. Por isso, decidi dar uma caminhada rápida, dentro de uma área limitada. Também concluí que, se eu começasse a andar em círculos, isso tornaria óbvio que eu estava demorando. Por isso, fui inspirado a criar meu primeiro desafio do Code Golf.
Especificação
Você receberá uma lista, um mapa da área, que conterá um " "
ou outro "#"
, que representa espaços livres e obstáculos de algum tipo. Os espaços livres podem ser cruzados apenas uma vez e leva 1 minuto para cruzá-lo. Sua posição inicial será representada com uma "@"
tradição parecida com um roguel, e o alvo será representado com um "$"
porque é isso que você perderá lá. Você também receberá um número inteiro que representará quantos minutos você precisa perder antes de não parecer que estava se intrometendo. Quando você pousa no"$"
, terá que ter a quantidade exata de minutos (portanto, se você estiver em contagem regressiva, precisará ser 1 em um bloco adjacente e 0 no bloco). Sempre será possível chegar ao destino. Seu programa ou função precisará retornar uma lista mostrando o caminho mais curto com <,>, ^ e v para representar as quatro direções possíveis.
Exemplos
Entrada:
[[" ", " ", " ", " "],
["@", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
e
5
Ouput:
[[">", ">", ">", "v"],
["^", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
Entrada:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
e
7
Saída:
[[" ", "#", " ", " ", " "],
[" ", "#", ">", "v", " "],
["v", "#", "^", "$", " "],
[">", ">", "^", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
Entrada:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
e
17
Saída:
[[" ", "#", " ", "v", "<"],
[" ", "#", " ", "v", "^"],
["v", "#", " ", "$", "^"],
[">", ">", "v", ">", "^"],
[" ", "#", "v", "^", "<"],
[" ", "#", ">", ">", "^"]]
Regras
- Aplicam-se brechas padrão
- Cada bloco deve ser movido apenas uma vez
- A quantidade exata de tempo deve ser gasta no quadro
- Apenas um caminho precisa ser exibido no caso de vários caminhos
- Esta é uma pergunta sobre código de golfe, para que a resposta mais curta seja ganha
- Conforme a pergunta de user202729 nos comentários, você pode assumir uma entrada válida.
Adicione um comentário se precisar de mais esclarecimentos
fonte
Respostas:
JavaScript (ES6), 171 bytes
Recebe entrada na sintaxe de currying
(a)(n)
. Saídas modificando a matriz de entrada.Experimente online!
Comentado
fonte
Python 2 ,
310256 bytesObrigado @cairdcoinheringaahing por
except:0
-3 bytesObrigado @Mnemonic por -8 bytes
Obrigado @ JonathanAllan por -3 bytes
Obrigado @ovs por -5 bytes
Experimente online!
Alguma explicação:
try-except
é usado para garantir que ambasx
e asy
coordenadas estejam nos limites. A exceção será gerada mediante o acesso aG[y][x]
. Python é muito bom e índices negativos são aceitáveis, portanto, a verificaçãox>-1<y
é adicionada.T=[r[:]for r in G]
usado para criar cópia deG
por valores~-i/2
e~-(i^2)/2
são usados para gerar pares(-1, 0), (0, 1), (0, -1), (1, 0)
, que costumavam se mover na grade (ainda deve haver um caminho mais curto!)R+=[G]*(0==c<'$'==G[y][x])
verifique,'$'
atingido no número necessário de etapas.R
é usado para obter esse resultado de chamadas de função recursivas.for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
Encontradax
ey
de'@'
, em função de entrada e de chamadaS
.print R[0]
R
pode conter mais de uma solução, então a saída é a primeirafonte
if G[y][x]=='$':
porif'$'==G[y][x]:
.R+=(G[y][x]=='$')*(c==0)*[G]
por outro byte.if(x>-1<y)*(G[y][x]in' @'):
y+cmp(i%2,i/2)
seriay+~-(i^2)/2
; pode muito bem ser mais curto ainda.Python 2 ,
264261251249 bytesExperimente online!
fonte