Golf una cerveza

26

¡Es viernes! ¡Lo que significa que es hora de cerveza!
Lamentablemente, hoy vamos a jugar al golf cerveza en lugar de beberla. :(

Reto

Saca una cerveza y bébela. La cantidad de sorbos que toma cambia su salida.

Sorbos

Su programa debe tomar una cadena de entrada. Esta cadena solo puede consistir en sips concatenados .
Si la entrada es una cadena vacía, debe generar un vaso de cerveza lleno, incluida la espuma.

Cuantos más sorbos tomes, más vacío estará tu vaso de cerveza.

Si toma 0 sorbos, su cerveza todavía tiene espuma. El rendimiento de esta espuma es siempre el mismo (ver ejemplos).

Si toma 1 sorbo, debe sacar el vaso de cerveza, seguido de una nueva línea y la cadena Yuck, foam..

Si toma 1 o más sorbos, su vaso de cerveza ya no debe contener espuma, sino que debe mostrar la parte superior de su vaso. Beber la espuma cuenta como un sorbo.

Si toma 6 o más sorbos, debe sacar un vaso de cerveza vacío, seguido de una nueva línea y la cadena Burp.

Por cada sorbo que tomes, tu vaso de cerveza debería volverse más vacío. Qué tan llena esté su vaso de cerveza depende de la cantidad de burbujas °( °) en su cerveza. Por cada sorbo que tome después de la espuma, se debe eliminar una línea de burbujas. Cada línea de cerveza puede contener un mínimo 1y un máximo de 5burbujas. La posición de estas burbujas debe ser 100% aleatoria.

Ejemplos

entrada

empty input string, or no input at all

salida

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

entrada

sip sip sip

salida

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

entrada

sip sip sip sip sip sip sip sip sip sip

salida

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

Este pastebin contiene una lista de entradas y salidas. ¡Recuerda que las burbujas en el vaso de cerveza deben ser aleatorias!

Tanteo

Este es el , ¡el código más corto en bytes gana!

Feliz bebiendo golf!

Bassdrop Cumberwubwubwub
fuente
Es posible que desee tener en cuenta que °es el personaje con el punto de código 176.
Martin Ender
2
176 en latín-1 y Unicode, para ser más específicos.
Mego
¿Es aceptable una nueva línea final en las entradas excepto 1 y 6+?
ETHproductions
@ETHproductions sí. Se editará cuando
esté
1
Las salidas de la taza deben permanecer iguales. La cantidad de burbujas en cada línea debe diferir en cada ejecución. Solo puede haber una burbuja en cada línea, o hasta 5. Esa es la parte aleatoria del desafío
Bassdrop Cumberwubwubwub

Respuestas:

9

Japt , 189 bytes

Casi me vuelvo loco al tratar de hacer que esto funcione correctamente ...

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:

Pruébalo en línea!

(Nota: Este programa fue creado para una versión anterior de Japt, y actualmente no funciona en la última versión. Para solucionar esto, la versión anterior se especifica en la URL. Desafortunadamente, esto también significa el cuadro de código superior derecho no funciona)

Este es, con mucho, el programa más largo que he escrito en Japt. Aquí hay un desglose:

Paso 1: Crea la parte superior de la jarra de cerveza.

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 es una cadena vacía, esto hace:

  oo  o oo
 oooooooooooo
o

De lo contrario, esto hace:

 ____________

Paso 2: Crea las filas del medio de la taza.

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

Esto da como resultado la cadena anterior más:

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

Paso 3: agrega las burbujas.

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

En este punto, la taza se ve así:

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

Paso 4: agregue la fila final y el texto opcional.

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

Ahora todo está listo para ser enviado a la salida, lo que se hace automáticamente. ¡Si tiene alguna pregunta, sientase con libertad de preguntar!

ETHproducciones
fuente
Han pasado 3 días. RIP brain
Bassdrop Cumberwubwubwub
@Porque lo escribí principalmente ayer, pero no fue tanto mi cerebro como mi navegador el que murió;) Lo escribiré hoy.
ETHproductions
Me alegra que tu cerebro siga funcionando, y espero ver una explicación de esta <s> monstruosidad </s> hermosa pieza de código
Bassdrop Cumberwubwubwub
1
@Bas Explanation está lista :-)
ETHproductions
4

JavaScript (ES6), 283 281 bytes

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

Explicación

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

Prueba

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>

usuario81655
fuente
1

PHP, 277 265 263 bytes

Asumiendo salto de línea de 1 byte. Agregue uno a 14y 17en 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;

Corre con -r. los saltos de línea pueden necesitar escapar.

Descompostura

// 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
fuente
Hola, perdón por no responder a su pregunta a tiempo, pero la espuma debe repararse. Sin embargo, si mejora su conteo de bytes, supongo que también puede ser aleatorio. Mi mal por no especificar claramente, así que
úsalo
@BassdropCumberwubwubwub Costes de espuma realmente aleatorios. Acabo de ver que todos lo arreglaron mientras estaba codificando y mantuve el mío al azar para empezar.
Titus