Dyalog APL, 27 personaggi
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
input valutato. APL distingue tra una matrice e un vettore di vettori. Questo programma presuppone che l'ingresso sia una matrice.
(~×⍳∘⍴)A
è un fork equivalente a (~A) × ⍳⍴A
. È necessario per evitare di menzionare ⎕
due volte o introdurre una variabile.
⍴A
è la forma di A
. Per una matrice 4 per 7 la forma è 4 7
.
⍳
è il generatore di indice. ⍳4
lo è 1 2 3 4
. ⍳4 7
sono i vettori (1 1)(1 2)...(4 7)
disposti in una matrice 4 per 7.
~A
lancia i bit di A
.
×
moltiplicando ⍳⍴A
per i bit capovolti, conserviamo le coordinate di tutte le celle libere e trasformiamo tutte le pareti in 0 0
.
,
ravviva la matrice delle coppie di coordinate, cioè la linearizza in un vettore. In questo caso il vettore sarà composto da coppie.
∘.-⍨A
o A∘.-A
sottrae gli elementi di A
pairwise. Si noti che qui gli elementi di A
sono essi stessi coppie.
|
valore assoluto
+/¨
somma ogni coppia di valori assoluti. Questo ci dà le distanze della griglia tra ogni coppia di celle nel labirinto, tranne che per i muri.
1≥
siamo interessati solo nei vicini a una distanza non superiore a 1, questo esclude anche i muri. Ora abbiamo una matrice di adiacenza di un grafico.
∨.∧⍨⍣≡
Floyd - L'algoritmo di chiusura transitiva di Warshall
(f⍣n)A
(non utilizzato qui) dove n
è un numero intero è l'operatore di potenza. Essa si applica f
a A
n
volte: f f ... f A
.
(f⍣g)A
dove g
è una funzione, è l'operatore punto fisso, noto anche come "limite di potenza". Continua a calcolare la serie A
, f A
, f f A
, ... fino a quando ((f⍣i)A) g ((f⍣(i+1))A)
ritorna vero per alcuni i
. In questo caso usiamo match ( ≡
) come g
.
∨.∧⍨A
o A∨.∧A
è un passo nell'algoritmo di Floyd. f.g
è una generalizzazione della moltiplicazione di matrici ( +.×
), qui usiamo congiunzione ( ∧
) e disjunction ( ∨
) al posto di +
e ×
.
⊃⌽
Dopo ⍣≡
aver applicato il passaggio abbastanza volte e raggiunto uno stato stabile, dobbiamo cercare l'angolo in alto a destra della matrice per ottenere il risultato, quindi capovolgilo ( ⌽
) e prendiamo il primo elemento in alto a sinistra ( ⊃
).
Visualizzazione dei ⍣≡
passi