Golfkan sendiri bir

26

Ini hari jumat! Yang berarti saatnya untuk bir!
Sayangnya, hari ini kita akan bermain golf bukan meminumnya. :(

Tantangan

Keluarkan bir dan minum. Jumlah tegukan yang Anda ambil mengubah output Anda.

Menyesap

Program Anda harus mengambil satu string input. String ini hanya dapat terdiri dari sips yang digabung .
Jika inputnya berupa string kosong, Anda harus mengeluarkan segelas bir penuh, termasuk busa.

Semakin banyak teguk yang Anda ambil, semakin kosong gelas bir Anda.

Jika Anda minum 0 teguk, bir Anda masih mengandung busa. Output dari busa ini selalu sama (lihat contoh).

Jika Anda minum 1 tegukan, Anda harus mengeluarkan gelas bir, diikuti dengan baris baru dan tali Yuck, foam..

Jika Anda minum 1 teguk atau lebih, beerglass Anda seharusnya tidak mengandung busa lagi, tetapi tunjukkan bagian atas gelas Anda. Minum busa dihitung sebagai satu tegukan.

Jika Anda mengambil 6 teguk atau lebih, Anda harus mengeluarkan gelas bir kosong, diikuti dengan baris baru dan tali Burp.

Untuk setiap tegukan yang Anda minum, gelas bir Anda harus menjadi emptier. Seberapa penuh beerglass Anda tergantung pada jumlah gelembung °( °) dalam bir Anda. Untuk setiap tegukan yang Anda minum setelah busa, sederet gelembung harus dilepaskan. Setiap baris bir dapat mengandung minimum 1dan maksimum 5gelembung. Posisi gelembung ini harus 100% acak.

Contohnya

memasukkan

empty input string, or no input at all

keluaran

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

memasukkan

sip sip sip

keluaran

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

memasukkan

sip sip sip sip sip sip sip sip sip sip

keluaran

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

Pastebin ini berisi daftar input dan output. Ingatlah bahwa gelembung di beerglass harus acak!

Mencetak gol

Ini adalah , kode terpendek dalam byte yang menang!

Selamat minum golf!

Bassdrop Cumberwubwubwub
sumber
Anda mungkin ingin mencatat bahwa itu °adalah karakter dengan kode titik 176.
Martin Ender
2
176 dalam Latin-1 dan Unicode, untuk lebih spesifik.
Mego
Apakah baris tambahan pada input kecuali 1 dan 6+ dapat diterima?
ETHproduksi
@ ETHproduk ya. Akan diedit ketika di laptop
Bassdrop Cumberwubwubwub
1
Output mug harus tetap sama. Jumlah gelembung pada setiap baris harus berbeda setiap kali dijalankan. Hanya ada satu gelembung di setiap baris, atau hingga 5. Itu adalah bagian acak dari tantangan
Bassdrop Cumberwubwubwub

Jawaban:

9

Japt , 189 byte

Saya hampir menjadi gila ketika mencoba untuk membuat ini berfungsi dengan baik ...

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:

Cobalah online!

(Catatan: Program ini dibuat untuk versi Japt yang lebih lama, dan saat ini tidak berfungsi di versi terbaru. Untuk menyiasatinya, versi yang lebih lama ditentukan dalam URL. Sayangnya, ini juga berarti kotak kode kanan atas tidak berfungsi.)

Sejauh ini, ini adalah program terpanjang yang pernah saya tulis dalam Japt. Berikut ini rinciannya:

Langkah 1: Buat bagian atas cangkir bir.

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

Jika U adalah string kosong, ini membuat:

  oo  o oo
 oooooooooooo
o

Kalau tidak, ini membuat:

 ____________

Langkah 2: Buat baris tengah cangkir.

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

Ini menghasilkan string sebelumnya ditambah:

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

Langkah 3: Tambahkan gelembung.

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

Pada titik ini, mug terlihat seperti ini:

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

Langkah 4: Tambahkan baris terakhir dan teks opsional.

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

Sekarang semuanya siap untuk dikirim ke keluaran, yang dilakukan secara otomatis. Jika Anda memiliki pertanyaan, jangan ragu untuk bertanya!

Produksi ETH
sumber
Sudah 3 hari. RIP brain
Bassdrop Cumberwubwubwub
@Bas saya sudah menulis sebagian besar kemarin, tapi itu bukan otak saya seperti browser saya yang mati;) Saya akan membuatnya ditulis hari ini.
ETHproduksi
Saya senang otak Anda masih berfungsi, dan saya menantikan untuk melihat penjelasan dari <s> monstrositas </s> ini sepotong kode yang indah
Bassdrop Cumberwubwubwub
1
@Bas Penjelasan sudah siap :-)
ETHproduksi
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`:``)

Penjelasan

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

Uji

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>

pengguna81655
sumber
1

PHP, 277 265 263 byte

Dengan asumsi 1-byte-linebreak. Tambahkan satu ke 14dan 17di 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;

Jalankan dengan -r. jeda baris mungkin perlu keluar.

kerusakan

// 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
sumber
Hai, maaf karena tidak menjawab pertanyaan Anda tepat waktu, tetapi busa harus diperbaiki. Namun, jika itu meningkatkan jumlah byte Anda, saya kira itu mungkin acak juga. Buruk saya karena tidak jelas menentukan, jadi gunakan untuk keuntungan Anda
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Sebenarnya biaya busa acak. Saya baru saja melihat bahwa semua orang telah memperbaikinya ketika saya sedang coding dan menyimpannya secara acak sebagai permulaan.
Titus