91 botellas de cerveza ASCII en la pared

17

Dado un solo número entero xdonde 0 <= x <= 91sale una pila de botellas de cerveza con la falta de tantas botellas (y estantes). Por simplicidad, solo mostraré las primeras 6 botellas y lo que sería para cada una de las primeras entradas.

Aquí está la pila de botellas, cada número es la botella que debe quitar para esa entrada (1 indexado):

https://pastebin.com/wSpZRMV6


Tenga en cuenta que estamos usando 91 en lugar de 99 porque 99 daría como resultado una pila inestable de botellas.


Ejemplo

Con 0 botellas faltantes ( x=0):

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

Para ver la salida completa de 0, consulte aquí: https://pastebin.com/ZuXkuH6s


Sin 1botella ( x=1):

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

Una vez más, estas son las dos primeras filas desde aquí: https://pastebin.com/ZuXkuH6s (con 1 eliminado) ...


Con 2 botellas faltantes:

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

[ENTRADAS ADICIONALES ELIMINADAS]


Con 91 botellas faltantes ( n = 91):

:(

Debes mostrar una cara triste porque no te queda cerveza.


Reglas

  • Las botellas deben retirarse de izquierda a derecha.
  • Los estantes se retiran cuando no queda cerveza en la parte superior de los estantes.
  • Para una entrada de 0, está generando 91 botellas apiladas en un triángulo.
    • La fila inferior tiene 13 botellas, la superior tiene 1.
  • 1 espacio entre cada botella en cada estante.
  • Los estantes deben ser ingresados ​​entre cada fila de botellas.
    • Los estantes pueden usar =, -o #como el personaje.
    • Los estantes deben ser 3 más anchos (en cada lado) que las botellas que sostienen.
  • Este es el , el menor conteo de bytes gana.
Urna de pulpo mágico
fuente
¿Podría proporcionar, por ejemplo, una pasta de al menos uno de los casos de prueba completos?
Conor O'Brien
¿Se requieren espacios finales después de la última botella de un estante?
Jonathan Frech
Se requieren espacios anteriores, ya que los está eliminando de izquierda a derecha, los espacios a la derecha del arte ASCII dependen de usted.
Urna de pulpo mágico
@ ConorO'Brien, ya que no especificó qué caso de prueba, desearía haber puesto una cara infeliz en un pastebin; P.
Urna mágica de pulpo
1
Oh, pensé que habías elegido 91 para evitar cualquier tipo de complementos. o0
totalmente humano

Respuestas:

15

Carbón , 99 91 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. En realidad, la versión real es solo 83 70 bytes:

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

Explicación:

F¹⁵Fι⊞υκ

Rellene una matriz proporcionando información sobre dónde van los estantes y cuánto duran.

:(

Imprima una cara infeliz, aunque esto se sobrescribirá inmediatamente con la primera botella de cerveza (si corresponde).

F⁻⁹¹N«

Recorre las botellas de cerveza restantes.

   F¬⊟υ«

Verifique si es necesario dibujar un estante.

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

Imprima el estante y colóquelo listo para dibujar la siguiente botella por encima.

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

Dibuja una botella y posiciona listo para dibujar otra botella.

Neil
fuente
66
Huh Lástima que este desafío no se trata de 99 botellas de cerveza. Tengo que bajar 8 bytes :): P
HyperNeutrino
1
@EriktheOutgolfer Es por eso que sugerí jugar al golf 8 bytes: P Y sí, en realidad hizo golf 8 bytes: D
HyperNeutrino
2
@HyperNeutrino No exactamente; Jugué golf 11, luego no golfé 3 ...
Neil
1
@KevinCruijssen Normalmente, se incrementaría con un forbucle. Este es un whilebucle, así que tengo que hacer algo más manualmente.
Neil
1
@KevinCruijssen Aunque, pensando en ello, un forbucle fue el camino a seguir todo el tiempo ... ¡13 bytes guardados! (Bueno, tuve un poco de suerte con la facilidad de llenar mi matriz.)
Neil
10

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

Intento rápido, podría optimizarse

Editar: -2 bytes gracias a @MrXcoder

Editar: -32 bytes ya que no se necesitan espacios finales

Editar: -12 bytes combinando las dos funciones

Editar: -5 bytes gracias a @ musicman523

Editar: +7 bytes para eliminar el estante después de la última fila

Editar: -3 bytes

Editar: -5 bytes debido a que una función lambda solo se usa una vez en un mapa

Editar: -3 bytes utilizando la función de cadenacenter

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

Pruébalo en línea!

Halvard Hummel
fuente
@ Mr.Xcoder que no funcionará para x = 2, x = 4, x = 5, x = 7, ...
Halvard Hummel
Oh tienes razon ¡Lo siento!
Sr. Xcoder
2
248 bytes eliminando la Evariable
musicman523
5

JavaScript (ES6), 251 256 bytes

Editar: Guardado 2 bytes gracias a @dzaima .
Editar: Se agregaron 7 bytes para solucionar el problema con el parámetro.:(

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

Aquí está la versión (en su mayoría) sin golf:

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

Código de prueba

Aaron Hill
fuente
Muy impresionante, gran respuesta. Me gusta tu r"macro"; Sentí que podría haber un método más corto, pero nada de lo que intenté lo hizo caer.
ETHproductions
2

C (gcc) , 360 358 bytes

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

Pruébalo en línea!

Explicació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");
                    }
                }
        });
}
Felix Palmen
fuente
0

Python 2, 436 bytes

¡Ay!

Mi método es demasiado detallado, pero de todos modos: esencialmente 'dibuja' cada fila de botellas, agrega los espacios y luego 'borra' lo que sea necesario, imprimiendo lo que queda.

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 es mucho mejor.

Daniel
fuente