91 Butelek piwa ASCII na ścianie

17

Biorąc pod uwagę jedną liczbę całkowitą, z xktórej 0 <= x <= 91wyprowadzany jest stos butelek piwa z brakiem tylu butelek (i półek). Dla uproszczenia pokażę tylko 6 pierwszych butelek i to, co by to było dla każdego z pierwszych danych wejściowych.

Oto stos butelek, każda liczba to butelka, którą należy usunąć dla tego wkładu (indeksowany 1):

https://pastebin.com/wSpZRMV6


Uwaga: używamy 91 zamiast 99, ponieważ 99 spowodowałoby niestabilny stos butelek.


Przykład

Brak 0 butelek ( x=0):

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

Aby uzyskać pełne wyjście 0, zobacz tutaj: https://pastebin.com/ZuXkuH6s


Z 1butelki brakuje ( x=1):

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

Jeszcze raz pierwsze dwa wiersze stąd: https://pastebin.com/ZuXkuH6s (z 1 usuniętym) ...


Brak 2 butelek:

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

[DODATKOWE WEJŚCIA USUNIĘTE]


Brak 91 butelek ( n = 91):

:(

Musisz wyrazić nieszczęśliwą twarz, bo zabrakło Ci piwa.


Zasady

  • Butelki należy wyjmować od lewej do prawej.
  • Półki są wyjmowane, gdy na półkach nie pozostaje piwo.
  • Dla wartości 0 wyprowadzasz 91 butelek ułożonych w trójkąt.
    • Dolny rząd ma 13 butelek, górny ma 1.
  • 1 miejsce między każdą butelką na każdej półce.
  • Półki należy wprowadzać między każdym rzędem butelek.
    • Półki mogą być używane =, -lub #jako postać.
    • Półki muszą być 3 szersze (z każdej strony) niż butelki, które trzymają.
  • To jest , wygrana o najniższej liczbie bajtów.
Urna Magicznej Ośmiornicy
źródło
Czy możesz podać, powiedzmy, pastebin przynajmniej jednego z całych przypadków testowych?
Conor O'Brien,
Czy wymagane są spacje po ostatniej butelce półki?
Jonathan Frech,
Wymagane są wcześniejsze spacje, ponieważ usuwasz je od lewej do prawej, spacje po prawej stronie grafiki ASCII zależą od Ciebie.
Magic Octopus Urn
@ ConorO'Brien widząc, że nie określiłeś, który przypadek testowy, chciałbym umieścić nieszczęśliwą twarz w koszu na śmieci; P.
Magic Octopus Urn
1
Och, myślałem, że wybrałeś 91, aby zapobiec wszelkiego rodzaju wbudowaniom. o0
całkowicie ludzki,

Odpowiedzi:

15

Węgiel drzewny , 99 91 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. W rzeczywistości prawdziwa wersja ma tylko 83 70 bajtów:

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

Wyjaśnienie:

F¹⁵Fι⊞υκ

Wypełnij tablicę, podając informacje o tym, gdzie idą półki i jak długo są.

:(

Wydrukuj nieszczęśliwą twarz, chociaż zostanie ona natychmiast zastąpiona pierwszą butelką piwa (jeśli istnieje).

F⁻⁹¹N«

Zapętlić pozostałe butelki piwa.

   F¬⊟υ«

Sprawdź, czy należy narysować półkę.

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

Wydrukuj półkę i ustaw gotową do narysowania następnej butelki nad nią.

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

Narysuj butelkę i ustaw gotową do narysowania kolejnej butelki.

Neil
źródło
6
Huh Szkoda, że ​​to wyzwanie nie dotyczy około 99 butelek piwa. Muszę pobrać 8 bajtów w dół :): P
HyperNeutrino
1
@EriktheOutgolfer Właśnie dlatego zasugerowałem grę w golfa 8 bajtów: P I tak naprawdę grał w golfa 8 bajtów: D
HyperNeutrino
2
@HyperNeutrino Niezupełnie; Grałem w golfa 11, a potem w golfa 3 ...
Neil
1
@KevinCruijssen Zwykle zwiększasz za pomocą forpętli. To jest whilepętla, więc muszę zrobić coś więcej ręcznie.
Neil
1
@KevinCruijssen Chociaż, myśląc o tym, forpętla była drogą do przejścia przez cały czas ... 13 bajtów zapisanych! (Cóż, mam trochę szczęścia z łatwością wypełniania mojej tablicy.)
Neil
10

Python 3 , 306 299 265 253 255 252 247 244 bajtów

Szybka próba, można zoptymalizować

Edycja: -2 bajty dzięki @MrXcoder

Edycja: -32 bajtów, ponieważ końcowe spacje nie są potrzebne

Edycja: -12 bajtów poprzez połączenie dwóch funkcji

Edycja: -5 bajtów dzięki @ musicman523

Edycja: +7 bajtów, aby usunąć półkę po ostatnim wierszu

Edycja: -3 bajty

Edycja: -5 bajtów, ponieważ funkcja lambda jest używana tylko raz na mapie

Edytuj: -3 bajty za pomocą funkcji ciągucenter

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)*":(")

Wypróbuj online!

Halvard Hummel
źródło
@ Mr.Xcoder, który nie będzie działał dla x = 2, x = 4, x = 5, x = 7, ...
Halvard Hummel
Masz rację. Przepraszam!
Pan Xcoder,
2
248 bajtów poprzez usunięcie Ezmiennej
musicman523,
5

JavaScript (ES6), 251 256 bajtów

Edycja: Zapisano 2 bajty dzięki @dzaima .
Edycja: Dodano 7 bajtów, aby naprawić problem z parametrem.:(

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):':(')

Oto (przeważnie) wersja bez golfa:

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) : ':(';
}

Kod testowy

Aaron Hill
źródło
Bardzo imponująca, świetna odpowiedź. Lubię twoje r„makro”; Czułem, że może istnieć krótsza metoda, ale nic, co próbowałem, nie przyniosło żadnego efektu.
ETHprodukcje
2

C (gcc) , 360 358 bajtów

#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");}}});}

Wypróbuj online!

Wyjaśnienie:

#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");
                    }
                }
        });
}
Felix Palmen
źródło
0

Python 2, 436 bajtów

Yikes !!

Moja metoda jest zbyt szczegółowa, ale i tak: zasadniczo „rysuje” każdy rząd butelek, dodaje w odstępach, a następnie „usuwa” wszystko, co konieczne, drukując to, co zostało.

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':('

Halvard Hummel's jest znacznie lepszy.

Daniel
źródło