Наповніть водну кулю


15

У цьому виклику ви повинні показати ASCII мистецтво на водній кулі, враховуючи кількість води, якою наповнюється повітряна куля:

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

Як намалювати повітряну кулю

Щоб відобразити повітряну кулю розміром n, виконайте наступні кроки (зверніть увагу: коли використовується символ поділу ( /), він являє собою ціле ділення, округлення вниз):

  1. Намалюйте контейнер, що складається з десяти вертикальних смуг ( |) зліва та справа, десяти тире ( -) внизу та знака плюс ( +) у нижньому лівому та нижньому правому куті. Це робить всю справу 12x11, а «всередині» 10x10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Намалюйте два вертикальних бруска (отвір повітряної кулі) по центру посередині верхнього ряду з n/2підкресленнями ( _) з обох боків (для цього прикладу nбуде 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Намалюйте одну косу косу рису ( /) та одну зворотну косу рису ( \), яка оточує цей верхній ряд, один рядок внизу:

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. Намалюйте nрядки з однаково розташованими вертикальними смугами, а потім один ряд пари (ще однаково розташованих) нахилу та косу рису:

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. "Наповніть" повітряну кулю водою, представленою хеш-знаком ( #). Почніть з найнижчого ряду і працюйте вгору. Якщо рядок заповнено не повністю, ви можете розмістити хеш-позначки куди завгодно (у наведеному нижче прикладі вони розміщуються випадковим чином, але ви можете поставити їх, скажімо, на лівій стороні, якщо хочете).

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

Максимум n- 7, а мінімальний - 0.

Вхідні дані

Вхід буде цілим числом i- це кількість хеш-знаків (води), яку необхідно намалювати.

Він ніколи не буде менше 2 або більше 100.

Вихідні дані

На виході має бути повітряна куля розміром, яка nмістить iхеш-позначки (одиниці води), де nє найменший розмір, який може вмістити iодиниці води. Оскільки iзавжди буде 2 або більше, nзавжди буде 0 або більше.

Максимально можливий розмір повітряної кулі може становити n= 7. Якщо повітряна куля розміром 7 не може відповідати вказаній кількості води, повітряна куля спливає:

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

(Вищенаведене має бути результатом для введення i= 76. Так само, як і незамкнутий повітряний куля, шість додаткових одиниць води у верхньому ряду можуть бути влаштовані, як не завгодно.)

Тестові справи

Навіщо мати один тестовий випадок, коли ви можете мати їх усі ?

Ось анімований GIF усіх входів iвід 2 до 100:

анімація всіх я від 2 до 100

Оцінка балів

Це , тому виграє найкоротший код у байтах.


Відповіді:


2

Октава, 523 байти

23 з цих байтів - лише для n = 100 випадку. Можливо, хтось може запропонувати більш ефективний спосіб ...

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)

Тест

Вхід: 21

Вихід:

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

2

Python 2, 591 байт

Взяв мене деякий час, і, певно, можна було б набагато більше пограти в гольф.

Сподіваємось, що великих помилок немає.

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

Приклад виконання:

f(34)

дає:

|  __||__  |
| /####  \ |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
|          |
+----------+
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.