Isi balon air

15

Dalam tantangan ini, Anda harus menampilkan seni ASCII balon air mengingat jumlah air yang diisi balon:

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

Cara menggambar balon

Untuk menampilkan ukuran balon n, ikuti langkah-langkah berikut (catatan: setiap kali simbol pembagian ( /) digunakan, itu mewakili pembagian bilangan bulat, pembulatan ke bawah):

  1. Gambar wadah yang terdiri dari sepuluh batang vertikal ( |) di kiri dan kanan, sepuluh garis ( -) di bagian bawah, dan tanda tambah ( +) di sudut kiri bawah dan kanan bawah. Ini membuat semuanya menjadi 12x11, dan "dalam" 10x10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Gambarlah dua batang vertikal (bukaan balon) yang berpusat di tengah baris atas, dengan n/2garis bawah ( _) di kedua sisi (untuk contoh ini, nakan menjadi 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Gambar satu garis miring ( /) dan garis miring terbalik ( \) di sekitar baris teratas ini, satu baris di bawah ini:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Gambarlah nbaris-baris garis vertikal yang identik secara spasial, dan kemudian satu baris sepasang garis miring terbalik dan garis miring:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "Isi" balon dengan air, yang diwakili oleh tanda pagar ( #). Mulai dari baris paling bawah, dan naikkan ke atas. Jika satu baris tidak sepenuhnya terisi, Anda dapat menempatkan tanda pagar di mana pun Anda inginkan (dalam contoh di bawah, mereka ditempatkan secara acak, tetapi Anda dapat meletakkannya, katakanlah, semua di sisi kiri jika Anda mau).

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

Maksimal n7, dan minimum adalah 0.

Memasukkan

Input akan berupa bilangan bulat i, yang merupakan jumlah tanda pagar (air) yang harus ditarik.

Tidak akan pernah kurang dari 2, atau lebih besar dari 100.

Keluaran

Keluaran harus berupa balon ukuran yang nmengandung itanda pagar (satuan air), di mana nukuran serendah mungkin yang dapat menampung isatuan air. Karena iakan selalu 2 atau lebih besar, nakan selalu menjadi 0 atau lebih besar.

Ukuran maksimum balon yang bisa ditarik adalah n= 7. Jika balon ukuran 7 tidak sesuai dengan jumlah air yang ditentukan, balon muncul:

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

(Yang di atas harus menjadi output untuk input i= 76. Sama seperti balon yang tidak dicopot, enam unit tambahan air di baris atas dapat diatur sesuka Anda.)

Uji kasus

Mengapa memiliki satu test case, ketika Anda dapat memiliki semuanya ?

Berikut adalah GIF animasi dari semua input idari 2 hingga 100:

animasi semua saya dari 2 hingga 100

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang.

Gagang pintu
sumber
Terkait
Martin Ender

Jawaban:

2

Oktaf, 523 byte

23 dari byte tersebut hanya untuk kasus n = 100. Mungkin seseorang dapat menyarankan cara yang lebih efisien ...

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)

Uji

Input: 21

Keluaran:

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

Python 2, 591 byte

Butuh beberapa waktu dan mungkin bisa bermain golf lebih banyak.

Semoga tidak ada kesalahan besar.

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

Contoh dijalankan:

f(34)

memberi:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
heo
sumber