Гольф себе пиво

26

Это пятница! Что означает, что пришло время для пива!
К сожалению, сегодня мы будем играть в гольф, а не пить его. :(

Вызов

Выведите пиво и выпейте его. Количество глотков, которые вы принимаете, меняет ваш вывод.

Sips

Ваша программа должна взять одну входную строку. Эта строка может состоять исключительно из сцепленных sips.
Если на входе пустая строка, вы должны вывести полный стакан пива, включая пену.

Чем больше глотков вы сделаете, тем пустее будет ваш пивной бокал.

Если вы сделаете 0 глотков, у вашего пива все еще будет пена. Выход этой пены всегда одинаков (см. Примеры).

Если вы сделаете 1 глоток, вы должны вывести пивной бокал, затем новую строку и строку Yuck, foam..

Если вы сделаете 1 или более глотков, ваша пивная кружка больше не должна содержать пену, но должна показывать верхнюю часть стакана. Питьевая пена считается одним глотком.

Если вы сделаете 6 или более глотков, вы должны вывести пустой пивной бокал, за которым следует новая строка и строка Burp.

С каждым глотком ваш бокал пива должен опустошаться. Степень наполненности вашего бокала зависит от количества пузырьков °( °) в вашем пиве. Для каждого глотка, который вы принимаете после пены, необходимо удалить линию пузырьков. Каждая линия пива может содержать минимум 1и максимум 5пузырьков. Положение этих пузырьков должно быть на 100% случайным.

Примеры

вход

empty input string, or no input at all

выход

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

вход

sip sip sip

выход

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

вход

sip sip sip sip sip sip sip sip sip sip

выход

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

Эта вставка содержит список входов и выходов. Помните, что пузырьки в бокале должны быть случайными!

счет

Это , выигрывает самый короткий код в байтах!

Счастливого питья в гольф!

Bassdrop Cumberwubwubwub
источник
Вы можете заметить, что °это символ с кодовой точкой 176.
Мартин Эндер,
2
176 на Latin-1 и Unicode, чтобы быть более конкретным.
Мего
Допустим ли трейлинг новой строки на входах, кроме 1 и 6+?
ETHproductions
@ETHproductions да. Будет редактировать, когда на ноутбуке
Bassdrop Cumberwubwubwub
1
Выходные данные кружки должны оставаться такими же. Количество пузырьков на каждой линии должно отличаться при каждом запуске. В каждой строке может быть только один пузырь, или до 5. Это случайная часть испытания
Bassdrop Cumberwubwubwub

Ответы:

9

Japt , 189 байт

Я чуть не сошел с ума, пытаясь заставить это работать должным образом ...

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:

Попробуйте онлайн!

(Примечание. Эта программа была создана для более старой версии Japt и в настоящее время не работает в последней версии. Чтобы обойти эту проблему, в URL указана более старая версия. К сожалению, это также означает верхнее правое поле кода не работает.)

Это , безусловно , самая длинная программа , которую я когда - либо написал в Japt. Вот разбивка:

Шаг 1: Создайте верх пивной кружки.

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

Если U - пустая строка, это делает:

  oo  o oo
 oooooooooooo
o

В противном случае это делает:

 ____________

Шаг 2: Создайте средние ряды кружки.

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

Это приводит к предыдущей строке плюс:

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

Шаг 3: Добавьте пузыри.

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

На данный момент кружка выглядит примерно так:

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

Шаг 4: Добавьте последнюю строку и необязательный текст.

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

Теперь все готово для отправки на выход, что делается автоматически. Если у вас есть вопросы, не стесняйтесь спросить!

ETHproductions
источник
Прошло 3 дня.
Разорвать
@ Поскольку у меня это было в основном написано вчера, но мой мозг умер не столько, сколько мой браузер;) Я напишу это сегодня.
ETHproductions
Я рад, что ваш мозг по-прежнему функционирует, и я с нетерпением жду объяснения этого <s> чудовищного </ s> красивого куска кода
Bassdrop Cumberwubwubwub
1
@Bas Объяснение готово :-)
ETHproductions
4

JavaScript (ES6), 283 281 байт

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

объяснение

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

Тест

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
источник
1

PHP, 277 265 263 байта

Предполагая 1-байтовый перевод строки. Добавьте один в 14и 17на 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;

Беги с -r. разрывы строк могут нуждаться в экранировании.

сломать

// 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
источник
Привет, извините за неспособность ответить на ваш вопрос вовремя, но пена должна быть исправлена. Однако, если это улучшит ваш счетчик байтов, я думаю, это тоже может быть случайным. Мой плохой для того, чтобы не четко определить, так что используйте его в своих интересах
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Фактически случайные затраты на пену. Я только что увидел, что все исправили, пока я кодировал, и держали мою произвольную для начала.
Тит