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 7são os vetores (1 1)(1 2)...(4 7)dispostos em uma matriz de 4 por 7.
~Avira os bits de A.
×multiplicando ⍳⍴Apelos 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.
∘.-⍨Aou A∘.-Asubtrai elementos de Apares. Observe que aqui os elementos de Asã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 num número inteiro é o operador de energia. Aplica-se fa A ntempos: f f ... f A.
(f⍣g)AOnde 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.
∨.∧⍨Aou 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