Dyalog APL, 27 ตัวอักษร
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
การประเมินการป้อนข้อมูล APL แยกความแตกต่างระหว่างเมทริกซ์และเวกเตอร์ของเวกเตอร์ โปรแกรมนี้อนุมานว่าอินพุตเป็นเมทริกซ์
(~×⍳∘⍴)A
(~A) × ⍳⍴A
เป็นเทียบเท่าส้อม จำเป็นต้องหลีกเลี่ยงการพูดถึง⎕
สองครั้งหรือแนะนำตัวแปร
⍴A
A
เป็นรูปทรงของ สำหรับเมทริกซ์ 4 โดย 7 4 7
รูปร่าง
⍳
เป็นตัวสร้างดัชนี เป็น ⍳4
คือเวกเตอร์ที่จัดเรียงในเมทริกซ์ 4 คูณ 71 2 3 4
⍳4 7
(1 1)(1 2)...(4 7)
~A
A
พลิกบิตของ
×
โดยการคูณโดยบิตพลิกเรารักษาพิกัดของเซลล์ฟรีและเปิดผนังทั้งหมดลง⍳⍴A
0 0
,
ravels เมทริกซ์ของคู่พิกัดเช่นทำให้เป็นเชิงเส้นเป็นเวกเตอร์ ในกรณีนี้เวกเตอร์จะประกอบด้วยคู่
∘.-⍨A
หรือA∘.-A
ลบองค์ประกอบของA
pairwise โปรดทราบว่าที่นี่องค์ประกอบของA
เป็นคู่ของตัวเอง
|
ค่าสัมบูรณ์
+/¨
หาผลรวมของค่าสัมบูรณ์แต่ละคู่ สิ่งนี้ทำให้เรามีระยะทางกริดระหว่างเซลล์ทุกคู่ในเขาวงกตประหยัดกำแพง
1≥
เราเป็นเพียง intrested ในประเทศเพื่อนบ้านในระยะไม่เกิน 1 นี้ยังไม่รวมผนัง ตอนนี้เรามีเมทริกซ์ adjacency ของกราฟ
∨.∧⍨⍣≡
Floyd - อัลกอริธึมการปิดของ Warshall
(f⍣n)A
(ไม่ได้ใช้ที่นี่) โดยที่n
จำนวนเต็มคือตัวดำเนินการพลังงาน ใช้f
กับA
n
เวลา: f f ... f A
.
(f⍣g)A
โดยที่g
ฟังก์ชั่นเป็นตัวดำเนินการจุดคงที่หรือที่รู้จักกันว่า "ขีด จำกัด พลังงาน" มันช่วยในการคำนวณชุดA
, f A
, f f A
, ... จนกระทั่งผลตอบแทนที่แท้จริงสำหรับบางคน((f⍣i)A) g ((f⍣(i+1))A)
i
ในกรณีนี้เราจะใช้การจับคู่ ( ≡
) g
ในฐานะ
∨.∧⍨A
หรือA∨.∧A
เป็นขั้นตอนในอัลกอริทึมของฟลอยด์ f.g
เป็นลักษณะทั่วไปของการคูณเมทริกซ์ ( +.×
) ที่นี่เราใช้ร่วม ( ∧
) และความร้าวฉาน ( ∨
) ในสถานที่และ+
×
⊃⌽
หลังจากที่⍣≡
ใช้ขั้นตอนเพียงพอและถึงสถานะที่มั่นคงแล้วเราต้องค้นหามุมบนขวาของเมทริกซ์เพื่อรับผลลัพธ์ดังนั้นเราจึงพลิกมัน ( ⌽
) และนำรายการแรกซ้ายบน ( ⊃
)
การแสดง⍣≡
ขั้นตอนของ