Encha um balão de água

15

Neste desafio, você deve exibir a arte ASCII de um balão de água, dada a quantidade de água que o balão está cheio:

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

Como desenhar o balão

Para exibir um balão de tamanho n, siga as etapas a seguir (observe: sempre que o símbolo de divisão ( /) for usado, ele representa uma divisão inteira, arredondando para baixo):

  1. Desenhe um recipiente que consiste em dez barras verticais ( |) à esquerda e direita, dez traços ( -) na parte inferior e um sinal de adição ( +) no canto inferior esquerdo e inferior direito. Isso torna a coisa toda 12x11 e o "interior" 10x10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Desenhe duas barras verticais (a abertura do balão) centralizadas no meio da linha superior, com n/2sublinhados ( _) em ambos os lados (neste exemplo, nserá 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Desenhe uma barra ( /) e uma barra invertida ( \) ao redor desta linha superior, uma linha abaixo:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Desenhe nlinhas de barras verticais espaçadas de forma idêntica e, em seguida, uma linha de um par de barra invertida (ainda espaçada de forma idêntica) e barra:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "Encha" o balão com água, representada por um sinal de hash ( #). Comece na linha mais baixa e trabalhe para cima. Se uma linha não estiver totalmente preenchida, você pode colocar as marcas de hash onde quiser (no exemplo abaixo, elas são colocadas aleatoriamente, mas você pode colocá-las, digamos, todas no lado esquerdo, se quiser).

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

O máximo né 7 e o mínimo é 0.

Entrada

A entrada será um número inteiro i, que é a quantidade de marcas de hash (água) que deve ser desenhada.

Nunca será menor que 2 ou maior que 100.

Resultado

A saída deve ser um balão de tamanho ncontendo imarcas de hash (unidades de água), onde né o menor tamanho possível que pode conter iunidades de água. Como isempre será 2 ou maior, nsempre será 0 ou maior.

O tamanho máximo possível em que um balão pode ser desenhado é n= 7. Se um balão do tamanho 7 não puder caber na quantidade de água especificada, o balão será exibido:

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

(A idescrição acima deve ser a saída para entrada = 76. Assim como o balão não estourado, as seis unidades extras de água na linha superior podem ser organizadas da maneira que você preferir.)

Casos de teste

Por que ter um caso de teste, quando você pode ter todos eles?

Aqui está um GIF animado de todas as entradas ide 2 a 100:

animação de todos os i de 2 a 100

Pontuação

Isso é , então o código mais curto em bytes vence.

Maçaneta da porta
fonte
Relacionado.
Martin Ender

Respostas:

2

Oitava, 523 bytes

23 desses bytes são apenas para o caso n = 100. Talvez alguém possa sugerir uma maneira mais eficiente ...

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)

Teste

Entrada: 21

Resultado:

| __ || __ |
| / \ |
| | | |
| | ### | |
| | ###### | |
| | ###### | |
| \ ###### / |
| |
| |
| |
+ ---------- +
barra sudo rm -rf
fonte
2

Python 2, 591 bytes

Levou algum tempo e provavelmente poderia ser jogado muito mais.

Espero que não haja erros graves.

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

Exemplo de execução:

f(34)

dá:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
heo
fonte