装满水气球


15

在此挑战中,您必须显示给水气球所填充的水量的ASCII艺术形式:

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

如何画气球

要显示大小气球n,请按照以下步骤操作(注意:每当使用除法符号(/)时,它将表示整数除法,向下取整):

  1. 绘制一个容器,该容器包含左右十个竖线(|),-底部十个破折号()和+左下角和右下角的加号()。这使整个事情变成12x11,“内部”变成10x10。

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. 绘制两个垂直条(气球的开口),它们居中位于第一行的中间,并在两侧n/2各有一个下划线(_)(对于此示例, n将为5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. 在此顶行(下方一行)周围画一个斜杠(/)和一个反斜杠(\):

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. 绘制一n排等距的竖线,然后绘制一对(仍等距)反斜杠和斜杠的一行:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. 用水“填充”气球,由井号(#)表示。从最低的行开始,然后向上工作。如果一行未完全填充,则可以将井号放置在所需的任何位置(在下面的示例中,井号是随机放置的,但是如果需要,可以将其全部放在左侧)。

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

最大值n为7,最小值为0。

输入值

输入将是一个整数i,它是必须绘制的哈希标记(水)的数量。

它永远不会小于2或大于100。

输出量

输出应该是一个n包含i哈希标记(水的单位)的气球,这里n是可以容纳i水的单位的最小尺寸。由于i将始终为2或更大,因此n将始终为0或更大。

可以绘制气球的最大大小为n=7。如果尺寸7的气球无法容纳指定的水量,则气球弹出:

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

(上面应该是输入i= 76 的输出。就像未弹出的气球一样,也可以根据需要安排第一行的六个额外水位。)

测试用例

当可以全部使用一个测试用例时,为什么要使用呢?

这是i2到100 的所有输入的动画GIF :

我所有的动画从2到100

计分

这是,因此以字节为单位的最短代码获胜。


Answers:


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)

给出:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.