Bir su balonu doldurun


15

Bu meydan okumada, balonun doldurduğu su miktarı göz önüne alındığında, bir su balonu ASCII sanatı göstermelisiniz:

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

Balon nasıl çizilir

Boyutlu bir balon görüntülemek niçin aşağıdaki adımları izleyin (not: bölme sembolü ( /) her kullanıldığında, tamsayı bölünmesini, aşağı yuvarlamayı temsil eder):

  1. |Sol ve sağda on dikey çubuk ( ) -, altta on çizgi ( ) ve +sol alt ve sağ alt köşede artı işaretinden ( ) oluşan bir kap çizin . Bu, her şeyi 12x11 ve "içeride" 10x10 yapar.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Her iki tarafta n/2alt çizgi ( _) nolacak şekilde , üst sıranın ortasına ortalanmış iki dikey çubuk (balonun açılması) çizin (bu örnek için 5 olacaktır):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Bu üst satırı çevreleyen /bir eğik çizgi ( ) ve bir ters eğik çizgi ( ) çizin \, bir satır aşağıda:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. nAynı aralıklı dikey çubuk satırları çizin ve ardından bir çift (yine aynı aralıklı) ters eğik çizgi ve eğik çizgi çizin :

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. Balonu bir karma işareti ( #) ile temsil edilen suyla "doldurun" . En alt satırdan başlayın ve yukarı doğru çalışın. Bir satır tamamen doldurulmamışsa, karma işaretlerini istediğiniz yere yerleştirebilirsiniz (aşağıdaki örnekte rastgele yerleştirilirler, ancak bunları, örneğin, isterseniz sol tarafa koyabilirsiniz).

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

Maksimum nsayı 7, minimum sayı 0'dır.

Giriş

Giriş bir tamsayı olacak i çizilmesi gereken karma işaretlerinin (su) miktarı olan .

Asla 2'den az veya 100'den fazla olmayacaktır.

Çıktı

Çıktı , su işaretlerini tutabilen mümkün olan en düşük boyut olan karma işaretleri (su birimleri) niçeren bir balon olmalıdır . Yana hep 2 veya daha büyük olacak, her zaman 0 veya daha büyük olacaktır.iniin

Bir balonun çizilebileceği maksimum boyut n= 7'dir. 7 numaralı bir balon belirtilen su miktarına uymuyorsa balon patlar:

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

(Yukarıdaki girdi için çıktı olmalıdır i = 76 Tıpkı haşhaş balonunda olduğu gibi, üst sıradaki altı ekstra su birimi, lütfen istediğiniz gibi düzenlenebilir.)

Test senaryoları

Neden hepsine sahip olduğunuzda bir test vakası var? ?

İşte i2'den 100'e kadar tüm girişlerin animasyonlu bir GIF'i :

2'den 100'e kadar tüm i animasyonları

puanlama

Bu , bu nedenle bayttaki en kısa kod kazanır.


Yanıtlar:


2

Oktav, 523 bayt

Bu baytların 23'ü sadece n = 100 durumu içindir. Belki birisi daha verimli bir yol önerebilir ...

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)

Ölçek

Giriş: 21

Çıktı:

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

2

Python 2, 591 bayt

Bana biraz zaman aldı ve muhtemelen çok daha fazla golf olabilir.

Umarım büyük hatalar olmaz.

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

Örnek çalışma:

f(34)

verir:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.