Dyalog APL, 27 ตัวอักษร
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕การประเมินการป้อนข้อมูล APL แยกความแตกต่างระหว่างเมทริกซ์และเวกเตอร์ของเวกเตอร์ โปรแกรมนี้อนุมานว่าอินพุตเป็นเมทริกซ์
(~×⍳∘⍴)A(~A) × ⍳⍴Aเป็นเทียบเท่าส้อม จำเป็นต้องหลีกเลี่ยงการพูดถึง⎕สองครั้งหรือแนะนำตัวแปร
⍴AAเป็นรูปทรงของ สำหรับเมทริกซ์ 4 โดย 7 4 7รูปร่าง
⍳เป็นตัวสร้างดัชนี เป็น ⍳4 คือเวกเตอร์ที่จัดเรียงในเมทริกซ์ 4 คูณ 71 2 3 4⍳4 7(1 1)(1 2)...(4 7)
~AAพลิกบิตของ
×โดยการคูณโดยบิตพลิกเรารักษาพิกัดของเซลล์ฟรีและเปิดผนังทั้งหมดลง⍳⍴A0 0
,ravels เมทริกซ์ของคู่พิกัดเช่นทำให้เป็นเชิงเส้นเป็นเวกเตอร์ ในกรณีนี้เวกเตอร์จะประกอบด้วยคู่
∘.-⍨AหรือA∘.-Aลบองค์ประกอบของApairwise โปรดทราบว่าที่นี่องค์ประกอบของ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เป็นลักษณะทั่วไปของการคูณเมทริกซ์ ( +.×) ที่นี่เราใช้ร่วม ( ∧) และความร้าวฉาน ( ∨) ในสถานที่และ+×
⊃⌽ หลังจากที่⍣≡ใช้ขั้นตอนเพียงพอและถึงสถานะที่มั่นคงแล้วเราต้องค้นหามุมบนขวาของเมทริกซ์เพื่อรับผลลัพธ์ดังนั้นเราจึงพลิกมัน ( ⌽) และนำรายการแรกซ้ายบน ( ⊃)
การแสดง⍣≡ขั้นตอนของ