การปรับปรุงบ้านสำหรับ Minotaur


42

การปรับปรุงบ้านสำหรับ Minotaur

เขาวงกต cretan ค่อนข้างวาดได้ง่าย เพิ่งเริ่มต้นด้วยรูปร่างสมมาตร (ที่นี่เป็นสีแดง) ให้เราเรียกจุดสิ้นสุดทั้งหมดของ 'โหนด' ของเส้นเหล่านั้น จากนั้นคุณเริ่มวาดส่วนโค้ง (สีดำ): ส่วนแรกเริ่มต้นที่โหนดกลางด้านบนและเชื่อมต่อกับโหนดถัดจากด้านขวามือจากนั้นโหนดทั้งสองที่อยู่ใกล้กับส่วนโค้งก่อนหน้านี้จะถูกเชื่อมต่อ สิ่งนี้จะถูกทำซ้ำจนกว่าจะครอบคลุมโหนดทั้งหมด

GIF

ตอนนี้เราสามารถสรุปแนวคิดนี้ได้: เราสามารถสร้างรูปแบบเริ่มต้นใหม่ได้อย่างง่ายดายโดยการเพิ่มLรูปร่างเพิ่มเติม ฉันระบุรูปร่างเริ่มต้นดังนี้

ระดับ

รูปแบบซ้ายส่วนใหญ่จะผลิตเขาวงกตครีตของระดับ 0 คนต่อไปจะสร้างเขาวงกต cretan ระดับ 1 (เดิม) ฯลฯ

งาน

ด้วยจำนวนเต็มที่ไม่ใช่ค่าลบnโปรแกรมของคุณควรแสดงผลลัพธ์ ascii ของเขาวงกต cretan ระดับnที่แสดงในตัวอย่างต่อไปนี้ ช่องว่างต่อท้าย / การขึ้นบรรทัดใหม่ไม่สำคัญ คุณต้องรวมคำอธิบายสั้น ๆ ว่าโค้ดทำงานอย่างไร

ตัวอย่าง

เอาต์พุตสำหรับ cretan labyrith ต้นฉบับ (องศา 1) มีดังต่อไปนี้:

+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
              +---------------+

รูปแบบเริ่มต้น:

+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +

เขาวงกต cretian ระดับ 0 ควรมีลักษณะดังนี้:

+-------------+ 
| +---------+ | 
| | +-----+ | | 
| | | +-+ | | | 
| | + | + | | | 
| +---+---+ | | 
+---+ | +---+ | 
      +-------+ 

รูปแบบเริ่มต้น:

+ | +
--+--
+ | +

คำตอบ:


10

Perl 5, 349 ไบต์

say$p="| "x$_,"+","-"x(16*$n-4*$_+13),"+ $p"for 0..4*($n=pop)+3;say$p="| "x(3*$n+2),"+ | ","| "x2x$n,"+ $p|";$p=~s/..//,$q="-"x(4*$_-1),say"$p+$q+ ","| "x(2*$n-2*$_+1),"+$q+ $p|"for 1..$n;$p=~s/..//;say$p,("+---"."-"x4x$n)x2,"+ $p|";$p=~s/..//,$q="-"x(4*$n+3)."-"x4x$_,say"$p+$q+ | ","| "x2x($n-abs$_),"+$q+ $p|"for-$n..$n;say" "x(8*$n+6),"+----$q+"

(ผ่านnเป็นอาร์กิวเมนต์บรรทัดคำสั่ง)

คำนวณเขาวงกตทีละบรรทัดในหกส่วน:

  • 4n แรก + 4 บรรทัด
  • บรรทัดถัดไป (บรรทัดเดียวที่ไม่มี-)
  • บรรทัดถัดไป
  • บรรทัดถัดไป (บรรทัดที่อยู่ตรงกลางของรูปแบบเริ่มต้น)
  • ถัดไป 2n + 1 บรรทัด
  • บรรทัดสุดท้าย (บรรทัดที่มีช่องว่างนำหน้า)

6

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ที่ถูกกล่าวโดยทั่วไปสิ่งที่เกิดขึ้นทีละขั้นตอนคือ ...

  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ในรูปแบบของรายการ

  2. 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 องศาในที่สุดมันก็จะคืนค่านี้:

    +-----------------------------+
    | +-------------------------+ |
    | | +---------------------+ | |
    | | | +-----------------+ | | |
    | | | | +-------------+ | | | |
    | | | | | +---------+ | | | | |
    | | | | | | +-----+ | | | | | |
    | | | | | | | +-+ | | | | | | |
    | | | | | + | | | + | | | | | |
    | | | | +---+ | +---+ | | | | |
    | | | +-------+-------+ | | | |
    | | +-------+ | +-------+ | | |
    | +-------+ | | | +-------+ | |
    +-----------+ | +-----------+ |
                  +---------------+
    

1
คุณสามารถกำหนดก่อนR=rangeหรือบางอย่างเช่นนั้น? เหมือนกันP='+'หรือ
ข้อบกพร่อง

1
ฉันคิดว่าคุณควรใช้โอกาสทองในการพูดfor g,o,k,u in Z
Sherlock9

@ Sherlock9 ฮ่าฮ่า! ความคิดที่ดี! ที่เพิ่ม :)
R. Kap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.