เขียนโปรแกรมเพื่อวาดแผนภาพ 2 มิติของปมโดยขึ้นอยู่กับโครงสร้างของปม ปมคือสิ่งที่ฟังดูเหมือน: เป็นเชือกที่ผูกไว้ ในวิชาคณิตศาสตร์แผนภาพปมแสดงให้เห็นว่าชิ้นส่วนของเชือกข้ามหรือใต้ตัวเองเพื่อสร้างปม ตัวอย่างไดอะแกรมแสดงปมด้านล่าง:
มีตัวแบ่งในบรรทัดที่เชือกข้ามตัวเองได้
อินพุต: อินพุตที่อธิบายถึงปมคืออาร์เรย์ของจำนวนเต็ม ปมที่เชือกข้ามตัวมันเองnครั้งสามารถแสดงเป็นอาร์เรย์ของจำนวนเต็มnจำนวนโดยแต่ละค่าในช่วง [0, n-1] ขอเรียกอาร์เรย์นี้K
ในการรับอาร์เรย์ที่อธิบายถึงปมให้ระบุหมายเลขแต่ละเซ็กเมนต์ 0 ถึง n-1 ส่วนที่ 0 ควรนำไปสู่ส่วนที่ 1 ซึ่งควรนำไปสู่ส่วนที่ 2 ซึ่งควรนำไปสู่ส่วนที่ 3 และต่อ ๆ ไปจนกว่าส่วนที่ n-1 จะวนกลับมาและนำไปสู่ส่วนที่ 0 ส่วนจะสิ้นสุดลงเมื่อส่วนอื่น ๆ แสดงโดยตัวแบ่งในบรรทัดในแผนภาพ) ลองมาหาเงื่อนที่ง่ายที่สุด - ปมพระฉายาลักษณ์ หลังจากที่เราได้นับเซกเมนต์แล้วเซกเมนต์ 0 จะสิ้นสุดลงเมื่อเซกเมนต์ 2 ตัดกัน ส่วนที่ 1 สิ้นสุดลงเมื่อส่วนที่ 0 ข้ามไป และส่วนที่ 2 สิ้นสุดลงเมื่อส่วนที่ 1 ตัดผ่าน ดังนั้นอาร์เรย์ที่อธิบายถึงปมคือ [2, 0, 1] โดยทั่วไปเซ็กเมนต์xเริ่มต้นโดยที่เซ็กเมนต์x-1 mod n ค้างไว้และสิ้นสุดที่ส่วนK [x]ตัดกัน
ภาพด้านล่างแสดงไดอะแกรมโบว์พร้อมเซ็กเมนต์ที่มีเลเบลและอาร์เรย์ที่สอดคล้องซึ่งอธิบายถึงปม
แผนภาพสามอันดับแรกเป็นนอตจริงในขณะที่สามด้านล่างเป็นลูปของเชือกที่ข้ามตัวเอง แต่ไม่ได้ผูกปมจริง ๆ (แต่ยังมีรหัสที่เกี่ยวข้อง)
งานของคุณคือการเขียนฟังก์ชั่นที่ใช้อาร์เรย์ของจำนวนเต็มK (คุณสามารถเรียกมันว่าอะไรบางอย่างที่แตกต่างกัน) ที่อธิบายถึงปม (หรือห่วงของเชือกที่ไม่ได้ผูกปมไว้) ตัวอย่าง. หากเป็นไปได้ให้ระบุรหัสหรือคำอธิบายในเวอร์ชันที่ไม่ดีและให้ผลลัพธ์ตัวอย่างของโค้ดของคุณ ปมเดียวกันสามารถแสดงได้หลายวิธี แต่ถ้าปมไดอะแกรมฟังก์ชันที่เอาต์พุตของคุณตรงกับอินพุตเป็นหนึ่งในวิธีที่เป็นไปได้วิธีแก้ปัญหาของคุณจะใช้ได้
นี่คือ code-golf ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ เส้นที่เป็นตัวแทนของเชือกสามารถมีความหนา 1 พิกเซลอย่างไรก็ตามภายใต้และข้ามแยกจะต้องแยกแยะได้อย่างชัดเจน (ขนาดของการแตกในเชือกควรมากกว่าความหนาของเชือกอย่างน้อยหนึ่งพิกเซลด้านใดด้านหนึ่ง) .
ฉันจะถอนคำตอบที่ต้องพึ่งพาความสามารถของทฤษฎีปมในตัว แต่สิ่งที่เลือกไว้ในท้ายที่สุดไม่สามารถพึ่งพาความสามารถในทฤษฎีปมในตัวได้
ทุกสิ่งที่ฉันรู้เกี่ยวกับสัญกรณ์ของฉัน:ฉันเชื่อว่ามีลำดับของค่าที่ดูเหมือนจะไม่สอดคล้องกับปมหรือ unknot ใด ๆ ตัวอย่างเช่นลำดับ [2, 3, 4, 0, 1] ดูเหมือนจะเป็นไปไม่ได้ที่จะวาด
นอกเหนือจากนั้นสมมติว่าคุณใช้การข้ามและเริ่มต้นจากการข้ามนั้นไปตามเส้นทางของเชือกในทิศทางเดียวและติดป้ายกำกับการข้ามที่ไม่มีป้ายกำกับทุกครั้งที่คุณเจอค่าที่สมบูรณ์ยิ่งขึ้น สำหรับการสลับนอตมีอัลกอริทึมง่าย ๆ ในการแปลงสัญกรณ์ของฉันไปเป็นการติดฉลาก
template<size_t n> array<int, 2*n> LabelAlternatingKnot(array<int, n> end_at)
{
array<int, n> end_of;
for(int i=0;i<n;++i) end_of[end_at[i]] = i;
array<int, 2*n> p;
for(int& i : p) i = -1;
int unique = 0;
for(int i=0;i<n;i++)
{
if(p[2*i] < 0)
{
p[2*i] = unique;
p[2*end_of[i] + 1] = unique;
++unique;
}
if(p[2*i+1] < 0)
{
p[2*i+1] = unique;
p[2*end_at[i]] = unique;
++unique;
}
}
return p;
}
template<size_t n> auto GetGaussCode(array<int, n> end_at)
{
auto crossings = LabelAlternatingKnot(end_at);
for(int& i : crossings) ++i;
for(int i=1;i<2*n;i+=2) crossings[i] = -crossings[i];
return crossings;
}
KnotData
ใน Mathematica ... : '(
Knot
builtin! ตัวอย่างการใช้งาน: อัตราผลตอบแทน<< Units`; Convert[Knot, Mile/Hour]
1.1507794480235425 Mile/Hour
(ฉันคิดว่ามันเป็นเรื่องตลกโดยไม่คำนึงว่ามันจะจริงหรือเท็จ แต่จริง ๆ แล้วมันเป็นจริง)