Riempi un pallone d'acqua


15

In questa sfida, è necessario visualizzare l'arte ASCII di un pallone d'acqua data la quantità di acqua con cui è riempito il pallone:

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

Come disegnare il palloncino

Per visualizzare un fumetto di dimensioni n, seguire i passaggi seguenti (nota: ogni volta che il simbolo di divisione (/ viene utilizzato ), rappresenta la divisione di numeri interi, arrotondando per difetto):

  1. Disegna un contenitore composto da dieci barre verticali ( |) a sinistra e a destra, dieci trattini ( -) in basso e un segno più ( +) nell'angolo in basso a sinistra e in basso a destra. Questo rende il tutto 12x11 e il "dentro" 10x10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Disegna due barre verticali (l'apertura del palloncino) centrate nel mezzo della riga superiore, con i n/2trattini bassi ( _) su entrambi i lati (per questo esempio, nsaranno 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Disegna una barra ( /) e una barra rovesciata ( \) attorno a questa riga superiore, una riga di seguito:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Disegna nrighe di barre verticali con spaziatura identica, quindi una riga di una coppia di barre rovesciate (ancora identicamente spaziate) e barra:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "Riempi" il palloncino con acqua, rappresentato da un segno cancelletto ( #). Inizia dalla riga più bassa e procedi verso l'alto. Se una riga non è completamente riempita, puoi posizionare i segni di hash dove vuoi (nell'esempio seguente, sono posizionati in modo casuale, ma puoi metterli, per esempio, tutti sul lato sinistro se vuoi).

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

Il massimo nè 7 e il minimo è 0.

Ingresso

L'input sarà un numero intero i, che è la quantità di hash mark (water) che devono essere disegnati.

Non sarà mai inferiore a 2 o superiore a 100.

Produzione

L'output dovrebbe essere un palloncino di dimensioni ncontenente i isegni di hash (unità di acqua), dove nè la dimensione più bassa possibile che può contenere iunità di acqua. Poiché isarà sempre 2 o maggiore,n sarà sempre 0 o maggiore.

La dimensione massima possibile su cui può essere disegnato un pallone è n= 7. Se un pallone di dimensione 7 non può adattarsi alla quantità di acqua specificata, il pallone si aprirà:

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

(Quanto sopra dovrebbe essere l'output per input i= 76. Proprio come il palloncino non intatto, le sei unità extra di acqua nella riga superiore possono essere disposte comunque per favore.)

Casi test

Perché avere un caso di prova, quando puoi averli tutti ?

Ecco una GIF animata di tutti gli input ida 2 a 100:

animazione di tutti i da 2 a 100

punteggio

Questo è , quindi vince il codice più breve in byte.


Risposte:


2

Ottava, 523 byte

23 di questi byte sono solo per il caso n = 100. Forse qualcuno può suggerire un modo più efficiente ...

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)

Test

Ingresso: 21

Produzione:

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

2

Python 2, 591 byte

Mi ci è voluto un po 'di tempo e probabilmente si potrebbe giocare a golf molto di più.

Spero non ci siano errori importanti.

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

Esempio di esecuzione:

f(34)

dà:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.