Zagraj w piwo

26

Jest piątek! Co oznacza, że ​​czas na piwo!
Niestety dzisiaj będziemy grać w golfa zamiast go pić. :(

Wyzwanie

Wyjmij piwo i wypij je. Ilość łyków zmienia wynik.

Łyki

Twój program powinien pobrać jeden ciąg wejściowy. Ten ciąg może składać się wyłącznie z połączonych liter sips.
Jeśli wejście jest pustym ciągiem, powinieneś wypuścić pełną szklankę piwa, w tym piankę.

Im więcej łyków, tym bardziej pusta będzie szklanka do piwa.

Jeśli weźmiesz 0 łyków, twoje piwo nadal ma pianę. Wydajność tej pianki jest zawsze taka sama (patrz przykłady).

Jeśli weźmiesz 1 łyk, powinieneś wypić szklankę piwa, a następnie nową linię i sznur Yuck, foam..

Jeśli weźmiesz 1 lub więcej łyków, szklanka do piwa nie powinna już zawierać piany, ale powinna pokazywać górną część szklanki. Picie piany liczy się jako jeden łyk.

Jeśli weźmiesz 6 lub więcej łyków, powinieneś wypisać pustą szklankę piwa, a następnie nową linię i sznur Burp.

Z każdym łykiem szklanka do piwa powinna stać się bardziej pusta. Poziom napełnienia szklanki piwa zależy od ilości bąbelków °( °) w piwie. Z każdego łyka po pianie należy usunąć linię bąbelków. Każda linia piwa może zawierać minimum 1i maksimum 5bąbelków. Pozycja tych bąbelków powinna być w 100% losowa.

Przykłady

wkład

empty input string, or no input at all

wydajność

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

wkład

sip sip sip

wydajność

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

wkład

sip sip sip sip sip sip sip sip sip sip

wydajność

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

Ta pasta zawiera listę danych wejściowych i wyjściowych. Pamiętaj, że bąbelki w szklance do piwa powinny być losowe!

Punktacja

To jest , wygrywa najkrótszy kod w bajtach!

Miłego picia golfa!

Bassdrop Cumberwubwubwub
źródło
Warto zauważyć, że °jest to znak o kodzie 176.
Martin Ender
2
176 w Latin-1 i Unicode, by być bardziej szczegółowym.
Mego
Czy końcowy znak nowej linii na wejściach oprócz 1 i 6+ jest akceptowalny?
ETHprodukcje
@ETHproductions tak. Edycja nastąpi na laptopie
Bassdrop Cumberwubwubwub
1
Wyjścia kubka powinny pozostać takie same. Ilość bąbelków na każdej linii powinna różnić się przy każdym uruchomieniu. W każdej linii może znajdować się tylko jedna bańka lub maksymalnie 5. To losowa część wyzwania
Bassdrop Cumberwubwubwub

Odpowiedzi:

9

Japt , 189 bajtów

Prawie oszalałem, próbując sprawić, żeby działał poprawnie ...

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:

Wypróbuj online!

(Uwaga: ten program został stworzony dla starszej wersji Japt i obecnie nie działa w najnowszej wersji. Aby obejść ten problem, starsza wersja jest podana w adresie URL. Niestety oznacza to również pole kodu w prawym górnym rogu nie działa.)

To zdecydowanie najdłuższy program, jaki kiedykolwiek napisałem w Japt. Oto podział:

Krok 1: Utwórz górną część kufla do piwa.

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

Jeśli U jest pustym ciągiem, powoduje to:

  oo  o oo
 oooooooooooo
o

W przeciwnym razie powoduje to:

 ____________

Krok 2: Utwórz środkowe rzędy kubka.

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

Wynikiem jest poprzedni ciąg plus:

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

Krok 3: Dodaj bąbelki.

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

W tym momencie kubek wygląda mniej więcej tak:

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

Krok 4: Dodaj ostatni wiersz i opcjonalny tekst.

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

Teraz wszystko jest gotowe do wysłania na wyjście, co odbywa się automatycznie. Jeśli masz jakieś pytania, możesz je zadać!

ETHprodukcje
źródło
Minęły 3 dni. RIP brain
Bassdrop Cumberwubwubwub
@Bas Miałem to głównie napisane wczoraj, ale to nie mój mózg, ale moja przeglądarka, która umarła;) Dostanę to dzisiaj.
ETHprodukcje
Cieszę się, że twój mózg wciąż działa i czekam na wyjaśnienie tego <s> potworności </s> pięknego fragmentu kodu
Bassdrop Cumberwubwubwub
1
@Bas Wyjaśnienie jest gotowe :-)
ETHprodukcje
4

JavaScript (ES6), 283 281 bajtów

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

Wyjaśnienie

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

Test

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>

użytkownik 81655
źródło
1

PHP, 277 265 263 bajtów

Zakładając podział 1-bajtowy. Dodaj do jednego 14i 17na 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;

Uruchom z -r. łamanie linii może wymagać ucieczki.

awaria

// 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;
Tytus
źródło
Cześć, przepraszam, że nie odpowiedziałem na twoje pytanie na czas, ale pianka powinna zostać naprawiona. Jednakże, jeśli poprawi to twoją liczbę bajtów, myślę, że może być również losowa. Moje złe to, że nie sprecyzowałem, więc wykorzystaj to na swoją korzyść
Bassdrop Cumberwubwubwub,
@BassdropCumberwubwubwub Właściwie losowe koszty pianki. Właśnie zobaczyłem, że wszyscy go naprawili, kiedy kodowałem, i na początku trzymałem mój losowy.
Tytus