91 bottiglie di birra ASCII sul muro


17

Dato un unico numero intero in xcui viene 0 <= x <= 91prodotta una pila di bottiglie di birra con tante bottiglie (e scaffali) mancanti. Per semplicità, mostrerò solo le prime 6 bottiglie e quale sarebbe per ciascuno dei primi input.

Ecco la pila di bottiglie, ogni numero è la bottiglia che dovresti rimuovere per quell'input (1-indicizzato):

https://pastebin.com/wSpZRMV6


Nota, stiamo usando 91 invece di 99 perché 99 comporterebbe una pila instabile di bottiglie.


Esempio

Con 0 bottiglie mancanti ( x=0):

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

Per l'output completo di 0, vedere qui: https://pastebin.com/ZuXkuH6s


Con 1bottiglia mancante ( x=1):

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

Ancora una volta, queste sono le prime due righe da qui: https://pastebin.com/ZuXkuH6s (con 1 rimosso) ...


Con 2 bottiglie mancanti:

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

[INGRESSI AGGIUNTIVI RIMOSSI]


Con 91 bottiglie mancanti ( n = 91):

:(

Devi dare una faccia infelice, perché sei senza birra.


Regole

  • Le bottiglie devono essere rimosse da sinistra a destra.
  • Gli scaffali vengono rimossi quando nessuna birra rimane sulla parte superiore degli scaffali.
  • Per un input di 0, stai producendo 91 bottiglie impilate in un triangolo.
    • La riga inferiore ha 13 bottiglie, la parte superiore ha 1.
  • 1 spazio tra ogni bottiglia su ogni ripiano.
  • Gli scaffali devono essere inseriti tra ogni fila di bottiglie.
    • Mensole possono utilizzare =, -o #come il carattere.
    • Le mensole devono essere 3 più larghe (su ciascun lato) rispetto alle bottiglie che contengono.
  • Questo è , vince il conteggio di byte più basso.

Potresti fornire, per esempio, una pasta di almeno uno degli interi casi di test?
Conor O'Brien,

Sono necessari spazi finali dopo l'ultima bottiglia di uno scaffale?
Jonathan Frech,

Gli spazi precedenti sono richiesti, mentre li rimuovi da sinistra a destra, gli spazi a destra dell'arte ASCII dipendono da te.
Magic Octopus Urn l'

@ ConorO'Brien visto che non hai specificato quale caso di test, vorrei aver messo una faccia infelice in un pastebin; P.
Magic Octopus Urn l'

1
Oh, pensavo avessi scelto 91 per prevenire qualsiasi tipo di built-in. o0
totalmente umano

Risposte:


15

Carbone , 99 91 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. In realtà la versione reale è solo 83 70 byte:

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

Spiegazione:

F¹⁵Fι⊞υκ

Popolare un array che fornisce informazioni su dove vanno gli scaffali e quanto tempo sono.

:(

Stampa un volto infelice, anche se questo verrà immediatamente sovrascritto dalla prima bottiglia di birra (se presente).

F⁻⁹¹N«

Passa attraverso le restanti bottiglie di birra.

   F¬⊟υ«

Verifica se è necessario disegnare uno scaffale.

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

Stampa lo scaffale e posizionalo pronto per disegnare la bottiglia successiva sopra di essa.

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

Disegna una bottiglia e posiziona pronto per disegnare un'altra bottiglia.


6
Huh. Peccato che questa sfida non riguardi 99 bottiglie di birra. Devo ottenere 8 byte in meno :): P
HyperNeutrino il

1
@EriktheOutgolfer Ecco perché ho suggerito di giocare a golf 8 byte: P E yay ha effettivamente
giocato a

2
@HyperNeutrino Non esattamente; Ho giocato a golf 11, poi non golfato 3 ...
Neil

1
@KevinCruijssen Normalmente incrementeresti usando un forciclo. Questo è un whileciclo, quindi devo fare qualcosa di più manualmente.
Neil,

1
@KevinCruijssen Anche se, a pensarci, un forciclo era la strada da percorrere per tutto ... 13 byte salvati! (Beh, sono stato un po 'fortunato con la facilità di popolare il mio array.)
Neil

10

Python 3 , 306 299 265 253 255 252 247 244 byte

Tentativo rapido, potrebbe essere ottimizzato

Modifica: -2 byte grazie a @MrXcoder

Modificare: -32 byte in quanto non sono necessari spazi finali

Modificare: -12 byte combinando le due funzioni

Modifica: -5 byte grazie a @ musicman523

Modificare: +7 byte per rimuovere lo scaffale dopo l'ultima riga

Modificare: -3 byte

Modificare: -5 byte a causa di una funzione lambda utilizzata una sola volta in una mappa

Modifica: -3 byte usando la funzione stringacenter

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

Provalo online!


@ Mr.Xcoder che non funzionerà per x = 2, x = 4, x = 5, x = 7, ...
Halvard Hummel

Oh, hai ragione. Scusate!
Mr. Xcoder, l'


2
248 byte rimuovendo la Evariabile
musicman523

5

JavaScript (ES6), 251 256 byte

Modifica: salvato 2 byte grazie a @dzaima .
Modifica: aggiunti 7 byte per risolvere il problema con il parametro.:(

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

Ecco la versione (per lo più) non golfizzata:

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

Codice di prova


Molto impressionante, ottima risposta. Mi piace la tua r"macro"; Mi sembrava che ci potesse essere un metodo più breve, ma nulla di ciò che ho provato lo ha abbattuto.
ETHproductions

2

C (gcc) , 360 358 byte

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

Provalo online!

Spiegazione:

#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 byte

Oddio !!

Il mio metodo è troppo dettagliato, ma comunque: essenzialmente "disegna" ogni fila di bottiglie, aggiunge gli spazi e quindi "cancella" tutto ciò che è necessario, stampando ciò che resta.

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 è molto meglio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.