Desafio
Dado o tamanho da grade, as posições dos obstáculos, a posição do jogador e a posição do alvo, sua tarefa é encontrar um caminho para o jogador chegar ao alvo e evitar os obstáculos ao mesmo tempo (se necessário).
Entrada
- N : tamanho da grade
N x N
- P : Posição do jogador
[playerposx, playerposy]
- T : Posição do alvo
[targetposx, targetposy]
- O : Posições dos obstáculos
[[x1, y1], [x2, y2],...,[xn, yn]]
Resultado
Caminho : um jogador do caminho pode usar para alcançar o alvo[[x1, y1], [x2, y2],...,[xn, yn]]
Regras
- O ponto
[0,0]
está no canto superior esquerdo da grade. - A posição do jogador sempre estará no lado esquerdo da grade.
- A posição do alvo sempre estará no lado direito da grade.
- A grade sempre terá pelo menos um obstáculo.
- Você pode assumir que nenhum obstáculo se sobrepõe à posição do jogador ou do alvo.
- Você não precisa necessariamente encontrar o caminho mínimo.
- O jogador só pode se mover para a esquerda, direita, superior e inferior, não na diagonal.
- Você pode receber a entrada de qualquer maneira conveniente.
- Você pode assumir que sempre existirá um caminho para o jogador chegar ao alvo.
- Obviamente, para cada entrada existem vários caminhos válidos, escolha um.
- Suponha
N > 2
que a grade seja pelo menos3 x 3
.
Exemplos
Entrada: 9
, [6, 0]
, [3, 8]
, [[0, 5], [2, 2], [6, 4], [8, 2], [8, 7]]
saída possível:[[6, 0], [6, 1], [6, 2], [6, 3], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [4, 8], [3, 8]]
Entrada: 6
, [1, 0]
, [3, 5]
, [[1, 2], [2, 5], [5, 1]]
saída possível:[[1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [2, 4], [3, 4], [3, 5]]
Nota
Observe que X
é para linhas e Y
para colunas . Não os confunda com as coordenadas da imagem.
Editar
Como @digEmAll apontou, devido às regras #2
e #3
, playerY = 0
e targetY = N-1
. Então, se você quiser, pode tomar como única entrada playerX
e e targetX
(se isso faz seu código mais curto).
fonte
Respostas:
JavaScript (ES6), 135 bytes
Assume a entrada como
(width, [target_x, target_y], obstacles)(source_x, source_y)
, onde obstáculos é uma matriz de seqüências de caracteres em"X,Y"
formato.Retorna uma matriz de seqüências de caracteres no
"X,Y"
formato.Experimente online!
Comentado
fonte
R , 227 bytes
Experimente online!
Não é muito curto e definitivamente não está fornecendo o caminho mais curto (por exemplo, verifique o primeiro exemplo).
Ele basicamente executa uma pesquisa recursiva em profundidade e pára assim que o alvo é atingido, imprimindo o caminho.
Agradecimentos a JayCe pela melhoria na formatação da saída
fonte
x1 y1 x2 y2 ... xn yn
: Dwrite(t(mx),1,N)
, em vez deprint
ing :)Python 2 ,
151149 bytesExperimente online!
fonte
Haskell ,
133131130 bytesExperimente online! (com alguns casos de teste)
Uma função que
!
toma como entradan :: Int
tamanho da gradep :: [Int]
posição do jogador como uma lista[xp, yp]
o :: [[Int]]
posição dos obstáculos como uma lista[[x1, y1], [x2, y2], ...]
t :: [[[Int]]]
(implícita) posição do alvo como uma lista[[[xt, yt]]]
(lista tripla apenas por conveniência)e retornando um caminho válido como uma lista
[[xp, yp], [x1, y1], ..., [xt, yt]]
.Como bônus, ele encontra (um dos) caminhos mais curtos e funciona para a posição de qualquer jogador e alvo. Por outro lado, é muito ineficiente (mas os exemplos fornecidos são executados em um período de tempo razoável).
Explicação
iterate
[[xt, yt]]
A expressão aparentemente obscura
[id, map (+ 1)] <*> [[x - 1,y], [x, y - 1]]
é apenas uma versão "golfy" (-1 byte) de[[x + 1, y], [x, y + 1], [x - 1, y], [x, y - 1]]
.fonte
Retina 0.8.2 , 229 bytes
Experimente online! Não tenho certeza se o formato de E / S está qualificado. Explicação:
Duplique cada célula. A cópia esquerda é usada como uma área de trabalho temporária.
Marque o início do labirinto como visitado.
Marque o final do labirinto como vazio.
Enquanto existirem células de trabalho disponíveis, aponte-as para células adjacentes visitadas anteriormente.
Rastreie o caminho desde a saída até o início usando as células em funcionamento como um guia.
Exclua as células de trabalho.
fonte
JavaScript, 450 bytes
Toma entrada como
(n, {playerx, playery}, {targetx, targety}, [{obstaclex, obstacley}])
. Retorna uma matriz de{hopx, hopy}
.Aqui está uma versão não ofuscada na minha bagunça:
fonte