Golf dich ein Bier

26

Es ist Freitag! Das heißt, es ist Zeit für Bier!
Leider werden wir heute Bier golfen, anstatt es zu trinken. :(

Herausforderung

Gib ein Bier aus und trinke es. Die Menge der Schlucke, die Sie nehmen, ändert Ihre Ausgabe.

Schlucke

Ihr Programm sollte eine Eingabezeichenfolge annehmen. Diese Zeichenfolge kann nur aus verketteten sips bestehen.
Wenn die Eingabe eine leere Zeichenfolge ist, sollten Sie ein volles Bierglas einschließlich Schaum ausgeben.

Je mehr Schluck Sie nehmen, desto leerer wird Ihr Bierglas.

Wenn Sie 0 Schlucke nehmen, hat Ihr Bier noch Schaum. Der Ausstoß dieses Schaums ist immer der gleiche (siehe Beispiele).

Wenn Sie 1 Schluck nehmen, sollten Sie das Bierglas ausgeben, gefolgt von einer neuen Zeile und der Zeichenfolge Yuck, foam..

Wenn Sie einen oder mehrere Schluck nehmen, sollte Ihr Bierglas keinen Schaum mehr enthalten, sondern die Oberseite Ihres Glases zeigen. Das Trinken des Schaums zählt als ein Schluck.

Wenn Sie 6 oder mehr Schlucke nehmen, sollten Sie ein leeres Bierglas ausgeben, gefolgt von einer neuen Zeile und der Zeichenfolge Burp.

Bei jedem Schluck sollte Ihr Bierglas leerer werden. Wie voll Ihr Bierglas ist, hängt von der Menge der Blasen °( °) in Ihrem Bier ab. Für jeden Schluck, den Sie nach dem Schaum nehmen, sollte eine Reihe von Blasen entfernt werden. Jede Bierreihe kann ein Minimum 1und ein Maximum an 5Blasen enthalten. Die Position dieser Blasen sollte zu 100% zufällig sein.

Beispiele

Eingang

empty input string, or no input at all

Ausgabe

  oo  o oo 
 oooooooooooo
o|  °     ° |\
 |     °    | \
 | °°    °  |} |
 |  °    °  | /
 |     °   °|/
 \__________/

Eingang

sip sip sip

Ausgabe

 ____________
 |          |\
 |          | \
 |     °    |} |
 |° °     ° | /
 | °    °   |/
 \__________/

Eingang

sip sip sip sip sip sip sip sip sip sip

Ausgabe

 ____________
 |          |\
 |          | \
 |          |} |
 |          | /
 |          |/
 \__________/
Burp

Dieser Pastebin enthält eine Liste der Ein- und Ausgänge. Denken Sie daran, dass die Blasen im Bierglas zufällig sein sollten!

Wertung

Dies ist , der kürzeste Code in Bytes gewinnt!

Viel Spaß beim Golfen!

Bassdrop Cumberwubwubwub
quelle
Vielleicht möchten Sie wissen, dass dies °das Zeichen mit dem Codepunkt 176 ist.
Martin Ender
2
176 in Latin-1 und Unicode, um genau zu sein.
Mego
Ist ein Zeilenumbruch bei Eingaben mit Ausnahme von 1 und 6+ akzeptabel?
ETHproductions
@ETHproductions ja. Wird bearbeitet, wenn auf dem Laptop
Bassdrop Cumberwubwubwub
1
Die Becherausgänge sollten gleich bleiben. Die Anzahl der Blasen auf jeder Linie sollte sich bei jedem Lauf unterscheiden. Es kann nur eine Blase auf jeder Linie oder bis zu 5 geben. Das ist der zufällige Teil der Herausforderung
Bassdrop Cumberwubwubwub

Antworten:

9

Japt , 189 Bytes

Ich bin fast verrückt geworden, als ich versucht habe, dies richtig zum Laufen zu bringen ...

U?S+'_pC +R:"  oo  o oo\n "+'opC +"\no")+"\\, \\,} |, /,/"q', £(V=(!Y«U?"|: |" +SpA +'|+X,(1+5*Mr)o mZ=>Ul <Y*4+4©(V=Vh2+A*Mr ,'° ),V)qR +"\n \\"+'_pA +'/+R+(Ul ¥3?"Yuck, foam.":Ug22 ?`B¨p:

Probieren Sie es online!

(Hinweis: Dieses Programm wurde für eine ältere Version von Japt erstellt und funktioniert derzeit nicht in der neuesten Version. Um dies zu umgehen, ist die ältere Version in der URL angegeben. Leider bedeutet dies auch das obere rechte Codefeld funktioniert nicht.)

Dies ist mit Abstand das längste Programm, das ich jemals in Japt geschrieben habe. Hier ist eine Aufschlüsselung:

Schritt 1: Stellen Sie die Oberseite des Bierbechers her.

U?S+'_pC +R:"  oo  o oo\n "+'opC +"\no")

           // Implicit: U = input string
           // Begin the ASCII art with:
U?S+       //  If U is not an empty string, a space +
'_pC +R:   //   "_".repeat(12) + a newline.
:"..."+    //  Otherwise, this string +
'opC +     //   "o".repeat(12) +
"\no")     //   a newline and an "o".

Wenn U eine leere Zeichenfolge ist, bedeutet dies:

  oo  o oo
 oooooooooooo
o

Ansonsten macht dies:

 ____________

Schritt 2: Erstellen Sie die mittleren Reihen des Bechers.

+"\\, \\,} |, /,/"q', £(V=(!Y«U?"|: |" +SpA +'|+X,

+"..."    // Add to the previous string: this string,
q', £(    // split at commas, with each item X and its index Y mapped to:
V=(       //  Set variable V to the result of concatenating:
!Y«U?     //   If Y is 0 and U is an empty string,
"|: |"    //    "|"; otherwise, " |";
+SpA      //   10 spaces,
'|+X,     //   "|", and X.

Dies ergibt die vorherige Zeichenfolge plus:

 |          |\
 |          | \
 |          |} |
 |          | /
 |          |/

Schritt 3: Fügen Sie die Blasen hinzu.

(1+5*Mr)o mZ=>Ul <Y*4+4©(V=Vh2+A*Mr ,'° ),V)

            // Note: We're still looping through the five rows at this point.
(1+5*Mr)    // Generate a random integer between 1 and 5.
o           // Create an array of this many integers, starting at 0.
mZ=>        // Map each item Z in this range to:
Ul <Y*4+4©  //  If the length of U is less than Y*4+4,
            //  (in other words, if there's less than Y+1 "sip"s)
(V=Vh   '°  //   Insert "°" at position
2+A*Mr      //    2 + random number between 0 and 9.
),V)qR      // Finally, return V, and join the five rows with newlines.

Zu diesem Zeitpunkt sieht die Tasse ungefähr so ​​aus:

 ____________
 |          |\
 |          | \
 |     °    |} |
 |° °     ° | /
 | °    °   |/

Schritt 4: Fügen Sie die letzte Zeile und optionalen Text hinzu.

+"\n \\"+'_pA +'/+R+(Ul ¥3?"Yuck, foam.":Ug22 ?`B¨p:

+"\n \\"    // Add a newline and " \".
+'_pA       // Add 10 "_"s.
+'/+R       // Add a slash and a newline.
+(Ul ¥3?    // If the length of U is 3 (i.e. 1 "sip"),
"..."       //  add the string "Yuck, foam.".
:Ug22 ?     // Otherwise, if U has a character at position 22 (six or more "sip"s),
`B¨p        //  decompress this string ("Burp") and add it.
:           // Otherwise, add nothing.

Jetzt kann alles an die Ausgabe gesendet werden, was automatisch erfolgt. Wenn Sie Fragen haben, können Sie diese gerne stellen!

ETHproductions
quelle
Es ist 3 Tage her. RIP Gehirn
Bassdrop Cumberwubwubwub
@Bas ich hatte es gestern meistens geschrieben, aber es war nicht mein Gehirn, sondern mein Browser, der gestorben ist;) Ich werde es heute schreiben lassen.
ETHproductions
Ich bin froh, dass Ihr Gehirn immer noch funktioniert, und ich freue mich darauf, eine Erklärung für diese <s> Monstrosität </ s> zu sehen
Bassdrop Cumberwubwubwub
1
@Bas Erklärung ist fertig :-)
ETHproductions
4

JavaScript (ES6), 283 281 Byte

s=>` `+(u=`_________`,(s=s&&s.split` `.length)?u+`___
 `:` oo  o oo
 oooooooooooo
o`)+(i=0,l=q=>`|`+[...u].map(_=>Math.random()>.8&i>=s&&b++<5?`°`:` `,b=0,i++).join``+(b|i<s?` `:`°`)+`|`+q+`
 `)`\\`+l` \\`+l`} |`+l` /`+l`/`+`\\`+u+`_/
`+(s&&s<2?`Yuck, foam.`:s>5?`Burp`:``)

Erläuterung

s=>
  ` `+(u=`_________`,        // u = 9 underscores
  (s=s&&s.split` `.length)   // s = number of sips
    ?u+`_
 `:` oo  o oo
 oooooooooooo
o`)                          // print glass top or foam

  // Print glass lines
  +(i=0,                     // i = line number
    l=q=>                    // l = print glass line
      `|`+[...u].map(_=>     // iterate 9 times
        Math.random()>.8     // should we put a bubble here?
        &i>=s                // has this line already been sipped?
        &&b++<5              // have we already placed 5 bubbles?
          ?`°`:` `,          // if not, place the bubble!
        b=0,                 // reset the number of placed bubbles
        i++                  // increment the line counter
      ).join``               // put the 9 spaces and bubbles together
      +(b|i<s?` `:`°`)       // place a bubble at 10 if none were placed
      +`|`+q+`
 `                           // print the suffix of this glass line
  )`\\`
  +l` \\`
  +l`} |`
  +l` /`
  +l`/`

  +`\\`+u+`_/
`                            // print the bottom of the glass
  +(s&&s<2?`Yuck, foam.`
    :s>5?`Burp`:``)          // print the message

Prüfung

Input: <input type="text" id="sips" /><button onclick="result.innerHTML=(

s=>` `+(u=`_________`,(s=s&&s.split` `.length)?u+`___
 `:` oo  o oo
 oooooooooooo
o`)+(i=0,l=q=>`|`+[...u].map(_=>Math.random()>.8&i>=s&&b++<5?`°`:` `,b=0,i++).join``+(b|i<s?` `:`°`)+`|`+q+`
 `)`\\`+l` \\`+l`} |`+l` /`+l`/`+`\\`+u+`_/
`+(s&&s<2?`Yuck, foam.`:s>5?`Burp`:``)

)(sips.value)">Go</button><pre id="result"></pre>

user81655
quelle
1

PHP, 277 265 263 Bytes

1-Byte-Zeilenumbruch vorausgesetzt. Fügen Sie eine zu 14und 17unter Windows hinzu.

$r=str_pad(($i=$argc-1)?"":"  oo  o oo",16).str_pad("
 ",14,_o[!$i])."   ".($s="
 |          |")."\\  $s \\ $s} |$s / $s/
 \__________/
 ".($i<6?$i-1?"":"Yuck, foam.":burp)if(!$i){$r[34]=o;$i=1;}for(;$i++<6;)for($n=rand(1,5);$n--;)$r[17*$i+rand(2,11)]="°";echo$r;

Laufen Sie mit -r. Zeilenumbrüche müssen möglicherweise maskiert werden.

Nervenzusammenbruch

// draw beer glass
$r=
    // first line: empty or foam
    str_pad(($i=$argc-1)?"":"  oo  o oo",16)
    // second line: top or foam
    .str_pad("\n ",14,_o[!$i])
    // other lines: empty glass+bottom
    ."   ".($s="\n |          |")."\\  $s \\ $s} |$s / $s/\n \__________/\n"
    // lyrics
    .($i<6?$i-1?"":"Yuck, foam.":burp)
;

// add foam left to the glass
if(!$i){$r[34]=o;$i=1;}

// add bubbles
for(;$i++<6;)
    for($n=rand(1,5);$n--;)
        $r[17*$i+rand(2,11)]="°";

// output
echo$r;
Titus
quelle
Hallo, entschuldige, dass du deine Frage nicht rechtzeitig beantwortet hast, aber der Schaum sollte behoben sein. Wenn es jedoch Ihre Byteanzahl verbessert, kann es auch zufällig sein. Meine schlechte für nicht klar
angeben
@BassdropCumberwubwubwub Tatsächlich zufällige Schaumkosten. Ich habe gerade gesehen, dass alle das Problem behoben haben, während ich programmiert habe, und habe meine zunächst zufällig ausgewählt.
Titus