Labirintos de gelo têm sido um dos meus itens favoritos dos jogos Pokémon desde a sua estreia em Pokémon Gold e Silver. Sua tarefa será criar um programa que resolva esses tipos de problemas.
Labirintos de gelo consistem principalmente, como o nome sugere, em gelo. Uma vez que o jogador se move em uma direção no gelo, ele continuará a se mover nessa direção até colidir com algum obstáculo. Também há solo que pode ser movimentado livremente e impedirá qualquer jogador de se mover. O último obstáculo é a pedra. A pedra não pode ocupar o mesmo espaço que o jogador e, se o jogador tentar entrar nele, parará de se mover antes que possa.
Você receberá um contêiner bidimensional de valores, como uma lista de listas ou uma sequência separada por novas linhas, contendo 3 valores distintos para cada um dos 3 tipos de piso (gelo, solo e pedra). Você também receberá dois pares (ou outros recipientes de valor equivalente) que indicam uma coordenada de início e objetivo no labirinto. Estes podem ser zero ou um indexado.
Você deve produzir uma lista de movimentos (4 valores distintos com uma bijeção em N, E, S, W) que levariam o jogador a chegar ao final quando executado.
A entrada sempre terá um perímetro fechado de pedra ao redor do labirinto, para que você não precise se preocupar com o jogador saindo do labirinto
Isso é código-golfe, então o menor número de bytes vence
Casos de teste
Aqui .
representará gelo, ~
representará solo e O
representará uma pedra. As coordenadas são 1 indexadas. Cada letra da solução representa a direção que começa com essa letra (por exemplo, N
= Norte)
Entrada
OOOOO
OO.OO
O...O
OOOOO
Start : 3,3
End : 3,2
Resultado
N
Entrada
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO
Start : 15,12
End : 16,8
Resultado
N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N
Entrada
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO
Start : 2,2
End : 14,3
Resultado
E,S,S,W,N,E,N
Entrada
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO
Start : 2,2
End : 11,11
Resultado
E,E,E,E,E,S,S,E,N,W,S,E,N,N,N
fonte
Respostas:
Mathematica, 247 bytes
Com quebras de linha:
Minha idéia imediata foi representar as posições de gelo e solo como nós em um gráfico com arestas direcionadas correspondentes a movimentos legais e, em seguida, usar
FindPath
. Alguém poderia pensar que determinar as medidas legais seria a parte mais fácil e encontrar a solução seria a parte mais difícil. Para mim, foi o contrário. Abra a sugestões sobre como calcular as arestas.O primeiro argumento
#
é uma matriz 2D onde0
representa gelo,1
representa solo e2
representa pedra.O segundo argumento
#2
e o terceiro argumento#3
são os pontos inicial e final, respectivamente, na forma{row,column}
.
é o caractere de uso privado de 3 bytes queU+F4A1
representa\[Function]
.Explicação
Define uma função
p
que obtém uma listax
do formulário{row,column}
e saídas#[[row,column]]
; ou seja, o valor de gelo / solo / pedra nessa coordenada.Define uma função
m
que assume umc
vetor de posição e direção inicialv
e determina recursivamente onde você terminaria. Sec+v
é gelo, continuamos deslizando a partir desse ponto, e então ele retornam[c+v,v]
. Sec+v
é solo, então nos movemos parac+v
e paramos. Caso contrário (sec+v
for pedra ou fora dos limites), você não se mexe. Observe que isso deve ser chamado apenas em posições de gelo ou solo.Define a lista
g
de posições de gelo e solo (p
valor menor que2
).Define uma função
a
que toma uma posição de partidac
e retorna o resultado de se mover nos{1,0}
,{-1,0}
,{0,1}
, e{0,-1}
instruções. Pode haver alguma redundância. Novamente, isso pressupõe quec
corresponde ao gelo ou ao solo.Define a lista
e
de arestas direcionadas que representam movimentos legais. Para cada posição#
nag
, calcula-se a tabela de arestas#->c
para cadac
noa@#
. Então, como acabaremos com uma sub-lista para cada posição#
, nivelo o primeiro nível. Pode haver alguns loops e várias arestas.Graph[e]
é o gráfico em que os nós são as posições legais (gelo ou solo) e as bordas representam movimentos legais (possivelmente colidindo com uma pedra e não se movendo). Em seguida, usamosFindPath
para encontrar um caminho de#2
para#3
representado como uma lista de nós. ComoFindPath
podem ser necessários argumentos adicionais para encontrar mais de um caminho, o resultado será realmente uma lista que contém um único caminho, então eu pego o primeiro elemento usando[[1]]
. Então eu tomo o sucessivoDifferences
das coordenadas eNormalize
eles. Assim, cima é{-1,0}
, baixo é{1,0}
, direita é{0,1}
e esquerda é{0,-1}
.Casos de teste
fonte
JavaScript (ES6) 180
183Usando um BFS , como fiz para resolver esse desafio relacionado
Entrada
O mapa do labirinto é uma cadeia de linhas múltiplas, usando
O
ou0
para pedra,8
para o solo e qualquer dígito diferente de zero menor que 8 para gelo (7
boa aparência).As posições inicial e final são baseadas em zero.
Saída
Uma lista de deslocamento, onde -1 é
W
, 1 éE
, negativo é menor que -1N
e positivo positivo é maior que 1.S
Menos golfe
Teste
fonte