เติมลูกโป่งน้ำ


15

ในการท้าทายนี้คุณต้องแสดงศิลปะ ASCII ของบอลลูนน้ำที่กำหนดปริมาณน้ำที่เต็มไปด้วยบอลลูน:

|  __||__  |
| / #   #\ |
| |######| |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
+----------+

วิธีการวาดบอลลูน

ในการแสดงบอลลูนที่มีขนาดnให้ทำตามขั้นตอนต่อไปนี้ (หมายเหตุ: เมื่อใดก็ตามที่มีการใช้สัญลักษณ์การหาร ( /) มันจะแสดงถึงการหารจำนวนเต็มปัดเศษลง):

  1. วาดคอนเทนเนอร์ที่ประกอบด้วยแถบแนวตั้งสิบแถบ ( |) ที่ด้านซ้ายและขวาเครื่องหมายขีดคั่นสิบอัน ( -) ที่ด้านล่างและเครื่องหมายบวก ( +) ที่มุมล่างซ้ายและขวาล่าง นี่ทำให้ทั้งหมด 12x11 และ "ข้างใน" 10x10

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. วาดแถบแนวตั้งสองแถบ (การเปิดบอลลูน) ที่กึ่งกลางของแถวบนสุดโดยn/2ขีดเส้นใต้ ( _) ที่ด้านใดด้านหนึ่ง (สำหรับตัวอย่างนี้คือ n5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. วาดหนึ่งเครื่องหมายทับ ( /) และหนึ่งเครื่องหมายทับขวา ( \) ที่ล้อมรอบแถวบนสุดนี้หนึ่งแถวด้านล่าง:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. วาดnแถวของแถบแนวตั้งที่เว้นระยะเท่ากันจากนั้นหนึ่งแถวของแบ็กสแลช (ยังคงมีระยะห่างเหมือนกัน) หนึ่งคู่และสแลช:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "เติม" บอลลูนด้วยน้ำซึ่งมีเครื่องหมายแฮช ( #) เริ่มที่แถวต่ำสุดและทำงานต่อไป หากไม่ได้กรอกแถวทั้งหมดคุณสามารถวางเครื่องหมายแฮชได้ทุกที่ที่คุณต้องการ (ในตัวอย่างด้านล่างพวกเขาจะถูกวางแบบสุ่ม แต่คุณสามารถใส่พวกเขาพูดทั้งหมดทางด้านซ้ายถ้าคุณต้องการ)

    |  __||__  |
    | / #   #\ |
    | |######| |
    | |######| |
    | |######| |
    | |######| |
    | |######| |
    | \######/ |
    |          |
    |          |
    +----------+
    

สูงสุดnคือ 7 และต่ำสุดคือ 0

อินพุต

อินพุตจะเป็นจำนวนเต็มiซึ่งเป็นจำนวนของเครื่องหมายแฮช (น้ำ) ที่ต้องวาด

จะไม่น้อยกว่า 2 หรือมากกว่า 100

เอาท์พุต

ผลลัพธ์ควรเป็นบอลลูนขนาดnที่มีiเครื่องหมายแฮช (หน่วยของน้ำ) ซึ่งnเป็นขนาดที่ต่ำที่สุดที่สามารถถือiหน่วยของน้ำได้ เนื่องจากiจะเป็น 2 หรือมากกว่าnเสมอจะเป็น 0 หรือมากกว่า

ขนาดที่เป็นไปได้สูงสุดที่บอลลูนสามารถวาดได้คือn= 7 หากบอลลูนขนาด 7 ไม่สามารถพอดีกับปริมาณน้ำที่ระบุบอลลูนจะปรากฏ:

|          |
|          |
|##  #  ###|
|##########|
|##########|
|##########|
|##########|
|##########|
|##########|
|##########|
+----------+

(ด้านบนควรเป็นเอาต์พุตสำหรับอินพุตi= 76 เช่นเดียวกับบอลลูนที่ไม่ได้แยกออกอาจมีการจัดน้ำหกหน่วยบนแถวด้านบนตามที่คุณต้องการ)

กรณีทดสอบ

เหตุใดจึงมีกรณีทดสอบหนึ่งข้อเมื่อคุณมีทั้งหมดได้

นี่คือภาพเคลื่อนไหว GIF ของอินพุตทั้งหมดiตั้งแต่ 2 ถึง 100:

ภาพเคลื่อนไหวของฉันทั้งหมดจาก 2 ถึง 100

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ


คำตอบ:


2

อ็อกเทฟ 523 ไบต์

23 ของไบต์เหล่านั้นใช้สำหรับกรณี n = 100 บางทีใครบางคนสามารถแนะนำวิธีที่มีประสิทธิภาพมากขึ้น ...

n=input(0);x=zeros(11,6)+32;x(:,1)=124;x(11,:)=45;x(11,1)=43;
if n<5
w=3;h=2;a=2;
elseif n<7
w=3;h=3;a=2;
elseif n<17
w=4;h=4;a=4;
elseif n<37
w=5;h=6;a=6;
else
w=6;h=9;a=8;
end
if n<73
x(1,6)=124;x(1,9-w:5)=95;x(2,8-w)=47;x(3:1+h,8-w)=124;x(1+h,8-w)=92;x(2:1+h,9-w:6)=35;x=[x,fliplr(x)];x(2,5+w)=92;x(1+h,5+w)=47;x(2:1+floor((a*h-n)/a),9-w:4+w)=32;x(2+floor((a*h-n)/a),9-w+a-mod(a-n,a):4+w)=32;
else
x=[x,fliplr(x)];x(max(1,ceil((100-n)/10)):10,2:11)=35; if (n<100) x(ceil((100-n)/10),(2+mod(n,10)):11)=32; end
end
char(x)

ทดสอบ

อินพุต: 21

เอาท์พุท:

| __ || __ |
| / \ |
| | | |
| | ### | |
| | ###### | |
| | ###### | |
| \ ###### / |
| |
| |
| |
+ + ----------

2

Python 2, 591 ไบต์

เอาฉันสักครู่และมันอาจจะเป็นกอล์ฟมากกว่านี้

หวังว่าจะไม่มีข้อผิดพลาดที่สำคัญ

r=[list(x)for x in ("|          |!"*10+"+----------+").split('!')]
s,t=[0]*4+[1]*2+[2]*10+[3]*4+[4]*16+[5]*6+[6]*22+[7]*8+[8]*29,[(4,2,2),(4,3,2),(3,4,4),(3,5,4),(2,6,6),(2,7,6),(1,8,8),(1,9,8),(0,9,10)]
a,b,c,d,e='|','/','\\','_','#'
def p(x,y,w):r[y][x]=w
def q(l):
 h,j,u=l
 p(5,0,a);p(6,0,a)
 for o in range(4-h):p(h+o+1,0,d);p(h+u-o,0,d)
 p(h,1,b);p(h+u+1,1,c)
 for o in range(j-2):p(h,o+2,a);p(h+u+1,o+2,a)
 p(h,j,c);p(h+u+1,j,b)
def w(i,l):
 h,j,u=l
 for o in range(i):x,y=o%u,o/u;p(h+x+1,j-y,e)
def f(i):
 n=s[i]
 l=t[n]
 if n<8:q(l)
 w(i,l)
 print "\n".join(["".join(x)for x in r])

ตัวอย่างการเรียกใช้:

f(34)

ให้:

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