91 bouteilles de bière ASCII sur le mur

17

Étant donné un seul entier x0 <= x <= 91sortir une pile de bouteilles de bière avec autant de bouteilles (et étagères) manquantes. Par souci de simplicité, je ne montrerai que les 6 premières bouteilles et ce que ce serait pour chacune des premières entrées.

Voici la pile de bouteilles, chaque numéro est la bouteille que vous devez retirer pour cette entrée (indexé 1):

https://pastebin.com/wSpZRMV6


Notez que nous utilisons 91 au lieu de 99, car 99 entraînerait une pile de bouteilles instable.


Exemple

Avec 0 bouteilles manquantes ( x=0):

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

Pour la sortie complète de 0, voir ici: https://pastebin.com/ZuXkuH6s


Avec 1bouteille manquante ( x=1):

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

Encore une fois, ce sont les deux premières lignes d'ici: https://pastebin.com/ZuXkuH6s (avec 1 supprimé) ...


Avec 2 bouteilles manquantes:

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

[ENTRÉES SUPPLÉMENTAIRES SUPPRIMÉES]


Avec 91 bouteilles manquantes ( n = 91):

:(

Vous devez produire un visage malheureux, car vous n'avez plus de bière.


Règles

  • Les bouteilles doivent être retirées de gauche à droite.
  • Les étagères sont retirées lorsqu'aucune bière ne reste sur le dessus des étagères.
  • Pour une entrée de 0, vous générez 91 bouteilles empilées dans un triangle.
    • La rangée du bas a 13 bouteilles, le haut en a 1.
  • 1 espace entre chaque bouteille sur chaque étagère.
  • Les étagères doivent être insérées entre chaque rangée de bouteilles.
    • Les étagères peuvent utiliser =, -ou #comme personnage.
    • Les étagères doivent être 3 plus larges (de chaque côté) que les bouteilles qu'elles contiennent.
  • Il s'agit du , le plus petit nombre de victoires.
Urne de poulpe magique
la source
Pourriez-vous fournir, disons, une boîte à pâte d'au moins un des cas de test entiers?
Conor O'Brien
Faut-il des espaces de fuite après la dernière bouteille d'une étagère?
Jonathan Frech
Les espaces précédents sont nécessaires, car vous les supprimez de gauche à droite, les espaces à droite de l'art ASCII sont à vous.
Urne de poulpe magique du
@ ConorO'Brien vu que vous n'avez pas spécifié quel cas de test, j'aurais aimé mettre un visage malheureux dans une boîte à pâte; P.
Urne de poulpe magique
1
Oh, je pensais que vous aviez choisi 91 pour empêcher tout type de fonction intégrée. o0
totallyhuman

Réponses:

15

Fusain , 99 91 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. En fait, la vraie version n'est que de 83 70 octets:

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

Explication:

F¹⁵Fι⊞υκ

Remplissez un tableau fournissant des informations sur l'emplacement des étagères et leur durée.

:(

Imprimez un visage malheureux, bien qu'il soit immédiatement remplacé par la première bouteille de bière (le cas échéant).

F⁻⁹¹N«

Parcourez les bouteilles de bière restantes.

   F¬⊟υ«

Vérifiez si une étagère doit être dessinée.

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

Imprimez l'étagère et positionnez-la prête à tirer la bouteille suivante au-dessus.

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

Dessinez une bouteille et placez-vous prêt à en tirer une autre.

Neil
la source
6
Huh. Dommage que ce défi ne concerne pas 99 bouteilles de bière. Je dois récupérer 8 octets :): P
HyperNeutrino
1
@EriktheOutgolfer C'est pourquoi j'ai suggéré de jouer au golf à 8 octets: P Et oui, il a fait du golf à 8 octets: D
HyperNeutrino
2
@HyperNeutrino Pas exactement; J'ai joué au golf 11, puis je n'ai pas golfé 3 ...
Neil
1
@KevinCruijssen Normalement, vous incrémentez en utilisant une forboucle. Ceci est une whileboucle, donc je dois faire quelque chose de plus manuellement.
Neil
1
@KevinCruijssen Bien qu'en y réfléchissant, une forboucle était le chemin à parcourir tout au long ... 13 octets économisés! (Eh bien, j'ai eu un peu de chance avec la facilité de remplissage de mon tableau.)
Neil
10

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

Tentative rapide, pourrait être optimisée

Edit: -2 octets grâce à @MrXcoder

Modifier: -32 octets car les espaces de fin ne sont pas nécessaires

Edit: -12 octets en combinant les deux fonctions

Edit: -5 octets grâce à @ musicman523

Modifier: +7 octets pour supprimer l'étagère après la dernière ligne

Éditer: -3 octets

Edit: -5 octets car une fonction lambda n'est utilisée qu'une seule fois dans une carte

Modifier: -3 octets en utilisant la fonction chaînecenter

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

Essayez-le en ligne!

Halvard Hummel
la source
@ Mr.Xcoder qui ne fonctionnera pas pour x = 2, x = 4, x = 5, x = 7, ...
Halvard Hummel
Oh, tu as raison. Pardon!
M. Xcoder
2
248 octets en supprimant la Evariable
musicman523
5

JavaScript (ES6), 251 256 octets

Edit: sauvé 2 octets grâce à @dzaima .
Edit: Ajout de 7 octets pour résoudre le problème avec le paramètre.:(

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

Voici la version (principalement) non golfée:

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

Code de test

Aaron Hill
la source
Très impressionnant, excellente réponse. J'aime ta r"macro"; J'avais l'impression qu'il pourrait y avoir une méthode plus courte mais rien de ce que j'ai essayé ne l'a abaissée.
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");}}});}

Essayez-le en ligne!

Explication:

#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
la source
0

Python 2, 436 octets

Oui !!

Ma méthode est trop verbeuse, mais de toute façon: elle «dessine» essentiellement chaque rangée de bouteilles, ajoute des espaces, puis «efface» tout ce qui est nécessaire, imprimant tout ce qui reste.

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 est beaucoup mieux.

Daniel
la source