Llenar un globo de agua

15

En este desafío, debe mostrar el arte ASCII de un globo de agua dada la cantidad de agua con la que se llena el globo:

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

Como dibujar el globo

Para mostrar un globo de tamaño n, siga los siguientes pasos (nota: cada vez que /se usa el símbolo de división ( ), representa la división entera, redondeando hacia abajo):

  1. Dibuje un contenedor compuesto por diez barras verticales ( |) a la izquierda y derecha, diez guiones ( -) en la parte inferior y un signo más ( +) en la esquina inferior izquierda e inferior derecha. Esto hace que todo sea 12x11, y el "interior" 10x10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Dibuje dos barras verticales (la apertura del globo) centradas en el centro de la fila superior, con n/2guiones bajos ( _) a cada lado (para este ejemplo, nserá 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Dibuje una barra diagonal ( /) y una barra diagonal inversa ( \) alrededor de esta fila superior, una fila debajo:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Dibuje nfilas de barras verticales con espacios idénticos, y luego una fila de un par de barras invertidas y barras diagonales (aún con espacios idénticos):

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "Rellene" el globo con agua, representado por un signo de hash ( #). Comience en la fila más baja y trabaje hacia arriba. Si una fila no está completamente llena, puede colocar las marcas hash donde lo desee (en el ejemplo a continuación, se colocan al azar, pero podría colocarlas, por ejemplo, todas en el lado izquierdo si lo desea).

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

El máximo nes 7 y el mínimo es 0.

Entrada

La entrada será un número entero i, que es la cantidad de marcas hash (agua) que se deben dibujar.

Nunca será menor que 2 o mayor que 100.

Salida

La salida debe ser un globo de tamaño que ncontenga imarcas hash (unidades de agua), donde nes el tamaño más bajo posible que puede contener iunidades de agua. Como isiempre será 2 o mayor, nsiempre será 0 o mayor.

El tamaño máximo posible en el que se puede dibujar un globo es n= 7. Si un globo de tamaño 7 no puede caber en la cantidad de agua especificada, el globo aparece:

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

(Lo anterior debe ser la salida para input i= 76. Al igual que el globo sin reventar, las seis unidades adicionales de agua en la fila superior se pueden organizar como lo desee).

Casos de prueba

¿Por qué tener un caso de prueba, cuando puede tenerlos todos ?

Aquí hay un GIF animado de todas las entradas ide 2 a 100:

animación de todo i de 2 a 100

Puntuación

Este es el , por lo que gana el código más corto en bytes.

Pomo de la puerta
fuente
Relacionado.
Martin Ender

Respuestas:

2

Octava, 523 bytes

23 de esos bytes son solo para el caso n = 100. Quizás alguien pueda sugerir una forma más 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)

Prueba

Entrada: 21

Salida:

El | __ || __ |
El | / \ |
El | El | El | El |
El | | ### | El |
El | | ###### | El |
El | | ###### | El |
El | \ ###### / |
El | El |
El | El |
El | El |
+ ---------- +
sudo rm -rf slash
fuente
2

Python 2, 591 bytes

Me llevó algo de tiempo y probablemente podría jugar mucho más al golf.

Espero que no haya errores importantes.

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

Ejemplo de ejecución:

f(34)

da:

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