Заполнить водяной шар


15

В этом задании вы должны отобразить искусство ASCII водяного шара с учетом количества воды, которым наполнен воздушный шар:

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

Как нарисовать воздушный шар

Чтобы отобразить шарик размера n, выполните следующие действия (примечание: всякий раз, когда используется символ деления ( /), он представляет целочисленное деление, округление в меньшую сторону):

  1. Нарисуйте контейнер, состоящий из десяти вертикальных столбцов ( |) слева и справа, десяти штрихов ( -) внизу и знака плюс ( +) в левом нижнем и правом нижнем углу. Это делает все это 12x11, а "внутри" 10x10.

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. Нарисуйте две вертикальные полосы (отверстие в шарике), центрированные в середине верхнего ряда, с n/2подчеркиваниями ( _) с каждой стороны (для этого примера nбудет 5):

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. Нарисуйте одну косую черту ( /) и одну обратную косую черту ( \) вокруг этой верхней строки, на одну строку ниже:

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

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. «Наполните» баллон водой, представленной знаком хеша ( #). Начните с самого нижнего ряда и двигайтесь вверх. Если строка заполнена не полностью, вы можете размещать хеш-метки в любом месте (в приведенном ниже примере они размещаются случайным образом, но вы можете поместить их, скажем, все слева, если хотите).

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

Максимум n7, а минимум 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.