Đổ đầy bóng nước


15

Trong thử thách này, bạn phải hiển thị nghệ thuật ASCII của một quả bóng nước với lượng nước mà quả bóng chứa đầy:

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

Làm thế nào để vẽ bóng bay

Để hiển thị một quả bóng có kích thước n, hãy làm theo các bước sau (lưu ý: bất cứ khi nào biểu tượng chia ( /) được sử dụng, nó đại diện cho phép chia số nguyên, làm tròn xuống):

  1. Vẽ một thùng chứa gồm mười thanh dọc ( |) ở bên trái và bên phải, mười dấu gạch ngang ( -) ở dưới cùng và dấu cộng ( +) ở góc dưới bên trái và dưới cùng bên phải. Điều này làm cho toàn bộ điều 12x11, và "bên trong" 10 x 10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Vẽ hai thanh dọc (lỗ mở của quả bóng) ở giữa hàng trên cùng, với n/2dấu gạch dưới ( _) ở hai bên (ví dụ này, nsẽ là 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Vẽ một dấu gạch chéo ( /) và một dấu gạch chéo ngược ( \) xung quanh hàng trên cùng này, một hàng bên dưới:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Vẽ ncác hàng của các thanh dọc có khoảng cách giống hệt nhau, và sau đó một hàng của một dấu gạch chéo ngược (vẫn cách đều nhau) và dấu gạch chéo:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "Đổ đầy" quả bóng bằng nước, được biểu thị bằng dấu băm ( #). Bắt đầu ở hàng thấp nhất, và làm việc lên trên. Nếu một hàng không được điền đầy đủ, bạn có thể đặt dấu băm bất cứ nơi nào bạn muốn (trong ví dụ dưới đây, chúng được đặt ngẫu nhiên, nhưng bạn có thể đặt chúng, giả sử, tất cả ở phía bên trái nếu bạn muốn).

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

Giá trị lớn nhất n là 7 và tối thiểu là 0.

Đầu vào

Đầu vào sẽ là một số nguyên i , là số lượng dấu băm (nước) phải được rút ra.

Nó sẽ không bao giờ nhỏ hơn 2, hoặc lớn hơn 100.

Đầu ra

Đầu ra phải là một quả bóng có kích thước nchứa idấu băm (đơn vị nước), trong đó nkích thước thấp nhất có thể có thể chứa icác đơn vị nước. Từi sẽ luôn là 2 hoặc lớn hơn, nsẽ luôn là 0 hoặc lớn hơn.

Kích thước tối đa có thể mà một quả bóng bay có thể được rút ra là n= 7. Nếu một quả bóng cỡ 7 không thể vừa với lượng nước được chỉ định, quả bóng sẽ bật ra:

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

(Trên đây phải là đầu ra cho đầu vào i = 76. Giống như quả bóng chưa được bật, sáu đơn vị nước bổ sung ở hàng trên cùng có thể được sắp xếp theo ý bạn.)

Các trường hợp thử nghiệm

Tại sao có một trường hợp thử nghiệm, khi bạn có thể có tất cả chúng?

Đây là một GIF hoạt hình của tất cả các đầu vào itừ 2 đến 100:

hoạt hình của tất cả tôi từ 2 đến 100

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


Câu trả lời:


2

Octave, 523 byte

23 trong số các byte đó chỉ dành cho trường hợp n = 100. Có lẽ ai đó có thể đề xuất một cách hiệu quả hơn ...

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)

Kiểm tra

Đầu vào: 21

Đầu ra:

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

2

Python 2, 591 byte

Mất một thời gian và nó có thể được chơi gôn nhiều hơn nữa.

Hy vọng không có bất kỳ lỗi lớn.

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])

Chạy ví dụ:

f(34)

cho:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.