91 Бутылка ASCII-пива на Стене


17

Дано единственное целое число, xгде 0 <= x <= 91выведите стопку бутылок пива с таким количеством бутылок (и полок). Для простоты я покажу только первые 6 бутылок и то, что будет для каждого из первых входов.

Вот стопка бутылок, каждое число - бутылка, которую вы должны удалить для этого ввода (1-индексированный):

https://pastebin.com/wSpZRMV6


Обратите внимание, что мы используем 91 вместо 99, потому что 99 приведет к нестабильной пачке бутылок.


пример

При отсутствии 0 бутылок ( x=0):

             |=|            
             | |            
             | |            
            /   \           
           .     .          
           |-----|          
           |     |          
           |-----|          
           |_____|          
        =============       
         |=|     |=|        
         | |     | |        
         | |     | |        
        /   \   /   \       
       .     . .     .      
       |-----| |-----|      
       |     | |     |      
       |-----| |-----|      
       |_____| |_____|      
    =====================    
     |=|     |=|     |=|     
     | |     | |     | |     
     | |     | |     | |     
    /   \   /   \   /   \    
   .     . .     . .     .   
   |-----| |-----| |-----|   
   |     | |     | |     |   
   |-----| |-----| |-----|   
   |_____| |_____| |_____|   
=============================
 [THERE ARE MORE UNDER THIS]

Полный вывод 0 смотрите здесь: https://pastebin.com/ZuXkuH6s


При 1отсутствии бутылки ( x=1):

         |=|     |=|        
         | |     | |        
         | |     | |        
        /   \   /   \       
       .     . .     .      
       |-----| |-----|      
       |     | |     |      
       |-----| |-----|      
       |_____| |_____|      
    =====================    
     |=|     |=|     |=|     
     | |     | |     | |     
     | |     | |     | |     
    /   \   /   \   /   \    
   .     . .     . .     .   
   |-----| |-----| |-----|   
   |     | |     | |     |   
   |-----| |-----| |-----|   
   |_____| |_____| |_____|   
=============================
 [THERE ARE MORE UNDER THIS]

Еще раз, это первые две строки отсюда: https://pastebin.com/ZuXkuH6s (с удалением 1) ...


При отсутствии 2 бутылок:

                 |=|        
                 | |        
                 | |        
                /   \       
               .     .      
               |-----|      
               |     |      
               |-----|      
               |_____|      
    =====================    
     |=|     |=|     |=|     
     | |     | |     | |     
     | |     | |     | |     
    /   \   /   \   /   \    
   .     . .     . .     .   
   |-----| |-----| |-----|   
   |     | |     | |     |   
   |-----| |-----| |-----|   
   |_____| |_____| |_____|   
=============================
 [THERE ARE MORE UNDER THIS]

[ДОПОЛНИТЕЛЬНЫЕ ВХОДЫ УДАЛЕНЫ]


При отсутствии 91 бутылки ( n = 91):

:(

Вы должны вывести несчастное лицо, потому что у вас нет пива.


правила

  • Бутылки должны быть удалены слева направо.
  • Полки убираются, когда на полках не остается пива.
  • Для ввода 0 вы выводите 91 бутылку, сложенную в треугольник.
    • В нижнем ряду 13 бутылок, в верхнем - 1.
  • 1 место между каждой бутылкой на каждой полке.
  • Полки должны быть введены между каждым рядом бутылок.
    • Полки могут использовать =, -или #как символ.
    • Полки должны быть на 3 шире (с каждой стороны), чем бутылки, которые они держат.
  • Это , выигрывает наименьшее количество байт.

Не могли бы вы предоставить, скажем, пастинную пробу хотя бы одного из целых тестовых случаев?
Конор О'Брайен

Нужны ли пробелы после последней бутылки на полке?
Джонатан Фрех

Требуются предшествующие пробелы, так как вы удаляете их слева направо, пробелы справа от ASCII-art остаются за вами.
Волшебная Урна Осьминога

@ ConorO'Брайен, видя, что вы не указали, какой тестовый пример, я хотел бы положить несчастное лицо в пастинку; P.
Волшебная Осьминог Урна

1
О, я думал, что вы выбрали 91, чтобы предотвратить любые встроенные функции. o0
полностью человек

Ответы:


15

Древесный уголь , 99 91 байт

A⁻⁹¹NθA¹³η:(Wθ«A⌊⟦θη⟧ζA⁻θζθA⁻η¹ηFζ«↑⁴↖.\↑²←|=↓³←↙¹↓.P⁶↓²P⁶↓¹P______←| »¿θ«M⁹↑M³→×=⁻×⁸ζ³↑M⁴←

Попробуйте онлайн! Ссылка на подробную версию кода. На самом деле реальная версия составляет всего 83 70 байт:

F¹⁵Fι⊞υκ:(F⁻⁹¹N«F¬⊟υ«M³±⁹×=⁺⁵×⁸⊟υ↑M⁴←»↑⁴↖.\↑²←|=↓³←↙¹↓.P⁶↓²P⁶↓¹P×_⁶←|←

Объяснение:

F¹⁵Fι⊞υκ

Заполните массив, предоставляя информацию о том, куда идут полки и как долго они находятся.

:(

Напечатайте несчастное лицо, хотя это будет немедленно перезаписано первой бутылкой пива (если есть).

F⁻⁹¹N«

Переберите оставшиеся бутылки пива.

   F¬⊟υ«

Проверьте, нужно ли рисовать полку.

        M³±⁹×=⁺⁵×⁸⊟υ↑M⁴←»

Напечатайте полку и поместите ее в готовое положение, чтобы нарисовать следующую бутылку над ней.

   ↑⁴↖.\↑²←|=↓³←↙¹↓.P⁶↓²P⁶↓¹P×_⁶←|←

Нарисуйте бутылку и подготовьте позицию, чтобы нарисовать другую бутылку.


6
Да. Жаль, что это не около 99 бутылок пива. Должен получить 8 байтов вниз :): P
HyperNeutrino

1
@EriktheOutgolfer Вот почему я предложил сыграть в гольф 8 байт: P И да, он фактически сделал гольф 8 байтов: D
HyperNeutrino

2
@HyperNeutrino Не совсем; Я играл в гольф 11, а затем разгул 3 ...
Нил

1
@KevinCruijssen Обычно вы увеличиваете, используя forцикл. Это whileцикл, поэтому я должен сделать что-то еще вручную.
Нил

1
@KevinCruijssen Хотя, думая об этом, forцикл был путь для продолжения ... 13 байтов сохранено! (Ну, мне немного повезло с легкостью
Нил

10

Python 3 , 306 299 265 253 255 252 247 244 байта

Быстрая попытка, может быть оптимизирована

Редактировать: -2 байта благодаря @MrXcoder

Редактировать: -32 байта, поскольку конечные пробелы не нужны

Изменить: -12 байтов путем объединения двух функций

Редактировать: -5 байт благодаря @ musicman523

Изменить: +7 байт, чтобы удалить полку после последнего ряда

Изменить: -3 байта

Изменить: -5 байт из-за того, что лямбда-функция используется только один раз на карте

Редактировать: -3 байта с помощью строковой функцииcenter

def l(y,x=13,z=" "):b=min(x,91-y);A,D="  |%s|  ","|-----|";print(y<91and(l(y+x,x-1)or"".join(map(lambda t:((t+z)*b)[:-1].center(103)+"\n",(A%"=",A%z,A%z," /   \ ",".     .",D,"|     |",D,"|_____|")))+z*(49-4*x)+"="*(x*8+5)*(x<13))or(x>12)*":(")

Попробуйте онлайн!


@ Mr.Xcoder, который не будет работать для х = 2, х = 4, х = 5, х = 7, ...
Халвард Хаммел

О, ты прав. Сожалею!
г-н Xcoder


2
248 байт , удалив Eпеременную
musicman523

5

JavaScript (ES6), 251 256 байт

Изменить: Сохранено 2 байта благодаря @dzaima .
Изменить: Добавлено 7 байт, чтобы исправить проблему с параметром.:(

c=>(f=(c,w=13)=>c>0&&f(c-w,w-1)+(c=c<w?c:w,r=(n,s=' ')=>s.repeat(n),a='\n'+r(52-w*4),'  |=|  0  | |  0  | |  0 /   \\ 0.     .0|-----|0|     |0|-----|0|_____|'.split(0).map(x=>a+r((w-c)*8+2)+r(c,' '+x)).join('')+a+r(w*8+5,'#')),(c=91-c)?f(c).slice(6):':(')

Вот (в основном) версия без гольфа:

function (consumed) {
  let remaining = 91 - consumed;

  function inner (count, width = 13) {
    if (count <= 0) return false;

    function repeat (count, string = ' ') {
      return string.repeat(count);
    }

    const pattern = [
      '  |=|  ',
      '  | |  ',
      '  | |  ',
      ' /   \\ ',
      '.     .',
      '|-----|',
      '|     |',
      '|-----|',
      '|_____|' ];

    let clamped = Math.min(count, width);
    let alignment = '\n' + repeat((13 - width) * 4);
    let empty = alignment + repeat((width - clamped) * 8 + 2);
    let shelf = alignment + repeat((width * 8) + 5, '#');
    let bottles = pattern.map(row => empty + repeat(clamped, ' ' + row));

    return inner(count - width, width - 1) + bottles.join('') + shelf;
  }

  return (remaining) ? inner(remaining).slice(6) : ':(';
}

Тестовый код


Очень впечатляющий, отличный ответ. Мне нравится твой r"макрос"; Я чувствовал, что мог бы быть более короткий метод, но ничто из того, что я пробовал, не сломало его.
ETHproductions

2

C (gcc) , 360 358 байт

#define P printf(
r,i,j;char*b[]={"  |=|  ","  | |  ","  | |  "," /   \\ ",".     .","|-----|","|     |","|-----|","|_____|"};w(n){P"%*c",n,' ');}main(n,a)char**a;{(n=-atoi(a[1]))<-90?P":(\n"):({while(++r<14)if((n+=r)>0){for(j=0;j<9;++j){w(4*(13-r)+1);for(i=r;i>0;)--i<n?P b[j]),w(1):w(8);P"\n");}if(r<13){w(4*(13-r)-2);for(i=0;++i<8*r+6;)P"=");P"\n");}}});}

Попробуйте онлайн!

Объяснение:

#define P printf(
r,i,j;
char*b[]={
    "  |=|  ",
    "  | |  ",
    "  | |  ",
    " /   \\ ",
    ".     .",
    "|-----|",
    "|     |",
    "|-----|",
    "|_____|"};

// function to print `n` spaces:
w(n){P"%*c",n,' ');}

main(n,a)char**a;
{
    // no beer left?
    (n=-atoi(a[1]))<-90

        // sad face
        ?P":(\n")

        // else create stack
        // using GCC extension "expression statement" `({ <statement> })` here,
        // shorter than if-else or a function call
        :({
            // loop over 13 rows
            while(++r<14)

                // found non-empty row?
                if((n+=r)>0)
                {
                    // loop over text lines of beer bottles
                    for(j=0;j<9;++j)
                    {
                        w(4*(13-r)+1);

                        // for each bottle
                        for(i=r;i>0;)

                            // print either 8 spaces or line of the bottle
                            --i<n?P b[j]),w(1):w(8);P"\n");
                    }

                    // except for last row, ...
                    if(r<13)
                    {
                        // ... print shelf
                        w(4*(13-r)-2);
                        for(i=0;++i<8*r+6;)
                            P"=");
                        P"\n");
                    }
                }
        });
}

0

Python 2, 436 байт

Хлоп !!

Мой метод слишком многословен, но в любом случае: он по существу «рисует» каждый ряд бутылок, добавляет пробелы, а затем «стирает» все необходимое, печатая все, что осталось.

B=['  |=|   ','  | |   ','  | |   ',' /   \\  ','.     . ','|-----| ','|     | ','|-----| ','|_____| ']
N=lambda r:sum(n for n in range(1,r+1))
n=input()
R=0
while N(R)<n:R+=1
L=R-n+N(R-1)
e=range(1,R)+([R],[])[L!=0]
for r in range(1,14):
    if r in e:continue
    if(r-1 in e)<1:print('',' '*(1+(13-r)*4)+'='*(r*8-3))[r!=1]
    i=(0,R-L)[r==R];w=(8*i+(13-r)*4,0)[i==0];print'\n'.join([' '*w+((13-r)*4*' '+l*r)[w:]for l in B])
if n=91:print':('

Халвард Хаммел намного лучше.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.