91 Flaschen ASCII-Bier an der Wand

17

Bei einer einzigen Ganzzahl in xdem 0 <= x <= 91fehlenden Ausgang ein Stapel von Bierflaschen mit , dass viele Flaschen (und Regale). Der Einfachheit halber zeige ich nur die ersten 6 Flaschen und was es für jede der ersten Eingaben sein würde.

Hier ist der Flaschenstapel. Jede Nummer ist die Flasche, die Sie für diese Eingabe entfernen sollten (1-indiziert):

https://pastebin.com/wSpZRMV6


Beachten Sie, dass wir 91 anstelle von 99 verwenden, da 99 zu einem instabilen Flaschenstapel führen würde.


Beispiel

Mit 0 fehlenden Flaschen ( x=0):

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

Die vollständige Ausgabe von 0 finden Sie hier: https://pastebin.com/ZuXkuH6s


Mit 1fehlender Flasche ( x=1):

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

Dies sind wieder die ersten beiden Zeilen von hier: https://pastebin.com/ZuXkuH6s (wobei 1 entfernt wurde) ...


Bei 2 fehlenden Flaschen:

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

[ZUSÄTZLICHE EINGÄNGE ENTFERNT]


Bei 91 fehlenden Flaschen ( n = 91):

:(

Sie müssen ein unglückliches Gesicht ausgeben, weil Sie kein Bier mehr haben.


Regeln

  • Flaschen sind von links nach rechts zu entnehmen.
  • Regale werden entfernt, wenn kein Bier mehr auf den Regalen steht.
  • Bei einer Eingabe von 0 geben Sie 91 Flaschen aus, die in einem Dreieck gestapelt sind.
    • Die untere Reihe hat 13 Flaschen, die obere hat 1.
  • 1 Platz zwischen jeder Flasche in jedem Regal.
  • Zwischen jeder Flaschenreihe müssen Regale stehen.
    • Regale verwenden kann =, -oder #als Zeichen.
    • Die Regale müssen auf jeder Seite 3 breitere Stellen haben als die Flaschen, die sie enthalten.
  • Dies ist , die niedrigste Anzahl an Bytes gewinnt.
Magische Kraken-Urne
quelle
Könnten Sie beispielsweise einen Pastebin für mindestens einen der gesamten Testfälle bereitstellen?
Conor O'Brien
Sind Leerzeichen nach der letzten Flasche eines Regals erforderlich?
Jonathan Frech
Vorhergehende Leerzeichen sind erforderlich, da Sie sie von links nach rechts entfernen. Die Leerzeichen rechts von der ASCII-Grafik sind Ihre Wahl.
Magic Octopus Urn
@ConorO'Brien Da Sie nicht angegeben haben, welcher Testfall vorliegt, wünschte ich, ich hätte ein unglückliches Gesicht in einen Pastebin gelegt.
Magic Octopus Urn
1
Oh, ich dachte, Sie hätten 91 gewählt, um jegliche Art von Einbauten zu verhindern. o0
totalhuman

Antworten:

15

Kohle , 99 91 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Tatsächlich ist die reale Version nur 83-70 Bytes:

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

Erläuterung:

F¹⁵Fι⊞υκ

Füllen Sie ein Array mit Informationen darüber, wohin die Regale führen und wie lang sie sind.

:(

Drucken Sie ein unglückliches Gesicht, das jedoch sofort von der ersten Flasche Bier (falls vorhanden) überschrieben wird.

F⁻⁹¹N«

Schlinge dich durch die restlichen Bierflaschen.

   F¬⊟υ«

Prüfen Sie, ob ein Regal gezeichnet werden muss.

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

Drucken Sie das Regal aus und stellen Sie es bereit, um die nächste Flasche darüber zu zeichnen.

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

Zeichnen Sie eine Flasche und stellen Sie sie bereit, um eine weitere Flasche zu zeichnen.

Neil
quelle
6
Huh. Schade, dass es bei dieser Herausforderung nicht um 99 Flaschen Bier geht.
Muss
1
@EriktheOutgolfer Deshalb habe ich vorgeschlagen, 8 Bytes zu golfen: P Und yay hat er tatsächlich 8 Bytes
golfen
2
@HyperNeutrino Nicht genau; Ich spielte 11, dann 3 ...
Neil
1
@ KevinCruijssen Normalerweise würden Sie mithilfe einer forSchleife inkrementieren . Dies ist eine whileSchleife, daher muss ich einige Dinge manuell erledigen.
Neil
1
@KevinCruijssen Obwohl, wenn man darüber nachdenkt, war eine forSchleife der beste Weg ... 13 Bytes gespart! (Nun, ich hatte ein bisschen Glück mit der Leichtigkeit, mein Array
Neil
10

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

Schneller Versuch, könnte optimiert werden

Edit: -2 Bytes dank @MrXcoder

Edit: -32 Bytes, da nachgestellte Leerzeichen nicht benötigt werden

Editieren: -12 Bytes durch Kombination der beiden Funktionen

Edit: -5 Bytes dank @ musicman523

Bearbeiten: +7 Bytes, um das Regal nach der letzten Zeile zu entfernen

Edit: -3 Bytes

Edit: -5 Bytes, da eine Lambda-Funktion in einer Map nur einmal verwendet wird

Bearbeiten: -3 Bytes mit der String-Funktioncenter

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

Probieren Sie es online!

Halvard Hummel
quelle
@ Mr.Xcoder, die nicht für x = 2, x = 4, x = 5, x = 7, ... arbeiten
Halvard Hummel
Oh, du hast Recht. Es tut uns leid!
Mr. Xcoder
2
248 Bytes durch Entfernen der EVariablen
musicman523
5

JavaScript (ES6), 251 256 Byte

Bearbeiten: 2 Bytes dank @dzaima gespeichert .
Bearbeiten: 7 Bytes hinzugefügt, um das Problem mit dem Parameter zu beheben.:(

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

Hier ist die (meist) ungolfed Version:

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 testen

Aaron Hill
quelle
Sehr beeindruckend, tolle Antwort. Ich mag dein r"Makro"; Ich hatte das Gefühl, dass es eine kürzere Methode geben könnte, aber nichts, was ich ausprobierte, brachte es zum Erliegen.
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");}}});}

Probieren Sie es online!

Erläuterung:

#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
quelle
0

Python 2, 436 Bytes

Huch !!

Meine Methode ist zu ausführlich, aber dennoch: Sie zeichnet im Wesentlichen jede Flaschenreihe, fügt Leerzeichen hinzu und 'löscht' dann alles Notwendige, druckt alles, was noch übrig ist.

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 Hummels ist viel besser.

Daniel
quelle