Napełnij balon wodny

15

W tym wyzwaniu musisz wyświetlić grafikę ASCII balonu z wodą, biorąc pod uwagę ilość wody, którą wypełnia balon:

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

Jak narysować balon

Aby wyświetlić balon wielkości n, wykonaj następujące kroki (uwaga: za każdym razem, gdy /używany jest symbol podziału ( ), reprezentuje on dzielenie liczb całkowitych, zaokrąglając w dół):

  1. Narysuj pojemnik składający się z dziesięciu pionowych pasków ( |) po lewej i prawej stronie, dziesięciu myślników ( -) na dole i znaku plus ( +) w lewym dolnym i prawym dolnym rogu. To sprawia, że ​​całość ma wymiary 12 x 11, a „wewnątrz” 10 x 10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Narysuj dwa pionowe słupki (otwór balonu) wyśrodkowane na środku górnego rzędu, z n/2podkreślnikami ( _) po obu stronach (w tym przykładzie nbędzie to 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Narysuj jeden ukośnik ( /) i jeden ukośnik odwrotny ( \) otaczający ten górny wiersz, jeden wiersz poniżej:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Narysuj nrzędy identycznie rozmieszczonych pionowych pasków, a następnie jeden rząd pary (wciąż identycznie rozmieszczonych) ukośników i ukośników:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. „Wypełnij” balon wodą reprezentowaną przez znak krzyżyka ( #). Zacznij od najniższego rzędu i pracuj w górę. Jeśli wiersz nie jest całkowicie wypełniony, możesz umieścić znaki skrótu w dowolnym miejscu (w poniższym przykładzie są one rozmieszczane losowo, ale możesz je umieścić, powiedzmy, po lewej stronie, jeśli chcesz).

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

Maksymalny nto 7, a minimalny to 0.

Wejście

Dane wejściowe będą liczbami całkowitymi i, czyli ilością znaków skrótu (wody), które należy narysować.

Nigdy nie będzie mniejsza niż 2 lub większa niż 100.

Wynik

Wyjście powinno być balonem wielkości nzawierającym iznaki skrótu (jednostki wody), gdzie njest to najniższy możliwy rozmiar, który może pomieścić ijednostki wody. Ponieważ izawsze będzie wynosić 2 lub więcej, nzawsze będzie wynosić 0 lub więcej.

Maksymalny możliwy rozmiar, na którym można narysować balon, wynosi n= 7. Jeśli balon o rozmiarze 7 nie zmieści się w określonej ilości wody, balon wyskoczy:

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

(Powyższe powinno być wyjściem dla danych wejściowych i= 76. Podobnie jak nieopakowany balon, sześć dodatkowych jednostek wody w górnym rzędzie może być ułożonych w dowolny sposób.)

Przypadki testowe

Po co mieć jeden przypadek testowy, skoro można je wszystkie mieć ?

Oto animowany GIF wszystkich danych wejściowych iod 2 do 100:

animacja wszystkich i od 2 do 100

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach.

Klamka
źródło
Związane z.
Martin Ender,

Odpowiedzi:

2

Oktawa, 523 bajty

23 z tych bajtów dotyczy tylko przypadku n = 100. Może ktoś może zaproponować bardziej wydajny sposób ...

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

Wejście: 21

Wynik:

| __ || __ |
| / \ |
| | | |
| | ### | |
| | ###### | |
| | ###### | |
| \ ###### / |
| |
| |
| |
+ ---------- +
sudo rm -rf slash
źródło
2

Python 2, 591 bajtów

Zajęło mi to trochę czasu i prawdopodobnie można by grać w golfa znacznie więcej.

Mam nadzieję, że nie ma żadnych poważniejszych błędów.

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

Przykładowy przebieg:

f(34)

daje:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
heo
źródło