Advent Challenge 4: Present Assembly Line!


12

<< ก่อนหน้า ถัดไป >>

ซานต้าสามารถผลิตของขวัญทั้งหมดที่เอลฟ์ขโมยคืนได้! ตอนนี้เขาต้องส่งพวกเขาไปยังสายการประกอบบรรจุภัณฑ์ เขามักจะมีกล้องเพื่อควบคุมสายการประกอบทั้งสองเพื่อให้แน่ใจว่าพวกเอลฟ์ทำงานได้ดีและเนื่องจากรูปภาพไลน์ประกอบดูดีบนโปสเตอร์โฆษณา[จำเป็นต้องมี]

น่าเสียดายที่กล้องของเขาพังดังนั้นเขาอยากให้คุณวาดแบบจำลองของสายการประกอบว่าจะเป็นอย่างไร!

เพื่อให้สายการประกอบทำงานอย่างมีประสิทธิภาพสูงสุดและเพื่อลดความเสี่ยงของข้อผิดพลาดหรือความล้มเหลวกล่องที่มีอยู่ทั้งหมดจะมีความกว้างเท่ากันเพื่อให้พอดีกับสายพานลำเลียงอย่างสมบูรณ์

ท้าทาย

รับรายการของขวัญที่แสดงตามขนาดของมันเอาท์พุทสายพานลำเลียงพร้อมของนำเสนอทั้งหมด

ของขวัญถูกดึงออกมาเช่น:

  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+

ของขวัญนี้มีความกว้าง 1 ความสูง 2 และความยาว 4 โปรดทราบว่าเครื่องหมายบวกจะไม่นับสำหรับความยาวด้านดังนั้นของขวัญที่มีความยาว 4 จะครอบคลุมตำแหน่งจริง 6 ตำแหน่ง

ของขวัญทั้งหมดจะถูกวาดติดกันโดยมีช่องว่างหนึ่งช่องระหว่างอักขระสองตัวที่ใกล้เคียงที่สุด นั่นคือมุมซ้ายล่างของของขวัญถูกเว้นระยะเช่นถ้ากล่องของขวัญมีความยาวlและความกว้างwมุมซ้ายล่างของกล่องของขวัญถัดไปจะเป็นl + w + 4ตำแหน่งที่ถูกต้องของมุมซ้ายล่างของกล่องก่อนหน้า

หลังจากดึงกล่องที่มีอยู่ทั้งหมดแล้วสายพานลำเลียงจะถูกดึงโดยแทนที่ช่องว่างระหว่างกล่องในแต่ละwidth + 2บรรทัดสุดท้ายด้วยขีดล่าง

ผลลัพธ์สุดท้ายสำหรับกล่องปัจจุบันที่มี(l, w, h)ของ[(4, 1, 2), (8, 1, 3), (1, 1, 1)]จะเป็น:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

การจัดรูปแบบข้อมูลจำเพาะ

คุณสามารถเลือกที่จะใช้รายการของ 3 tuples ที่หนึ่งในองค์ประกอบที่สอดคล้องกันในรายการทั้งหมด (ที่จะเป็นความกว้าง) หรือคุณสามารถใช้ความกว้างปัจจุบันและจากนั้นรายการของ 2-tuples แสดงความยาวและ ความสูงของแต่ละปัจจุบัน คุณสามารถรับอินพุตในลำดับใดก็ได้และในรูปแบบที่เหมาะสม แต่ต้องแสดงของขวัญตามลำดับเดียวกับที่ได้รับเป็นอินพุต

คุณสามารถเลือกรูปแบบผลลัพธ์ที่เหมาะสมสำหรับ ASCII-art (รวมถึงการส่งคืนจากฟังก์ชัน)

กรณีทดสอบ

กรณีทดสอบเหล่านี้มี[(l, w, h), ...]รูปแบบ

[(4, 1, 2), (8, 1, 3), (1, 1, 1)]:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

[(5, 3, 4), (8, 3, 1), (1, 3, 7)]:

                               +-+
                              / /|
                             / / |
    +-----+                 / /  |
   /     /|                +-+   |
  /     / |                | |   |
 /     /  |     +--------+ | |   |
+-----+   |    /        /| | |   |
|     |   +___/        / +_| |   +
|     |  /___/        / /__| |  /
|     | /___+--------+ /___| | /
|     |/____|        |/____| |/
+-----+_____+--------+_____+-+

[(0, 0, 0)] (this is the most interesting test case ever :P)

 ++
+++
++

[(8, 3, 0), (0, 3, 8)] (more zero cases)

                   ++
                  //|
                 // |
                //  |
               ++   |
               ||   |
               ||   |
               ||   |
    +--------+ ||   |
   /        /+_||   +
  /        //__||  /
 /        //___|| /
+--------+/____||/
+--------+_____++

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
  • จะไม่ยอมรับคำตอบ

หมายเหตุ: ผมดึงแรงบันดาลใจสำหรับชุดความท้าทายนี้จากการจุติของรหัส ฉันไม่มีส่วนเกี่ยวข้องกับเว็บไซต์นี้

คุณสามารถดูรายการของความท้าทายทั้งหมดในซีรีส์โดยดูที่ส่วน 'เชื่อมโยง' ของความท้าทายแรกที่นี่


@AdmBorkBork กล่องที่มีอยู่ทั้งหมดมีความกว้างเท่ากัน
Erik the Outgolfer

1
ถ้า Charcoal ไม่ทำลายสิ่งนี้ฉันก็ไม่รู้จะทำอะไร
สิ้นเชิงมนุษย์

@tallyallyhuman ที่จริงแล้วสมอง ** k จะชนะการท้าทายนี้: P
HyperNeutrino

คุณสามารถโพสต์บนเมตาเพื่อทำดัชนีคำถามเหล่านี้ทั้งหมดได้หรือไม่?
RamenChef

@RamenChef อืมความคิดที่ดี ฉันอาจทำเช่นนั้น: P
HyperNeutrino

คำตอบ:


4

ถ่าน , 96 81 ไบต์

NθWS«→FυG↗→↙⁺²θ_≔I⪪ι υ≔⊟υπ≔§υ⁰ρ→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ ↑πP↗⊕θP←⊕ρ↓+↓πF²«↷⁴+ρ↷²+π↷¹+θ↶³

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด อินพุตคือความกว้างของบรรทัดแรกจากนั้นอีกมิติข้อมูลอื่นในบรรทัดต่อไปนี้ซึ่งลงท้ายด้วยบรรทัดว่าง คำอธิบาย:

Nθ

ป้อนความกว้าง

WS«

วนรอบเส้นที่เหลือจนกว่าจะถึงบรรทัดว่าง

→FυG↗→↙⁺²θ_

วาดเข็มขัดระหว่างของขวัญ uตัวแปรที่กำหนดไว้ล่วงหน้าไปยังรายการที่ว่างเปล่าซึ่งจึงไม่ทำอะไรเลยในครั้งแรกผ่านในขณะที่ต่อมามันจะจบลงด้วยองค์ประกอบหนึ่งที่ก่อให้เกิดรหัสนี้เพื่อเรียกใช้ครั้งเดียว (การใช้ an ifจะน้อย golfy.)

≔I⪪ι υ

uแยกขนาดในพื้นที่ที่ทิ้งลงมาที่จำนวนเต็มและบันทึกไว้ใน

≔⊟υπ

pนำมิติที่ผ่านมาและบันทึกไว้ใน

≔§υ⁰ρ

คัดลอกมิติแรกไปยังrแต่ปล่อยไว้uเพื่อให้สายพานถูกดึงเข้าไปในลูปถัดไป

→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ 

ลบการตกแต่งภายในของปัจจุบันในกรณีที่เข็มขัดทับซ้อนกัน

↑πP↗⊕θP←⊕ρ↓+↓π

วาดเส้นภายในของปัจจุบัน

F²«↷⁴+ρ↷²+π↷¹+θ↶³

วาดครึ่งทางรอบนอกของปัจจุบันจากนั้นทำซ้ำอีกครึ่งหนึ่ง


1

Pip , 160 154 ไบต์

153 ไบต์ของรหัส +1 สำหรับการ-lตั้งค่าสถานะ

{YMX:_+B+3MUaRV$.({UwhlWg+^11{a<=h+w?J[sXa-haN[0hh+w]?'-XlWR'+sXlWR("/|"a<h)RV(("+|/"aCMw).sXw)@<MN[ah+w-awh]'_Xw-a+1|s]sXl+w+3}M,y}MUa)R`_ +`'_X#_<|:'_}

[width height length]นี้เป็นฟังก์ชั่นที่ใช้เวลารายการของรายการที่มีให้ ลองออนไลน์!

อย่างไร?

คำอธิบายระดับบนสุด:

  • กำหนดฟังก์ชั่นที่ส่งคืนรายการบรรทัดที่แสดงถึงหนึ่งกล่อง
  • แมปฟังก์ชั่นกับแต่ละรายการของมิติข้อมูลที่กำหนด
  • เชื่อมต่อรายการผลลัพธ์ของรายการที่ชาญฉลาด
  • ทำหลังการประมวลผลเล็กน้อยด้วยการเปลี่ยน regex เพื่อให้ขีดล่างทำงานได้อย่างถูกต้อง

แสดงความคิดเห็นและฉันจะเพิ่มคำอธิบายโดยละเอียด


0

Python 2 , 508 ไบต์

def f(B):
 d=B[0][1]+2;H=max(B)[0]+d+1;W=sum(sum(b[1:])+3for b in B)+len(B);r=[[' ']*i+W*['_']for i in range(d)]+[W*[' ']for _ in' '*H];o=0
 for h,w,l in B:
	for i in range(w+2,1,-1):r[i-1][o+i-2:o+l+i]=[' ']*(l+2)+['/'];r[h+i][o+i-1]=r[h+i][o+l+i]='/'
	r[0][o:o+l+2]=r[h+1][o:o+l+2]=r[w+h+2][o+w+1:o+w+l+3]=['+']+['-']*l+['+']
	for i in range(1,h+1):m=min(i,w)-1;r[i][o:o+l+2+m]=['|']+[' ']*l+['|']+[' ']*m;r[i+w+1][o+l+w+2]='|'
	r[w+1][o+l+w+2]='+';o+=l+w+4
 for l in r[H-1::-1]:print''.join(l).rstrip('_')

ลองออนไลน์!

ใช้รายการของรายการ [height, width, length]

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