Füllen Sie einen Wasserballon


15

In dieser Herausforderung müssen Sie die ASCII-Grafik eines Wasserballons anzeigen, wenn die Wassermenge, mit der der Ballon gefüllt ist, gegeben ist:

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

Wie zeichnet man den Ballon

nFühren Sie die folgenden Schritte aus, um eine Sprechblase mit einer bestimmten Größe anzuzeigen (Hinweis: Wenn das Teilungssymbol ( /) verwendet wird, steht es für eine ganzzahlige Division, die abgerundet wird):

  1. Zeichnen Sie einen Container, der aus zehn vertikalen Balken ( |) links und rechts, zehn Strichen ( -) unten und einem Pluszeichen ( +) unten links und unten rechts besteht. Dies macht das Ganze 12x11 und das "Innere" 10x10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Zeichnen Sie zwei vertikale Balken (die Öffnung des Ballons) in der Mitte der oberen Reihe, mit n/2Unterstrichen ( _) auf beiden Seiten (in diesem Beispiel n5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Zeichnen Sie einen Schrägstrich ( /) und einen umgekehrten Schrägstrich ( \) um diese obere Reihe, eine Reihe darunter:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Zeichnen Sie nReihen von vertikalen Balken mit gleichem Abstand und dann eine Reihe eines Paares von (immer noch gleichem Abstand) Backslash und Slash:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. Füllen Sie den Ballon mit Wasser, dargestellt durch ein Rautezeichen ( #). Beginnen Sie in der untersten Reihe und arbeiten Sie nach oben. Wenn eine Zeile nicht vollständig gefüllt ist, können Sie die Hash-Markierungen beliebig platzieren (im folgenden Beispiel werden sie zufällig platziert, Sie können sie jedoch beispielsweise alle auf der linken Seite platzieren, wenn Sie möchten).

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

Das Maximum nist 7 und das Minimum ist 0.

Eingang

Die Eingabe ist eine Ganzzahl i, dh die Anzahl der zu zeichnenden Hashmarken (Wasser).

Es wird niemals weniger als 2 oder mehr als 100 sein.

Ausgabe

Die Ausgabe sollte eine Sprechblase nmit iRautezeichen (Wassereinheiten) sein. Dabei nhandelt es sich um die kleinstmögliche Größe, die iWassereinheiten aufnehmen kann. Da iwird immer 2 oder größer sein, nwird immer 0 oder größer sein.

Die maximal mögliche Größe, mit der ein Ballon gezeichnet werden kann, ist n= 7. Wenn ein Ballon der Größe 7 nicht in die angegebene Wassermenge passt, springt der Ballon:

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

(Das obige sollte die Ausgabe für die Eingabe sein i= 76. Genau wie der nicht platzende Ballon können die sechs zusätzlichen Wassereinheiten in der oberen Reihe nach Belieben angeordnet werden.)

Testfälle

Warum einen Testfall haben, wenn Sie alle haben können?

Hier ist ein animiertes GIF aller Eingaben ivon 2 bis 100:

Animation von 2 bis 100

Wertung

Das ist , also gewinnt der kürzeste Code in Bytes.


Antworten:


2

Oktave, 523 Bytes

23 dieser Bytes gelten nur für den Fall n = 100. Vielleicht kann jemand einen effizienteren Weg vorschlagen ...

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)

Prüfung

Eingabe: 21

Ausgabe:

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

2

Python 2, 591 Bytes

Hat einige Zeit gedauert und es könnte wahrscheinlich viel mehr Golf gespielt werden.

Hoffe, es gibt keine größeren Fehler.

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

Beispiellauf:

f(34)

gibt:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.