Golfez-vous une bière

26

C'est vendredi! Ce qui signifie qu'il est temps pour la bière!
Malheureusement, aujourd'hui, nous allons jouer à la bière au golf au lieu de la boire. :(

Défi

Sortez une bière et buvez-la. La quantité de gorgées que vous prenez modifie votre sortie.

Gorgées

Votre programme doit prendre une chaîne d'entrée. Cette chaîne ne peut être constituée que de sips concaténés .
Si l'entrée est une chaîne vide, vous devez produire un verre à bière plein, y compris de la mousse.

Plus vous buvez de gorgées, plus votre verre à bière sera vide.

Si vous prenez 0 gorgées, votre bière a encore de la mousse. Le rendement de cette mousse est toujours le même (voir exemples).

Si vous prenez 1 gorgée, vous devez sortir le verre à bière, suivi d'une nouvelle ligne et de la chaîne Yuck, foam..

Si vous prenez 1 gorgée ou plus, votre verre à bière ne devrait plus contenir de mousse, mais devrait montrer le haut de votre verre. Boire la mousse compte comme une gorgée.

Si vous prenez 6 gorgées ou plus, vous devez sortir un verre à bière vide, suivi d'une nouvelle ligne et de la chaîne Burp.

Pour chaque gorgée que vous prenez, votre verre à bière devrait devenir plus vide. Le niveau de remplissage de votre verre à bière dépend de la quantité de bulles °( °) dans votre bière. Pour chaque gorgée que vous prenez après la mousse, une ligne de bulles doit être supprimée. Chaque ligne de bière peut contenir un minimum 1et un maximum de 5bulles. La position de ces bulles doit être aléatoire à 100%.

Exemples

contribution

empty input string, or no input at all

sortie

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

contribution

sip sip sip

sortie

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

contribution

sip sip sip sip sip sip sip sip sip sip

sortie

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

Ce pastebin contient une liste d'entrées et de sorties. N'oubliez pas que les bulles dans le verre à bière doivent être aléatoires!

Notation

C'est le , le code le plus court en octets gagne!

Heureux de boire du golf!

Bassdrop Cumberwubwubwub
la source
Vous voudrez peut-être noter que °c'est le personnage avec le point de code 176.
Martin Ender
2
176 en Latin-1 et Unicode, pour être plus précis.
Mego
Une nouvelle ligne de fin sur les entrées sauf 1 et 6+ est-elle acceptable?
ETHproductions
@ETHproductions yes.
S'éditera
1
Les sorties de tasse devraient rester les mêmes. La quantité de bulles sur chaque ligne doit différer à chaque passage. Il ne peut y avoir qu'une seule bulle sur chaque ligne, ou jusqu'à 5. C'est la partie aléatoire du défi
Bassdrop Cumberwubwubwub

Réponses:

9

Japt , 189 octets

Je suis presque devenu fou en essayant de faire fonctionner cela correctement ...

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:

Essayez-le en ligne!

(Remarque: ce programme a été conçu pour une ancienne version de Japt et ne fonctionne pas actuellement dans la dernière version. Pour contourner ce problème, l'ancienne version est spécifiée dans l'URL. Malheureusement, cela signifie également la zone de code en haut à droite ne fonctionne pas.)

C'est de loin le programme le plus long que j'aie jamais écrit en Japt. Voici une ventilation:

Étape 1: Créez le haut de la chope de bière.

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".

Si U est une chaîne vide, cela fait:

  oo  o oo
 oooooooooooo
o

Sinon, cela fait:

 ____________

Étape 2: Créez les rangées centrales de la tasse.

+"\\, \\,} |, /,/"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.

Il en résulte la chaîne précédente plus:

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

Étape 3: ajoutez les bulles.

(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.

À ce stade, la tasse ressemble à ceci:

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

Étape 4: Ajoutez la dernière ligne et le texte facultatif.

+"\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.

Maintenant, tout est prêt à être envoyé en sortie, ce qui se fait automatiquement. Si vous avez des questions, n'hésitez pas à les poser!

ETHproductions
la source
Ça fait 3 jours. RIP brain
Bassdrop Cumberwubwubwub
@Bas je l'ai fait surtout écrit hier, mais ce n'est pas mon cerveau autant que mon navigateur qui est mort;) Je vais le faire écrire aujourd'hui.
ETHproductions
Je suis content que votre cerveau fonctionne toujours, et j'ai hâte de voir une explication de cette <s> monstruosité </s> belle pièce de code
Bassdrop Cumberwubwubwub
1
@Bas Explanation est prêt :-)
ETHproductions
4

JavaScript (ES6), 283 281 octets

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`:``)

Explication

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

Tester

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
la source
1

PHP, 277 265 263 octets

En supposant un saut de ligne sur 1 octet. Ajoutez-en un à 14et 17sur Windows.

$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;

Courez avec -r. les sauts de ligne peuvent nécessiter un échappement.

panne

// 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
la source
Bonjour, désolé de ne pas avoir répondu à temps à votre question mais la mousse doit être réparée. Cependant, si cela améliore votre nombre d'octets, je suppose que cela peut aussi être aléatoire. Mon mauvais pour ne pas préciser clairement, alors utilisez-le à votre avantage
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Coûts de mousse réellement aléatoires. Je viens de voir que tout le monde l'a réparé pendant que je codais et j'ai gardé le mien au hasard pour commencer.
Titus