Remplissez un ballon d'eau

15

Dans ce défi, vous devez afficher l'art ASCII d'un ballon à eau compte tenu de la quantité d'eau remplie par le ballon:

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

Comment dessiner le ballon

Pour afficher une bulle de taille n, procédez comme suit (remarque: chaque fois que le symbole de division ( /) est utilisé, il représente une division entière, arrondi vers le bas):

  1. Dessinez un conteneur composé de dix barres verticales ( |) à gauche et à droite, de dix tirets ( -) en bas et d'un signe plus ( +) dans les coins inférieur gauche et inférieur droit. Cela rend le tout 12x11 et le 10x10 "intérieur".

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Dessinez deux barres verticales (l'ouverture du ballon) centrées au milieu de la rangée supérieure, avec des n/2traits de soulignement ( _) de chaque côté (pour cet exemple, nsera 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Dessinez une barre oblique ( /) et une barre oblique inversée ( \) entourant cette rangée du haut, une rangée en dessous:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Dessinez des nrangées de barres verticales espacées de façon identique, puis une rangée d'une paire de barres obliques inverses (toujours espacées de manière identique):

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "Remplissez" le ballon d'eau, représenté par un signe de hachage ( #). Commencez par la rangée la plus basse et montez. Si une ligne n'est pas entièrement remplie, vous pouvez placer les marques de hachage où vous le souhaitez (dans l'exemple ci-dessous, elles sont placées au hasard, mais vous pouvez les placer, disons, toutes sur le côté gauche si vous le souhaitez).

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

Le maximum nest 7 et le minimum est 0.

Contribution

L'entrée sera un entier i, qui est la quantité de marques de hachage (eau) qui doit être dessinée.

Il ne sera jamais inférieur à 2, ni supérieur à 100.

Production

La sortie doit être un ballon de taille ncontenant ides marques de hachage (unités d'eau), où nest la plus petite taille possible pouvant contenir des iunités d'eau. Puisque isera toujours 2 ou plus, nsera toujours 0 ou plus.

La taille maximale possible à laquelle un ballon peut être dessiné est n= 7. Si un ballon de taille 7 ne peut pas contenir la quantité d'eau spécifiée, le ballon apparaît:

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

(Ce qui précède devrait être la sortie pour input i= 76. Tout comme le ballon non sauté, les six unités d'eau supplémentaires sur la rangée supérieure peuvent être disposées à votre guise.)

Cas de test

Pourquoi avoir un cas de test, alors que vous pouvez tous les avoir?

Voici un GIF animé de toutes les entrées ide 2 à 100:

animation de tout i de 2 à 100

Notation

Il s'agit de , donc le code le plus court en octets l'emporte.

Poignée de porte
la source
En relation.
Martin Ender

Réponses:

2

Octave, 523 octets

23 de ces octets sont juste pour le cas n = 100. Peut-être que quelqu'un peut suggérer un moyen plus efficace ...

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)

Tester

Entrée: 21

Production:

| __ || __ |
| / \ |
| | | |
| | ### | |
| | ###### | |
| | ###### | |
| \ ###### / |
| |
| |
| |
+ ---------- +
sudo rm -rf slash
la source
2

Python 2, 591 octets

Cela m'a pris un peu de temps et cela pourrait probablement être joué beaucoup plus.

J'espère qu'il n'y a pas d'erreurs majeures.

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

Exemple d'exécution:

f(34)

donne:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
heo
la source