ดื่มเบียร์ด้วยตัวเอง


26

มันเป็นวันศุกร์! ซึ่งหมายความว่าถึงเวลาเบียร์แล้ว!
น่าเศร้าที่วันนี้เราจะเล่นเบียร์แทนที่จะดื่ม :(

ท้าทาย

เอาท์พุทเบียร์แล้วดื่ม จำนวนจิบที่คุณเปลี่ยนแปลงการส่งออก

จิบ

โปรแกรมของคุณควรใช้สตริงอินพุตหนึ่งรายการ สายนี้ แต่เพียงผู้เดียวสามารถประกอบด้วยออกจากการตัดแบ่ง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

Pastebinนี้มีรายการของอินพุตและเอาต์พุต โปรดจำไว้ว่าฟองในแผ่นใยแก้วควรเป็นแบบสุ่ม!

เกณฑ์การให้คะแนน

นี่คือรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

มีความสุขกับการเล่นกอล์ฟ!


คุณอาจต้องการที่จะทราบว่า°เป็นตัวละครที่มีรหัสจุดที่ 176
Martin Ender

2
176 ใน Latin-1 และ Unicode จะเฉพาะเจาะจงมากขึ้น
Mego

ขึ้นบรรทัดใหม่ของอินพุตยกเว้น 1 และ 6+ เป็นที่ยอมรับหรือไม่
ETHproductions

@ ETHproductions ใช่ จะแก้ไขในเมื่อบนแล็ปท็อป
Bassdrop Cumberwubwubwub

1
ผลลัพธ์ของ mug ควรยังคงเหมือนเดิม ปริมาณของฟองอากาศในแต่ละบรรทัดควรแตกต่างกันในการวิ่งทุกครั้ง สามารถมีได้เพียงหนึ่งฟองในแต่ละบรรทัดหรือมากถึง 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.

ตอนนี้ทุกอย่างพร้อมที่จะส่งไปยังเอาต์พุตซึ่งจะทำโดยอัตโนมัติ หากคุณมีคำถามใด ๆ อย่าลังเลที่จะถาม!


3 วันแล้ว สมอง RIP
Bassdrop Cumberwubwubwub

@Bas ฉันเขียนมันส่วนใหญ่เมื่อวานนี้ แต่มันไม่ใช่สมองของฉันมากพอ ๆ กับเบราว์เซอร์ที่เสียชีวิต;) ฉันจะเขียนมันในวันนี้
ETHproductions

ฉันดีใจที่สมองของคุณยังคงทำงานได้และฉันหวังว่าจะได้เห็นคำอธิบายของรหัสที่สวยงาม <s> ชิ้นนี้สวยงาม
Bassdrop Cumberwubwubwub

1
@ คำอธิบายพื้นฐานพร้อมแล้ว :-)
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>


1

PHP, 277 265 263 ไบต์

สมมติว่า 1-byte-linebreak เพิ่มหนึ่งไปยัง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;

สวัสดีขออภัยที่ไม่สามารถตอบคำถามของคุณได้ทันเวลา แต่ควรแก้ไขโฟม อย่างไรก็ตามหากมันช่วยเพิ่มจำนวนไบต์ของคุณฉันเดาว่ามันอาจจะสุ่มด้วย ของฉันไม่ดีสำหรับการระบุไม่ชัดเจนดังนั้นใช้มันเพื่อประโยชน์ของคุณ
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub ต้นทุนการสุ่มโฟมจริง ๆ ฉันเพิ่งเห็นว่าทุกคนได้รับการแก้ไขในขณะที่ฉันกำลังเข้ารหัสและเก็บฉันไว้แบบสุ่มเพื่อเริ่มต้น
ติตัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.