Python 3, 457 316 306 ไบต์
E=enumerate
V={'+'}
Q=[[(-j,i,k)for i,u in E(open(0))for j,v in E(u)for k in[{v}&V,'join'][u[j:j+2]=='|-']]]
while Q:
a,b,c,d,*e=A=tuple(x//2for y,x in sorted((y,x)for x,y in E(Q.pop())));e or exit('NOT')
if{A}-V:V|={A};Q+=[[c,d,a,b]+e,A,A[2:]+A[:2]][a<c<b<d:][c<a<d<b:]
if b==d:Q=[[a,c]+e]
exit('KNOT')
ฮะ?
โปรแกรมจะแปลงปมเป็นไดอะแกรมสี่เหลี่ยมก่อนซึ่งมีข้อ จำกัด ดังต่อไปนี้:
- ไม่มีเซ็กเมนต์แนวตั้งหรือแนวนอนสองอันวางอยู่บนบรรทัดเดียวกัน
- ไม่มีส่วนแนวตั้งข้ามข้ามส่วนแนวนอน
ตัวอย่างเช่นกรณีทดสอบครั้งแรกจะถูกแปลงเป็นแผนภาพสี่เหลี่ยมต่อไปนี้:
+-----------+
| |
| | +-------+
| | | |
| +-------+ | | |
| | | | | |
| | +---+ | |
| | | | | |
| | | +---+ |
| | | |
| | | +-------+
| | | | | |
+-----+ | | | |
| | | | | |
| +---+ | | |
| | | | | |
| | +-------------+ | |
| | | | | |
| | | +---+ |
| | | | | |
| | | | +---+
| | | |
+-+ | |
| |
+-+
ซึ่งเรานำเสนอโดยไม่ซ้ำกันโดยลำดับของพิกัด y ของส่วนแนวตั้งจากขวาไปซ้าย:
(5,10, 1,9, 8,10, 9,12, 5,12, 1,4, 0,3, 2,4, 3,7, 6,8, 7,11, 2,11, 0,6)
จากนั้นค้นหาความเรียบง่ายของแผนภาพสี่เหลี่ยมตามที่อธิบายไว้ในIvan Dynnikov“ การนำเสนอส่วนโค้งของลิงก์ ทำให้เข้าใจง่ายต่อเนื่อง” 2004 Dynnikov พิสูจน์ว่าจากแผนภาพสี่เหลี่ยมใด ๆ ของ unknot มีลำดับของการลดความซับซ้อนของการเคลื่อนไหวที่สิ้นสุดที่แผนภาพเล็กน้อย สั้น ๆ การเคลื่อนไหวที่อนุญาตรวมถึง:
- อนุญาตให้เซกเมนต์ตามแนวตั้ง (หรือแนวนอน) เป็นวงกลม
- การสลับกลุ่มในแนวตั้ง (หรือแนวนอน) ติดต่อกันภายใต้ข้อ จำกัด การกำหนดค่าบางอย่าง
- แทนที่จุดยอดที่อยู่ติดกันสามจุดที่อยู่ในมุมของแผนภาพด้วยจุดสุดยอดเดียว
ดูกระดาษสำหรับรูปภาพ นี่ไม่ใช่ทฤษฎีบทที่ชัดเจน มันไม่ถือถ้าพูดว่า Reidemeister ย้ายที่ไม่เพิ่มจำนวนของการข้ามถูกนำมาใช้แทน แต่สำหรับการทำให้เข้าใจง่ายบางประเภทด้านบนมันกลายเป็นจริง
(เราลดความซับซ้อนของการใช้งานโดยอนุญาตให้เฉพาะส่วนแนวตั้งเท่านั้น
การสาธิต
$ python3 knot.py <<EOF
+-------+ +-------+
| | | |
| +---|----+ +-------+
| | | | | |
+-------|------------|---+
| | | |
+---+ +---+
EOF
KNOT
$ python3 knot.py <<EOF
+----------+
| |
| +--------------+
| | | |
| | +-|----+ |
| | | | | |
| +-----+ | |
| | | |
| +------|---+
| |
+---------------+
EOF
NOT
$ python3 knot.py <<EOF # the Culprit
+-----+
| |
+-----------+ |
| | | |
| +-+ | +---|-+
| | | | | | | |
| +-|-------+ | |
| | | | | | | |
+-|-+ | | +---+ |
| | | |
+---|---------+
| |
+-+
EOF
NOT
$ python3 knot.py <<EOF # Ochiai unknot
+-----+
| |
+-|---------+
| | | |
| | +-+ | |
| | | | | |
+-|-|---|-|-+ |
| | | | | | | |
| | | +---|---+
| | | | | |
+-------+ | |
| | | |
| +-------+
| |
+-------+
EOF
NOT
$ python3 knot.py <<EOF # Ochiai unknot plus trefoil
+-----+ +-----+
| | | |
+-|---------+ |
| | | | | |
| | +-+ | +---+ |
| | | | | | | |
+-|-|---|-|-+ +---+
| | | | | | | |
| | | +---|-----+
| | | | | |
+-------+ | |
| | | |
| +-------+
| |
+-------+
EOF
KNOT
$ python3 knot.py <<EOF # Thistlethwaite unknot
+---------+
| |
+---+ +---------+
| | | | | |
| +-------+ | |
| | | | | |
| | | +---+ |
| | | | | |
| | +-------+ |
| | | | | |
| +-------+ | |
| | | | | |
+-----------+ | | | |
| | | | | |
| +-----------+ | | |
| | | | | |
| | +-------------+ |
| | | |
| | +-----+
| | | |
| | +---+
| | | |
+---------------------+ |
| |
+---------------------+
EOF
NOT
$ python3 knot.py <<EOF # (−3,5,7)-pretzel knot
+-------------+
| |
+-|-----+ |
| | | |
+-|-+ +-------+ |
| | | | | |
+-|-+ +---+ +---+
| | | | | |
| | +---+ +---+
| | | | | |
| | +---+ +---+
| | | | | |
| +---+ +---+
| | | |
| | +---+
| | | |
| | +---+
| | | |
| +---+
| |
+-----+
EOF
KNOT
$ python3 knot.py <<EOF # Gordian unknot
+-------------+ +-------------+
| | | |
| +---------+ | | +---------+ |
| | | | | | | |
| | +-------------+ +-------------+ | |
| | | | | | | | | | | |
| | | +---------+ | | +---------+ | | |
| | | | | | | | | | | | | | | |
| +-------+ | +-------+ +-------+ | +-------+ |
| | | | | | | | | | | | | | | |
+-------+ | +-------+ | | +-------+ | +-------+
| | | | | | | | | | | | | | | |
| +-------+ | | | | | | | | +-------+ |
| | | | | | | | | | | | | | | |
+-------+ | | | | | | | | | | +-------+
| | | | | | | | | | | | | | | |
| +-----+ | | | | | | +-----+ |
| | | | | | | | | | | |
+---------+ | | | | +---------+
| | | | | | | |
+---------+ | | +---------+
| | | | | | | |
| | +-----------------+ | |
| | | | | |
| +---------------------+ |
| | | |
+-----------+ +-----------+
EOF
NOT