Dyalog APL, 27 caracteres
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
entrada avaliada. APL distingue entre uma matriz e um vetor de vetores. Este programa assume que a entrada é uma matriz.
(~×⍳∘⍴)A
é um garfo equivalente a (~A) × ⍳⍴A
. É necessário evitar mencionar ⎕
duas vezes ou introduzir uma variável.
⍴A
é a forma de A
. Para uma matriz de 4 por 7, a forma é 4 7
.
⍳
é o gerador de índice. ⍳4
é 1 2 3 4
. ⍳4 7
são os vetores (1 1)(1 2)...(4 7)
dispostos em uma matriz de 4 por 7.
~A
vira os bits de A
.
×
multiplicando ⍳⍴A
pelos bits invertidos, preservamos as coordenadas de todas as células livres e transformamos todas as paredes em 0 0
.
,
percorre a matriz de pares de coordenadas, ou seja, a lineariza em um vetor. Nesse caso, o vetor será composto por pares.
∘.-⍨A
ou A∘.-A
subtrai elementos de A
pares. Observe que aqui os elementos de A
são eles próprios pares.
|
valor absoluto
+/¨
somar cada par de valores absolutos. Isso nos dá as distâncias da grade entre cada par de células no labirinto, exceto as paredes.
1≥
estamos interessados apenas nos vizinhos a uma distância não superior a 1, isso também exclui muros. Agora temos a matriz de adjacência de um gráfico.
∨.∧⍨⍣≡
Floyd - algoritmo de fechamento transitivo de Warshall
(f⍣n)A
(não usado aqui) onde n
um número inteiro é o operador de energia. Aplica-se f
a A
n
tempos: f f ... f A
.
(f⍣g)A
Onde g
é uma função, é o operador de ponto fixo, também conhecido como "limite de potência". Ele continua a calcular a série A
, f A
, f f A
, ... até que ((f⍣i)A) g ((f⍣(i+1))A)
retorna true para alguns i
. Nesse caso, usamos match ( ≡
) como g
.
∨.∧⍨A
ou A∨.∧A
é um passo no algoritmo de Floyd. f.g
é uma generalização da multiplicação de matrizes ( +.×
), aqui usamos conjunção ( ∧
) e disjunção ( ∨
) no lugar de +
e ×
.
⊃⌽
Depois de ⍣≡
aplicar a etapa várias vezes e atingir um estado estável, devemos procurar o canto superior direito da matriz para obter o resultado, então giramos ( ⌽
) e pegamos o primeiro item superior esquerdo ( ⊃
).
Visualização das ⍣≡
etapas