Python 3.5, 703 695 676 648 587 581 542 535 500 486 462 431 423 411 ไบต์:
( ขอบคุณ @flawr สำหรับคำแนะนำเกี่ยวกับการบันทึก 55 ไบต์ (486 -> 431)! )
def j(r):R=range;Z=zip;B=r+r+2;P,M='+-';X='| ';q=[*Z(R(0,B-1,2),R(B-1,0,-2))];L=r+1;A=2+r;print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))
ไม่มากนักสำหรับชื่อ แต่ฉันยังให้มันยิงและมันทำงานได้อย่างสมบูรณ์ ฉันจะพยายามย่อให้สั้นลงเมื่อเวลาผ่านไป แต่สำหรับตอนนี้ฉันรักและไม่สามารถมีความสุขมากขึ้น
ลองออนไลน์! (Ideone) (อาจดูแตกต่างกันเล็กน้อยที่นี่เนื่องจากข้อ จำกัด ของคอมไพเลอร์ออนไลน์ที่ชัดเจนอย่างไรก็ตามมันก็ยังเหมือนเดิม)
คำอธิบาย:
สำหรับวัตถุประสงค์ของคำอธิบายนี้สมมติว่าฟังก์ชั่นดังกล่าวข้างต้นถูกประหารชีวิตด้วยการป้อนข้อมูลที่เป็นเท่ากับr
1
ที่ถูกกล่าวโดยทั่วไปสิ่งที่เกิดขึ้นทีละขั้นตอนคือ ...
q=[*Z(R(0,B-1,2),R(B-1,0,-2))]
วัตถุซิปq
, ถูกสร้างขึ้นด้วยวัตถุ 2 ช่วงหนึ่งที่ประกอบด้วยทุกจำนวนเต็มสองในช่วง0=>r+r+1
และอื่น ๆ r+r+1=>0
ซึ่งประกอบด้วยทุกจำนวนเต็มสองในช่วง นี่เป็นเพราะทุกรูปแบบเริ่มต้นของเขาวงกต cretan ในระดับที่เฉพาะเจาะจงมักจะมีจำนวนคู่-
ในแต่ละบรรทัด ยกตัวอย่างเช่นสำหรับเขาวงกตครีตปริญญา1
, r+r+1
เท่ากับ3
และทำให้รูปแบบของมันมักจะเริ่มต้นด้วยการ0
ขีดกลางตามด้วยสายอื่นด้วย4
(2 + 2) ขีดคั่น วัตถุซิปนี้จะใช้สำหรับr+1
บรรทัดแรกของรูปแบบเขาวงกต
หมายเหตุ: เท่านั้นเหตุผลq
คือรายการและแยกออกจากส่วนที่เหลือเป็นเพราะq
มีการอ้างอิงไม่กี่ครั้งและ subscripted และประหยัดมากการทำซ้ำและอนุญาตให้ subscripting ผมก็สร้างวัตถุซิปq
ในรูปแบบของรายการ
print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))
นี่เป็นขั้นตอนสุดท้ายที่เขาวงกตถูกสร้างขึ้นและประกอบเข้าด้วยกัน ที่นี่มีสามรายการรายการแรกประกอบด้วย4*r+1
บรรทัดบนสุดของเขาวงกตรายการที่สองประกอบด้วย3*r+3
บรรทัดกลางของเขาวงกตและรายการสุดท้ายประกอบด้วยบรรทัดสุดท้ายของเขาวงกตเข้าด้วยกันโดยมีตัวแบ่งบรรทัด ( \n
) เข้ามา หนึ่งสายยาว ในที่สุดสตริงขนาดใหญ่อันนี้ซึ่งประกอบด้วยเขาวงกตทั้งหมดจะถูกพิมพ์ออกมา ให้เราลงลึกเข้าไปในรายการ 2 รายการนี้และ 1 สายอักขระที่ประกอบด้วย:
รายการที่ 1 ซึ่งมีการใช้วัตถุซิปอื่นในรายการความเข้าใจเพื่อสร้างแต่ละบรรทัดทีละบรรทัดโดยมีการนำหน้า|
หรือ+
สัญลักษณ์จำนวนขีดกลางจำนวนคี่ในช่วง0=>4*(r+1)
ลาก|
หรือ+
สัญลักษณ์แล้วขึ้นบรรทัดใหม่ ( \n
) ในกรณีของปริญญา1
เขาวงกตรายการนี้จะส่งกลับ:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
รายการที่ 2 ซึ่งประกอบด้วยวัตถุซิปที่มี 4 รายการและแต่ละรายการสอดคล้องกับจำนวนของ|
สัญลักษณ์นำหน้า / ต่อท้ายจำนวน+
สัญลักษณ์จำนวนเครื่องหมายขีดกลางและสุดท้ายรายการสุดท้ายซึ่งมีr+1
บรรทัดแรกของ รูปแบบที่สร้างขึ้นตามวัตถุซิปq
เส้นที่อยู่ตรงกลางของรูปแบบ (อันที่ไม่มี|
) และr+2
บรรทัดสุดท้ายของรูปแบบสมมาตร ในกรณีเฉพาะนี้รายการสุดท้ายที่ใช้ในวัตถุซิปของรายการนี้จะกลับมา:
+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +
--+ | +-- <- Last line created especially for use in the middle of the labyrinth itself.
ดังนั้นในกรณีของเขาวงกต 1 องศารายการทั้งหมดนี้จะกลับมา:
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ | <- Here is where the extra line of the pattern is used.
รายการสุดท้ายนี้ซึ่งสร้างบรรทัดสุดท้าย ที่นี่ส่วนแรก (ความยาวหนึ่งก่อนถึงช่องว่างแรก) ของบรรทัดสุดท้ายของP
หมายเลขรายการของช่องว่างจะถูกสร้างขึ้น จากนั้นจะเพิ่มความยาวของเซกเมนต์สุดท้าย (เซกชั่นสิ้นสุด) ของบรรทัดเดียวกัน + 4 จำนวนของเครื่องหมายขีดคั่นซึ่งทั้งหมดจะถูกนำหน้าและตามด้วย+
สัญลักษณ์เดียว ในกรณีของเขาวงกตระดับ 1 รายการสุดท้ายนี้จะคืนค่า:
+---------------+
หลังจากเข้าร่วมทั้งหมดนี้เข้าด้วยกันในที่สุดขั้นตอนนี้ก็จะส่งคืนเขาวงกตที่เสร็จสมบูรณ์ ในกรณีของเขาวงกต 1 องศาในที่สุดมันก็จะคืนค่านี้:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
+---------------+
R=range
หรือบางอย่างเช่นนั้น? เหมือนกันP='+'
หรือ