เบียร์ 99 ขวด [ปิด]


65

สร้างเบียร์ '99 ขวดบนกำแพง '

ผลลัพธ์ที่ต้องการคือ:

99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.

97 bottles of beer on the wall, 97 bottles of beer.
Take one down and pass it around, 96 bottles of beer on the wall.

96 bottles of beer on the wall, 96 bottles of beer.
Take one down and pass it around, 95 bottles of beer on the wall.

95 bottles of beer on the wall, 95 bottles of beer.
Take one down and pass it around, 94 bottles of beer on the wall.

....

3 bottles of beer on the wall, 3 bottles of beer.
Take one down and pass it around, 2 bottles of beer on the wall.

2 bottles of beer on the wall, 2 bottles of beer.
Take one down and pass it around, 1 bottle of beer on the wall.

1 bottle of beer on the wall, 1 bottle of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.

แสดงวิธีที่คุณจะแก้ปัญหานี้ด้วยภาษาการเขียนโปรแกรมที่คุณชื่นชอบ การใช้ภาษาสร้างสรรค์มากที่สุดชนะ


30
"การใช้ความคิดสร้างสรรค์ส่วนใหญ่" เป็นเรื่องส่วนตัวสำหรับเว็บไซต์ SE ฉันคิดว่า เราควรตั้งเป้าหมายที่จะใช้เกณฑ์วัตถุประสงค์เช่น "รหัสที่สั้นที่สุด"
Chris Jester-Young

5
ยังคงเป็นคำถามที่ดี
Chris Laplante

3
มันควรจะทำงานอย่างไม่มีที่สิ้นสุดหรือไม่? ฉันคิดอย่างนั้น codegolf ยังไม่มีเบียร์ 99 ขวดดังนั้นจึงไม่มีเหตุผลที่จะพูดคุย

1
@Chris - นั่นจะเป็นส่วนที่ยากที่สุดของเว็บไซต์ SE นี้เพราะทุกสิ่งขึ้นอยู่กับความคิดสร้างสรรค์เพราะนั่นเป็นครึ่งหนึ่งของความสนุกในการเขียนโปรแกรมปริศนา ทางออกที่สร้างสรรค์ที่สุดไม่ได้มีประสิทธิภาพมากที่สุดหรือสั้นที่สุดเสมอไป
Nick Berardi

2
@Nick: ฉันได้ยินคุณ ฉันแค่อยากรู้ว่าใครจะสามารถตัดสินได้ว่าวิธีการแก้ปัญหานั้นสร้างสรรค์มาจากการตัดสินใจของคุณหรือไม่ ขึ้นอยู่กับผู้มีสิทธิเลือกตั้ง '? ไม่มีความน่าเชื่อถือเป็นพิเศษ (ไม่มีความผิด) ยกตัวอย่างเช่นความกะทัดรัดจะไม่มีข้อโต้แย้ง --- ไม่มีใครสามารถโต้แย้ง "ความดี" ของ 1-byte stack overflow code golf solution
Chris Jester-Young

คำตอบ:


70

Perl (410 ตัวอักษร)

มีเว็บไซต์ที่อุทิศให้กับการประกวดนี้แล้ว:

หนึ่งในโซลูชั่น Perl จะยากมากที่จะเอาชนะในแง่ของความคิดสร้างสรรค์มันอ่าน:

[bottles.pl]

         $ a =
        "cpuu
       \ bmft p
       \ bg cff
       \ BS "; $ ข
       = "po ui
       \ bf xbm
      \ BM "; $ c ="
      Ypv ublf p
     \ bof epxo qb
   \ btt ju bspvoe ";
  $ a = ~ s / \ n //; $ a = ~
  s / \ s + / / g; $ b = ~
  s / \ n //; $ b = ~
  s / \ s + / / g; $ c = ~
  s / \ n //; $ c = ~
  s / \ s + / / g; $ a = ~
  y / bz / az /; $ b = ~
  tr / bz / az /; $ c = ~
  tr / bz / az /; สำหรับ(
  $ d = 100; $ d> 0; $ d -) {
  พิมพ์ "$ d $ a $ b $ d"
  ; พิมพ์ "$ a, \ n $ c,"
  ; พิมพ์ ($ d-1); พิมพ์
  "$ a $ b. \ n";} $ x =
  "CJC"; $ Y = "dobbz";
  $ Z = "คอม"; พิมพ์ "\ n"
  ; พิมพ์ "- $ x \ @ $ y."
   ; พิมพ์ "$ z \ n \ n";

นี่คือการเชื่อมโยงไปที่ไฟล์ต้นฉบับ


1
การนำเสนอที่ดี แต่สิ่งนี้ไม่ตรงกับคำขอ !!
F. Hauri

รหัส 'rot1' ไม่ใช่ความพยายามที่ทำให้สับสนอย่างที่สุดเท่าที่ฉันเคยเห็น การใช้\bอักขระ 'ลบ' ที่ไม่ต้องการนั้นเป็นเรื่องที่น่าผิดหวังเช่นกัน
primo

100

สมอง (*** 1,509)

ฉันคิดว่าฉันสามารถกล้าหาญนี้คำตอบโดยไม่เพียง แต่ทำให้ 9 ขวดเบียร์แทน 1 แต่ยังโดยการใช้เพียง 7 ตัวอักษรที่แตกต่างกันในรหัส

    +++           +++           +++           [>+           +++           ++>           +++           +++           <<- 
    ]>+           ++>           +++           >++           +++           +++           ++>           +++           +++ 
   +++>+         +++++         +++++         [>+++         >++++         >++++         <<<-]         >->>+         +>+++ 
   +++++         [>+++         +++++         ++++>         +++++         +++++         ++>++         +++++         +++++ 
   >++++         +++++         +++>+         +++++         +++++         +>+++         +++++         +++++         >++++
   +++++         ++++>         +++++         +++++         +++>+         +++++         +++++         ++>++         +++++ 
  ++++++>       +++++++       ++++++>       +++++++       +++++++       >++++++       +++++++       +>+++++       +++++++
  ++>++++       +++++++       +++>+++       +++++++       ++++>++       +++++++       +++++<<       <<<<<<<       <<<<<<<
  <-]>+>+       +>++++>       +++++>+       +++++>>       +>+++>+       +++>+++       +++>+++       ++++>>+       +>+++>+ 
 +++>+++++     >+++++++<     <<<<<<<<<     <<<<<<<<<     <<<<[>[<<     <.>.>>>>.     >>>>>.>>>     >>>>>>.>>     >>..<<<<<
<.<<<<<.>>>   >>>>>>>.<<<   <<<<<<<<<<<   <<<.>>>>>>>   >>>>>>>.<<<   <<<.<<<<<<<   <.>>>>>.>>.   .>>>>>>>>>.   <<<<<<<<<<<
<<<<<.>>>>>   >>>>>>>>>.<   .<<<<<<<<<<   <<<.>>>>>>>   >>>>>>>>>>>   .<<<<<<<<<.   <<.<<<<<<<.   >>>>>>>>>>>   >>>>>>>>>.<
<<<<<<<<<<<   <<<<.>>>>>>   >>..<<<<<<<   <<<<.<.<<<<   <.>.>>>>.>>   >>>.>>>>>>>   >>.>>>>..<<   <<<<.<<<<<.   >>>>>>>>>>.
<<<<<<<<<<<   <<<<<<.>>>>   >>>>>>>>>>.   <<<<<<.<<<<   <<<<.>>>>>.   >>..>>>>>>>   >>.<<<<<<<<   <<<<<<<.<.>   >>>>>>>>>>>
>>>>>>.<<<<   <<<<<<<<<<.   >>>>>>>.<<<   <.<<<<<<<.>   >>>>>>>>>>>   >>.<.<<<<<<   .<<<<<<<.>>   >>>>.>>>>>>   >>.>>>>>>.<
<<<<<<.<<<<   <<<<<<<<<.>   >>>.>>>>>>>   >>.<<<<<<<.   <<<<<<.>>>>   >>>>>>>>>>>   .<<<<<<<<<<   <.>>>>>>>>>   >>>>..<<<<<
<<<<<<<<<<<   <.>>>>>>>>>   >.>>>>>>>>.   <<<<<<<<<<<   <<<<<<<.>>>   >.>>>>>>>>>   >>>.<<.>>>>   >.<<<<<<.<<   <<<<<.<<<<<
.<.<<<<<.>-   .>>>>.>>>>>   .>>>>>>>>>.   >>>>..<<<<<   <.<<<<<.>>>   >>>>>>>.<<<   <<<<<<<<<<<   <<<.>>>>>>>   >>>>>>>.<<<
<<<.<<<<<<<   <.>>>>>.>>.   .>>>>>>>>>.   <<<<<<<<<<<   <<<<<.>>>>>   >>>>>>>>>.<   .<<<<<<<<<<   <<<.>>>>>>>   >>>>>>>>>>>
 .<< < <<<     <<< . <<.     <<< < <<<     .>> > >>>     >>> > >>>     >>> > >>>     .<< < <<<     <<< < <<<     <<< . >>> 
  >> >>>.       .<<< <<       <<<< <.       << . <<       -]+ +++       ++ + ++       << + ++       ++ + ++       +<->>-]

ฉันต้องยอมรับว่ามีข้อผิดพลาดในรหัส (บางทีคุณสามารถหาวิธีแก้ไขให้ฉันได้ไหม?) และมันไม่พิมพ์ประโยคสุดท้ายGo to the store and buy some more, 99 bottles of beer on the wall.แต่นอกเหนือจากนั้นมันทำงานได้เช่นเดียวกับข้อใดข้อหนึ่งของ โปรแกรมที่ทำในภาษาการเขียนโปรแกรมน้องสาวคนอื่น ๆ ดูเหมือนว่าจะใช้


9
คุณมีเพียง 9 ขวดที่นั่น คุณต้องการอีก 90!
Joe Z.

คำร้อง: เปลี่ยนชื่อภาษานี้เป็นbraindrunk?
Cyoce

99

funciton

ฉันเขียนสิ่งนี้เมื่อวันก่อน :) (ภาพหน้าจอ: เริ่มและจบ )

เนื่องจากสิ่งนี้ดูน่าเกลียดใน StackExchange เนื่องจากระยะห่างบรรทัดเพิ่มเติมให้ลองเรียกใช้รหัสต่อไปนี้ในคอนโซล JavaScript ของเบราว์เซอร์ของคุณเพื่อแก้ไขปัญหา: $('pre').css('line-height',1)

                                            ╓┬────╖
     ╔════╗  ┌───╖                          ╟┘99b ║
     ║ −1 ╟──┤ + ╟──┐                       ╙──┬──╜
     ╚════╝  ╘═╤═╝  ├──────────────────────────┴─────────────────────────────┐
     ╔════╗  ┌─┴─╖  │  ╔════════════════════════════════════════════════════╗│
     ║ 99 ╟──┤ ? ╟──┘  ║ 93438979891487426396059469986395555362079573844971 ║│
     ╚════╝  ╘═╤═╝     ║ 71377306928718494179034460561943201885027745835961 ║│
            ┌──┴───╖   ║ 98129935108241412387473531261660077880505710501626 ║│
    ╔════╗  │ 99bp ║   ║ 32694396343717333192558234646820019070451056711    ║│
    ║ 99 ║  ╘══╤═══╝   ╚══════════════════════════╤═════════════════════════╝│
    ╚═╤══╝   ┌─┴─╖                       ┌───╖  ┌─┴─╖  ╔═════════════════╗   │
   ┌──┴──╖   │ ‼ ╟───────────────────────┤ ‼ ╟──┤ ? ╟──╢ 445551776368547 ║   │
   │ 99b ║   ╘═╤═╝┌─────────────────────┐╘═╤═╝  ╘═╤═╝  ║ 925186328623383 ║   │
   ╘══╤══╝     │  │╔═══════════════════╗│  │      │    ║ 851314944882510 ║   │
      │        │  │║ 15177132563375318 ║│  │      │    ║ 812246570019017 ║   │
 ╔════════╗    │  │║ 07655616350359109 ║│  │      │    ║ 240477365113929 ║   │
 ║ 318287 ║    │  │║ 82597577171382437 ║│  │      │    ║ 659548419629671 ║   │
 ║ 023073 ║    │  │║ 18150105146396039 ║│  │      │    ║ 952755268258505 ║   │
 ║ 603558 ║    │  │║ 2022986808360992  ║│  │      │    ║ 759402210908648 ║   │
 ║ 743780 ║    │  │╚══════════╤════════╝│  │      │    ║ 737406010882693 ║   │
 ║ 068900 ║    │  │         ┌─┴─╖ ┌───╖ │  │      │    ║ 018745757193818 ║   │
 ║ 028319 ║    │  │         │ ‼ ╟─┤ ‼ ╟─┘  │      │    ║ 597439618635403 ║   │
 ║ 948400 ║    │  │         ╘═╤═╝ ╘═╤═╝    │      │    ║ 821854707881243 ║   │
 ║ 620075 ║    │  │         ┌─┴─╖   │    ┌─┴─╖    │    ║ 92049082452     ║   │
 ║ 955580 ║    │  └─────┬───┤ ‼ ╟────────┤ ‼ ║    │    ╚═════════════════╝   │
 ║ 347161 ║    │        │   ╘═══╝┌──────┐╘═╤═╝    └─────────────┐            │
 ║ 651333 ║    │   ╔═══╗│┌──────╖│╔════╗│ ╔╧═════════╗          │            │
 ║ 590970 ║    │   ║ 0 ║└┤ 99bp ╟┘║ −1 ║└┐║ 20971566 ║          ├────────────┘
 ║ 678045 ║    │   ╚══╤╝ ╘══════╝ ╚══╤═╝ │╚══════════╝          │
 ║ 336290 ║  ┌─┴─╖  ┌─┴─╖  ┌─────╖  ┌┴──╖├──────────────────────┘
 ║ 721824 ╟──┤ ‼ ╟──┤ ? ╟──┤ 99b ╟──┤ + ║│
 ╚════════╝  ╘═══╝  ╘═╤═╝  ╘═════╝  ╘═╤═╝│    ╓┬──────╖
                      └───────┬───────┘  │    ╟┘ 99bp ║
                              └──────────┘    ╙───┬───╜
 ┌────────────────────────────────────────────────┴──────────────┐
 │╔══════════════════════════════════════════╗╔═══════════╗      │
 │║ 8592134145756414358602136806465202028576 ║║ 232783950 ║      │
 │╚══════════════════════════════╤═══════════╝╚╤══════════╝      │
 │               ┌───╖  ╔═══╗  ┌─┴─╖  ┌───╖  ┌─┴─╖  ┌─────────╖  │
 └───────────────┤ = ╟──╢ 1 ║  │ ‼ ╟──┤ ‼ ╟──┤ ? ╟──┤ int→str ╟──┴┐
                 ╘═╤═╝  ╚═══╝  ╘═╤═╝  ╘═╤═╝  ╘═╤═╝  ╘═════════╝   │
          ╔═══╗  ┌─┴─╖         ┌─┴─╖    │      └──────────────────┘
          ║ 0 ╟──┤ ? ╟─────────┤ ‼ ╟──┐
          ╚═══╝  ╘═╤═╝         ╘═══╝  │
              ╔════╧╗╔════════════════╧════════════════════════════════╗
              ║ 115 ║║ 20338288213193790107412311132593873016630280224 ║
              ╚═════╝╚═════════════════════════════════════════════════╝

1
บวกหนึ่งนี้เป็นที่น่ากลัว
gyurisc

1
ภาษานั้นช่างยอดเยี่ยมมาก!
หยุดหมุนทวนเข็มนาฬิกา

1
ฉันเห็นสิ่งนี้ใน Esolang.org และชอบรูปลักษณ์ของมัน
ML

56

jQuery + FireBug Console

$('code:first').text()

;)


2
สิ่งที่เกี่ยวกับสิ่งที่ต้องการeval($($('code')[8]).text().replace(/print/g,'console.log'))<Del> (aka. ขโมย) </ เดล>? มันพิมพ์เนื้อเพลงทั้งหมดของเพลง : P
JiminP

2
ใช้ได้กับคอนโซล JavaScript ของ Chrome ด้วยเช่นกัน
Spoike

ฉลาดหลักแหลม
Maxpm

1
@JiminP น่าเสียดายที่นั่นไม่ใช่ตัวเลือกที่เสถียรเนื่องจากวิธีการที่คำสั่งตอบสามารถเปลี่ยนแปลงได้ตลอดเวลา (อันที่จริงแล้วมันไม่ทำงานอีกต่อไป)
Muhd

2
@Muhd ยังคงทำงานได้ตราบใดที่คำถามไม่เปลี่ยนแปลง - บล็อกรหัสแรกคือบล็อก
Bob

24

HQ9 + (1 ตัวอักษร)

9

เป็นที่ยอมรับว่าไม่ใช่ภาษาทัวริงที่สมบูรณ์ แต่ก็ยังมีอยู่


13
ทำไมคุณไม่ใช้HQ9 B ? ทัวริงเสร็จสมบูรณ์
Mateen Ulhaq

1
@muntoo ฉันไม่แน่ใจว่า HQ9 + B กำลังจะเสร็จสมบูรณ์ .. คำสั่ง B โพลอินพุตคีย์บอร์ดและประเมินว่าเป็น brainfuck ดังนั้นมันจึงเป็น HQ9 + พร้อมล่าม optonal Brainfuck เช่นโปรแกรม "B" ใน HQ9 + B จะสำรวจความคิดเห็น stdin จนกว่าจะได้รับ! (หรือ EOF) และตีความว่าเป็น brainfuck ..
Sylwester

20

ใครบอกว่า C # มีพิธีมากเกินไป ไม่ว่าจะเป็นใครก็ตามพวกเขาไม่เคยพูดถูก

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _99Bottles
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintSong(99);
        }

        static void PrintSong(int bottleCount)
        {
            Func<int, string> sOrBlank = howMany => howMany > 1 ? "s" : "";

            PrintBottles(howManyBottles =>
            {
                Console.WriteLine("{0} bottle{1} of beer on the wall, {0} bottle{1} of beer.", howManyBottles, sOrBlank(howManyBottles));
                if (howManyBottles > 1)
                {
                    Console.WriteLine("Take one down and pass it around, {0} bottle{1} of beer on the wall.", --howManyBottles, sOrBlank(howManyBottles));
                }
                else
                {
                    Console.WriteLine("Go to the store and buy some more, 99 bottles of beer on the wall.", --howManyBottles);
                }
            },
            bottleCount);
        }

        static void PrintBottles(Action<int> printBottles, int count)
        {
            printBottles(count);

            if (count > 1)
            {
                PrintBottles(printBottles, --count);
            }
         }
    }
}

11
+1 สำหรับการเป็นลูกแกะสไตล์เสียสละ C ในมหาสมุทรเพิร์ล
เกล็นเนลสัน

ที่สามารถลดได้ค่อนข้างมาก
Nellius

2
@Nellius คุณเคยอ่านสิ่งที่ilivewithianพูดก่อนรหัสของเขา?
Daniel Standage

1
@Daniel ใช่และมันก็หมายความว่าเขาคิดว่าทุกอย่างในรหัสของเขาเป็นสิ่งที่จำเป็น ถ้าตั้งใจว่าเป็นเรื่องตลกมันไม่ควรจะลงคะแนนมากขนาดนี้ ไม่สั้นสร้างสรรค์มีประสิทธิภาพหรือแม้แต่ฉลาดเล็กน้อย
Nellius

@Nellius มันไม่ได้มีความหมายว่าเป็นนักสู้ที่จริงจัง แต่ในระดับที่ไม่ได้เป็นรหัสที่ดีนี้ ฉันแน่ใจว่าสามารถลดขนาดลงได้ทำให้มีประสิทธิภาพมากขึ้นและปรับปรุงให้ดีขึ้นโดยทั่วไป
Rob White

18

C

โปรแกรมนี้สร้างข้อความเพลงที่สมบูรณ์เป็นสตริงเดียวโดยใช้ตัวประมวลผลล่วงหน้า รหัส C ที่เกิดขึ้นจริงเพียงแค่ส่งออกสตริงจึงสร้าง การเรียกstringsใช้ไฟล์ปฏิบัติการที่สร้างขึ้นจะแสดงข้อความเพลงที่สมบูรณ์ในไฟล์เรียกทำงาน

#define BOTTLES(n) n " bottles of beer"
#define BOTTLE "1 bottle of beer"
#define OTW " on the wall, "
#define TAKE "Take one down, pass it around, "
#define BUY "Go to the store and buy some more, "
#define STOP "."
#define NL "\n"

#define LINE1(n) BOTTLES(n) OTW BOTTLES(n) STOP NL
#define LINE1A BOTTLE OTW BOTTLE STOP NL
#define LINE2(n) TAKE BOTTLES(n) STOP NL
#define LINE2A TAKE BOTTLE STOP NL
#define LINEX BUY BOTTLES("99") NL

#define MIDDLEPART(n) LINE2(n) NL LINE1(n)
#define MIDDLELAST LINE2A NL LINE1A

#define EIGHT_TO_TWO(S, M) M(S "8") M(S "7") M(S "6") M(S "5") M(S "4") M(S "3") M(S "2")
#define EIGHT_TO_ONE(S, M) EIGHT_TO_TWO(S, M) M(S "1")
#define EIGHT_TO_TWO_AGAIN(S, M) M(S "8") M(S "7") M(S "6") M(S "5") M(S "4") M(S "3") M(S "2")
#define EIGHT_TO_ONE_AGAIN(S, M) EIGHT_TO_TWO_AGAIN(S, M) M(S "1")
#define NINE_TO_TWO(S, M) M(S "9") EIGHT_TO_TWO(S, M)
#define EIGHT_TO_ZERO(S, M) EIGHT_TO_ONE(S, M) M(S "0")
#define NINE_TO_ZERO(S, M) M(S "9") EIGHT_TO_ZERO(S, M)

#define NINETIES EIGHT_TO_ZERO("9", MIDDLEPART)
#define NTIES(n) NINE_TO_ZERO(n, MIDDLEPART)
#define EIGHTIES_TO_TENS EIGHT_TO_ONE_AGAIN("", NTIES)
#define NAUGHTIES NINE_TO_TWO("", MIDDLEPART)

#define SONG LINE1("99") NINETIES EIGHTIES_TO_TENS NAUGHTIES MIDDLELAST LINEX

#include <stdio.h>

int main()
{
  puts(SONG);
  return 0;
}

1
อาจเป็นโซลูชันที่มีประสิทธิภาพและเร็วที่สุดของสิ่งเหล่านี้
Tom Pažourek

1
@tomp TimeWise ที่มีประสิทธิภาพมากในการที่ไม่มีประสิทธิภาพขนาดไฟล์ปฏิบัติการ :)
seequ

14

C # ( 312 310 304 ตัวอักษร)

class P{static void Main(){string b=" bottle",w=" on the wall",o=" of beer",p=".\n",s="s";for(int i=99;i>0;i--)System.Console.Write(i+b+(i>1?s:"")+o+w+", "+i+b+(i>1?s:"")+o+p+(i>1?"Take one down and pass it around, "+(i-1)+b+(i-1>1?s:"")+o+w+p+"\n":"Go to the store and buy some more, "+99+b+s+o+w+p));}}

1
ฉันไม่อยากเชื่อเลยว่าคุณจะได้รับมันสั้นกว่าฉัน ฉันประทับใจ. ฉันจะต้องศึกษาตัวเลือกที่ดีกว่านี้
jcolebrand

และตอนนี้ฉันได้ศึกษาเรื่องนี้ฉันลงไปต่ำกว่า 300;)
jcolebrand

12

C #

ไม่ได้ตั้งใจที่จะสั้น แต่อาจนับว่าเป็นความคิดสร้างสรรค์หรือไม่?

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        Console.WriteLine(string.Join(Environment.NewLine, Enumerable.Range(0, 100).Select(i =>
            string.Format(
                string.Format(
                    "{0} {1} {{3}} {{4}},{{9}}{0} {1} {{3}}.{{9}}{2},{{9}}{3} {4} {{3}} {{4}}.{{9}}",
                    i == 99 ? "{0}" : "{7}",
                    i == 98 ? "{1}" : "{2}",
                    i == 99 ? "{6}" : "{5}",
                    i == 98 ? "{0}" : "{8}",
                    i == 97 ? "{1}" : "{2}"
                ),
                "No",
                "bottle",
                "bottles",
                "of beer",
                "on the wall",
                "Take one down, pass it around",
                "Go to the store, buy some more",
                99 - i,
                (198 - i) % 100,
                Environment.NewLine
        ))));
    }
}

หมายเหตุนี่เป็นเพียงคำสั่งเดียว :)


11

แน่นอนไม่ได้มีคุณสมบัติเป็นโฆษณา แต่มันจะทำจากบรรทัดคำสั่งด้วยคำสั่งเดียว

perl -e '$i=99;while($i>1){print("$i bottles of beer on the wall, $i bottles of beer.\nTake one down and pass it around, ".--$i." bottles of beer on the wall\n\n");}print("1 bottle of beer on the wall, 1 bottle of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n");'

11

Haskell, 272 , 250 , 243 ตัวอักษร

(&)=(++)
b 1=" bottle"
b _=b 1&"s"
w=" on the wall"
p n=show n&b n&" of beer"
f n=putStrLn$p n&w&","&p n&".\n"&c(n-1)
c 0="Go to the store and buy some more, "&p 99&w&"."
c n="Take one down and pass it around, "&p n&w&"\n"
main=mapM f[99,98..1]

11

Windows PowerShell (198)

filter b{"$_ bottle$('s'*!!--$_) of beer"}(99..1|%{($_|b)+($w=' on the wall')+", $($_|b)."
"Take one down and pass it around, $(--$_|b)$w.
"})[0..196]
"Go to the store and buy some more, $(99|b)$w."

ค่อนข้างตรงไปตรงมา

ฉันใช้ตัวกรองสำหรับขวดเบียร์เนื่องจากfunctionยาวขึ้นและการร้องขอต้องใช้วงเล็บในทุกกรณี การตรวจจับพหูพจน์ ( !!--$_) ลดจำนวนขวดแรกลงหนึ่งอัน (ดังนั้นพหูพจน์คืออะไรที่ไม่ใช่ศูนย์), ปลดมันเป็นบูลีนและลบล้างมันด้วยอันดับแรก!และปฏิเสธมันอีกครั้งดังนั้นตอนนี้เรามีบูลีนอธิบายว่าจำนวนต้องการพหูพจน์ หรือไม่. นี่จะถูกส่งไปยังจำนวนเต็มทันทีเมื่อคูณสตริง

ตัวแบ่งบรรทัดแบบอินไลน์สนุก

วางไข่มากกว่าที่จำเป็นและตัดทอนหลังจากนั้นเช่นกัน


สั้นแน่นอนและนี่เป็นบาร์ที่จะลองและเข้าไปข้างใต้ !!! แม้ว่าจากมุมมองของฉันการปรากฏตัวของ "หมายเลขเวทมนตร์" เช่น 196 นั้นอยู่ในชั้นเรียนของสิ่งต่าง ๆ ที่ฉันหวังว่าจะสามารถหลีกเลี่ยงได้เพราะมันจับ (99 * 2) -2 สำหรับคำตอบที่คุณสามารถเปลี่ยนขวดได้ นับในที่เดียว :) ดูcodegolf.stackexchange.com/questions/2/99-bottles-of-beer/ ......
Dr. Rebmu

คุณไม่มี "กำแพง" ในบรรทัดสุดท้ายของการส่งออกและหลังจากทุกขวดถูกนำตัวลง
Iszi

filter b{"$_ bottle$('s'*!!--$_) of beer"}(99..1|%{($_|b)+($w=' on the wall')+", $($_|b).";"Take one down and pass it around, $(--$_|b)$w. "})[0..196];"Go to the store and buy some more, $(99|b) $w."แก้ไขที่ รวม 199 ตัวอักษร (เพิ่มตัวแบ่งบรรทัดหลังจาก$wก่อน")
Iszi

ขอบคุณสำหรับการแก้ไข มีพื้นที่เหลือเฟือในนั้นด้วยดังนั้นการนับเป็น 198 แทน
Joey

10

Curl 19 ตัวอักษร

(ต้องใช้การเชื่อมต่ออินเทอร์เน็ต)

curl -L j.mp/eGv9K5

7
ฉันคิดว่านี่มันยืดเกินไป
marcog

8
ฉันคิดว่ามันเป็นเรื่องตลก โซลูชันจำนวนมากสามารถซ่อนอยู่หลังแบบสอบถามไปยังเว็บเซิร์ฟเวอร์
Alexandru

3
ฉันชอบอันนี้
pimvdb

1
หากวัตถุประสงค์เป็นรหัสที่สั้นที่สุดฉันจะให้ประเด็นความฉลาดแก่คุณ
Neil

9

anti-golf ที่ถูกต้องเกือบจากโปรแกรมเมอร์ C ตัวใหม่ที่กำลังเรียนรู้ Perl?

#!/usr/bin/perl
#      ^
#      |
#      |
# That's the Perl interpreter.
# You might need to change this line based on
# your Linux/Unix distribution.

# Pragmas for debugging!
use strict;
use warnings;

# Library dependencies...none! lolz

# Main implementation
my $number_of_bottles_of_beer_on_the_wall = 99; #start with 99 bottles
LOOP: while( $number_of_bottles_of_beer_on_the_wall > 0 )
{
  printf( "%d bottles of beer on the wall, %d bottles of beer\n",
          $number_of_bottles_of_beer_on_the_wall,
          $number_of_bottles_of_beer_on_the_wall,                  );

  if( $number_of_bottles_of_beer_on_the_wall > 1 )
  {
    $number_of_bottles_of_beer_on_the_wall -= 1;
    printf( "Take one down and pass it around, %d bottles of beer on the wall.\n\n",
            $number_of_bottles_of_beer_on_the_wall,                               );
  }
  else
  {
    printf( "Go to the store and buy some more, %d bottles of beer on the wall\n",
            99                                                                     );
    last LOOP;
  }
}

ทำไมไม่/usr/bin/env perl?
nyuszika7h

1
@ nyuszika7h คำวิจารณ์ที่น่าเข้าใจ! ;)
Daniel Standage

8

JavaScript ( 216 228 215)

for(a=99,c=" on the wall";a;)document.write((d=eval(b="(a||99)+' bottle'+(a-1?'s':'')+' of beer'"))+c+", "+d+".<br>"+(--a?"Take one down and pass it around, ":"Go to the store and buy some more, ")+eval(b)+c+".<p>")

แก้ไข: มีเบียร์ "1 ขวด" เพียงขวดเดียวในรุ่นเริ่มต้นรุ่นที่ 3 ถูกเขียนใหม่อย่างสมบูรณ์สังเกตเทคนิคยอดเยี่ยมที่(a||99)จะได้ 99 ในบรรทัดสุดท้าย(a-1?'s':'')ทำให้เป็นพหูพจน์สำหรับทุกกรณี แต่a==1ไม่จำเป็นต้องสิ้นเปลือง==และตั้งค่า ของbภายในคำสั่งที่จะใช้


ดูเหมือนว่าการเพิ่มประสิทธิภาพขวด / ขวดของคุณต้องเสียค่าใช้จ่ายมากกว่าที่จะประหยัด
Yahel

ฉันไม่แน่ใจว่าคุณหมายถึงอะไรคุณจะเปลี่ยนแปลงอะไร
aaaaaaaaaaaa

หนึ่งนี้หยุดหนึ่งกลอนเร็วเกินไป กลอนสุดท้ายควรไป"no more bottles of beer on the wall, no more bottles..." - ดู: 99-bottles-of-beer.net/lyrics.html
MárÖrlygsson

BTW ฉันจัดการเวอร์ชันที่ถูกต้องทั้งหมด 233 ไบต์: for(o,e,n=100,t=" on the wall";n-->-1;)o=e+t+", "+e+".<br>"+(n>-1?"Take one down, pass it around, ":"Go to the store and buy some more, ")+(e=(0>n?99:n||"no more")+" bottle"+(1!=n?"s":"")+" of beer")+t+".<p>",99>n&&document.write(o)
MárÖrlygsson

@ MárÖrlygssonยินดีต้อนรับสู่เว็บไซต์ เนื้อเพลงของการท้าทายนี้ถูกกำหนดในโพสต์เปิด
aaaaaaaaaaaa

7

C

ฉันต้องพลาดคำถามนี้ไปดังนั้นนี่เป็นรุ่นที่ฉันโพสต์เป็นคำตอบที่อื่น มันเป็นรุ่นที่ใช้ C quine รวบรวมและเรียกใช้เพื่อรับเพลงบรรทัดถัดไป ทำซ้ำจนกว่าจะเบื่อ หากโค้ดแจ้งว่า "Time to go ... " ให้ป้อนจำนวนเบียร์ในครั้งต่อไปที่คุณเรียกใช้เป็นอาร์กิวเมนต์บรรทัดคำสั่ง

// Time to go to the shop and get some beer
//
//
//
//
// #####.#####.#####.#####.#####.#####.#####
// ##.#####.#####.#####.#####.#####.#####.##
// #####.#####.#####.#####.#####.#####.#####
// ##.#####.#####.#####.#####.#####.#####.##

char *z [] = {
"void l(char *s,int b){int i;printf(\"// \");for(i=0;i<b;++i)printf(s);",
"printf(\"\\n\");}\nint main(int argc, char *argv[]){\nint i,j,k,x=%d;",
"char*p;\nif(!x&&argc==2)x=atoi(argv[1]);\nif(!x){printf(\"// Time to ",
"go to the shop and get some beer\\n//\\n//\\n//\\n//\\n\");k=7;\n",
"}else{printf(\"// %%d bottles of beer on the wall, %%d bottles of beer",
".\\n\",x,x);printf(\"// Take one down and pass it round, \");\n",
"if(x>1)printf(\"%%d bottles of beer on the wall.\\n//\\n\",x-1);\n",
"else printf(\"no more bottles of beer on the wall.\\n//\\n\");\n",
"k=x>2?x:2;l(\"  ^   \",x);l(\" / \\\\  \",x);l(\"/   \\\\ \",x);",
"l(\"|   | \",x);l(\"|Duf| \",x);l(\"|   | \",x);l(\"----- \",x);}\n",
"for(i=0;i<4;++i){\nprintf(\"// %%s\", i&1 ? \"##.\" : \"\");\n",
"for(j=i&1;j<k;++j)\nprintf(\"%%s#####\",j!=(i&1)?\".\":\"\");\n",
"printf(\"%%s\\n\",i&1?\".##\":\"\");}\nprintf(\"\\nchar *z [] = {\\n\");\n",
"for(i=0;i<sizeof z/sizeof z[0];++i){\nprintf(\"\\\"\");\n",
"for(p=z[i];*p;++p)\nswitch (*p){\ncase '\\n':printf(\"\\\\n\");break;\n",
"case '\\\\':printf(\"%%c%%c\",92,92);break;\n",
"case '%%':printf(\"%%c\",37);break;\ncase '\"':printf(\"%%c%%c\",92,'\"');break;\n",
"default:printf(\"%%c\", *p);break;}\nprintf(\"\\\",\\n\");}\n",
"printf(\"};\\n\");\nfor(i=0;i<sizeof z/sizeof z[0];++i)\n",
"printf(z[i],x?x-1:0);}\n",
};
void l(char *s,int b){int i;printf("// ");for(i=0;i<b;++i)printf(s);printf("\n");}
int main(int argc, char *argv[]){
int i,j,k,x=0;char*p;
if(!x&&argc==2)x=atoi(argv[1]);
if(!x){printf("// Time to go to the shop and get some beer\n//\n//\n//\n//\n");k=7;
}else{printf("// %d bottles of beer on the wall, %d bottles of beer.\n",x,x);printf("// Take one down and pass it round, ");
if(x>1)printf("%d bottles of beer on the wall.\n//\n",x-1);
else printf("no more bottles of beer on the wall.\n//\n");
k=x>2?x:2;l("  ^   ",x);l(" / \\  ",x);l("/   \\ ",x);l("|   | ",x);l("|Duf| ",x);l("|   | ",x);l("----- ",x);}
for(i=0;i<4;++i){
printf("// %s", i&1 ? "##." : "");
for(j=i&1;j<k;++j)
printf("%s#####",j!=(i&1)?".":"");
printf("%s\n",i&1?".##":"");}
printf("\nchar *z [] = {\n");
for(i=0;i<sizeof z/sizeof z[0];++i){
printf("\"");
for(p=z[i];*p;++p)
switch (*p){
case '\n':printf("\\n");break;
case '\\':printf("%c%c",92,92);break;
case '%':printf("%c",37);break;
case '"':printf("%c%c",92,'"');break;
default:printf("%c", *p);break;}
printf("\",\n");}
printf("};\n");
for(i=0;i<sizeof z/sizeof z[0];++i)
printf(z[i],x?x-1:0);}

@DreamWarrior เกี่ยวกับการแก้ไขที่เสนอของคุณคุณได้พิจารณาใส่รหัสของคุณใน pastebin เพื่อให้คุณสามารถโพสต์เป็นความคิดเห็นได้หรือไม่?
nderscore

6

Javascript (285)

นี่ถือว่ามีฟังก์ชันที่เรียกว่า print เพื่อส่งออกสตริง

b=' of beer on the wall';n=100;while(--n>1)if(n>1)print(n+" bottles"+b+', '+n+" bottles of beer.\nTake one down and pass it around, "+(n-1)+' bottle'+(n-1>1?'s':'')+b+'.\n\n');print("1 bottle"+b+", 1 bottle of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.")

8
ฉันไม่แน่ใจว่าฟังก์ชั่นสันนิษฐานนั้นยุติธรรม b();ตัวอย่างเช่นโปรแกรมของฉันอาจจะ สมมติว่ามีฟังก์ชั่นb()ที่พิมพ์เบียร์ได้ 99 ขวดบนผนัง :)
Chris Laplante

10
Javascript ไม่มีวิธีมาตรฐานในการส่งออกสตริงหากคุณใช้งานในเบราว์เซอร์ก็จะไม่มีฟังก์ชั่นการพิมพ์หากคุณใช้งานในแรด

2
document.writelnโรงงาน
Chris Laplante

4
... สำหรับเบราว์เซอร์

5
JavaScript มี IO ด้วย: alertเป็นเอาต์พุตpromptเป็นอินพุตตัวแปรและconfirmอินพุตบูลีน พวกเขาดูดเท่าที่ UI ไป แต่พวกเขาเป็นฟังก์ชั่นการปิดกั้นมาตรฐาน IO alertและprintมีความยาวเท่ากันดังนั้นรหัสของคุณควรจะเท่ากัน
zzzzBov

6

โครงการ (270)

ไม่มีช่องว่าง:

(let l((i 99))(let((b" bottle")(c" on the wall")(d"Take one down and pass it around,")(e".\n")(f", ")(g" of beer"))(if(= i 1)(map display`(1,b,g,c,f,1,b,g,e"Go to the store and buy some more, 99",b,c,e))(begin(map display`(,i,b,g,c,f,i,b,e,d,i,b,c,e"\n"))(l(-1+ i))))))

ด้วยช่องว่าง:

    (let l ((i 99))
      (let ((b" bottle")
            (c" on the wall")
            (d"Take one down and pass it around, ")
            (e".\n")
            (f", ")
            (g" of beer"))
        (if (= i 1)
            (map display`(1 ,b ,g ,c ,f ,1 ,b ,g ,e
                          "Go to the store and buy some more, 99" ,b ,c ,e))
            (begin (map display `(,i ,b ,g ,c ,f ,i ,b ,e ,d ,i ,b ,c ,e "\n"))
                   (l (-1+ i))))))

6

Python - มาก

Amidoinitrite?

print"""99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.

97 bottles of beer on the wall, 97 bottles of beer.
Take one down and pass it around, 96 bottles of beer on the wall.

96 bottles of beer on the wall, 96 bottles of beer.
Take one down and pass it around, 95 bottles of beer on the wall.

95 bottles of beer on the wall, 95 bottles of beer.
Take one down and pass it around, 94 bottles of beer on the wall.

....

  Ok, this is stupid. First of all, what the brainfuck are the bottles doing on the wall? They're not spiders nor picture frames. And how are they sitting on the wall?

94 bottles of beer on the wall, 9.. oops, they fell down. 94 bottles of beer on the floor, 94 bottles of beer.

  Second.. who the HQ9+ wants to keep track? I think I lost count after drinking the 2nd one...

Take one ... um... up, and pass it around,  .....  er.. a lot of bottles of beer still on the floor.

  Fourthly, what's with this passing around scheme? They're not j..I mean letters, yeah, or boxes of chocolate. We all can just take one and drink it. It's healthier too.

A pile of bottles of beer on the floor, a pile of bottles of beer.
Everyone take one up and drink it, still a whole bunch of bottles of beer on the floor.

  Um.. seventhly, are we really that many in this assembly that we can finish 200 or however many bottles we had in the beginning? Without passing out?

Go to the store and buy some more

  Yeah and who's gonna pay for it? Definitely not me. And how are you going to bring 300 bottles back from the store?
  In your car? Buddy, you're so drunk, you can't even C anything. Go home dude, go home. Take a cab."""

ข้อมูลอ้างอิงเพิ่มเติม (ช่วยฉันได้มากด้วยรหัส): http://www.youtube.com/watch?v=Y0Z0raWIHXk


5

Python (318)

ฉันพบวิธีทำให้โปรแกรม Python สั้นลง :)

exec'eJxtjrFqwzAQQHd/xVVgLCVqSbq5RHO2TtlcgyX7Qk3luyAphP59ZA0thGzi9O7es0bUERyn5DE/+AwOMdTxi0TljLeLmyzQB4GlaaCBg/hkWDigqMb/76aZz0CHHaCPCLaWTpLSTWw2kl7MXmkBTJC+EW7Wey3U9hmzzqU42R/MNMLEt6KFi40R5gQ28JUmndO0ODIkLhdjyjWFc9dfiLxg6Vsx1ZExu36Vddn2miVD2w59R4d9/6d+f8h7Wze3Y+GrS5gpwSjbVlV3Y1BZCg=='.decode('base64').decode('zip')

สิ่ง. decode.decode นี้ดูโง่สำหรับฉันในครั้งแรกที่ฉันเห็น แต่ตอนนี้ฉันใช้เพื่อการปฏิบัติ (เพื่อป๋อโค้ดไพ ธ อนลงใน. bashrc ของฉันเป็นฟังก์ชั่นในแบบที่ไม่เป็นการรบกวน)
ixtmixilix

5
ฉันนับว่ารหัสที่ไม่มีการบีบอัดมี 300 ตัวอักษร ทำไมบีบอัดมันแล้ว?
Johannes Kuhn

5

Rebmu - 167 ตัวอักษร

M N 99 Bdz[cb[n{ bottle}egN 1{s}{}{ of beer}]]loN[cb[b W{ on the wall}C{, }b P{.}lfEZ--n[Nm{Go to the store and buy some more}]{Take one down and pass it around}cBwPlf]]

อาจโกนหนวดออกไปสองสามตัวนี่เป็นครั้งแรกที่คุณลอง :)

นี่คือRebol ที่เทียบเท่าซึ่งมีการจดชวเลขและต้ม ยังคงมีการแข่งขันค่อนข้างสูงโดยเฉพาะเมื่อพิจารณาความชัดเจน:

m: n: 99

b: does [
    combine [n { bottle} either n > 1 {s} {} { of beer}]
]

loop n [
    print combine [
        b w: { on the wall} c: {, } b p: {.} newline

        either 0 == -- n [
            n: m
            {Go to the store and buy some more}
        ] [
            {Take one down, and pass it around}
        ]

        c b w p newline
    ]
]

รหัสแหล่งความเห็นพร้อมใช้งานบน GitHub


5

PHP: 285 240 233 231 ตัวละคร

$i=99;$b=" bottles of beer";$o=" bottle of beer";$c=" on the wall";while($i>1){echo"$i$b$c, $i$b.\nTake one down and pass it around, ".--$i.(($i>1)?$b:$o).$c.".\n\n";}echo"$i$o$c, $i$o.\nGo to the store and buy some more, 99$b$c.";

เอาท์พุทที่นี่: http://ideone.com/5fQmcd


4

Python 241 ตัวอักษร

s=""
i=99
b="%d bottl%s of beer"
w=" on the wall"
t="Take one down and pass it around, "
p=q="es"
while i:s+=b%(i,p)+w+", "+b%(i,p)+".\n";i-=1;p=p[:i];s+=t+b%(i,p)+w+".\n\n"
print s[:-64]+"Go to the store and buy some more, "+b%(99,q)+w+"."

4

Ruby ขนาด 274 ไบต์

ยังใหม่กับทับทิมอยู่จริงๆแค่เล่นไปเรื่อย ๆ

o =" bottles of beer";w=" on the wall";t="Take one down and pass it around, ";s=" bottle of beer"
99.downto(3){|b|puts"#{b}#{o+w}, #{b}#{o}.\n#{t}#{b-1}#{o+w}.\n\n"}
puts"2 #{o+w}, 2 #{o}.\n#{t}1#{s}#{w}.\n\n1#{s+w}, 1#{s}.\nGo to the store and buy some more, 99#{o+w}."

4

C # (299 ตัวอักษร)

using System;class D{static void Main(){string a="s",z="",w=" on the wall",q=", ",p=".\n",b=" bottle",c=" of beer";for(int O=99;O>=1;)Console.WriteLine(O+b+(O>1?a:z)+c+w+q+O+b+(O>1?a:z)+c+p+(--O>0?"Take one down and pass it around, "+O:"Go to the store and buy some more, 99")+b+(O==1?z:a)+c+w+p);}}

1
บรรทัดสุดท้ายของคุณแสดง "99 ขวด" แทน "99 ขวด" และคุณมีวงวนของคุณเริ่มต้นจาก 19 แทน 99 (แม้ว่ามันอาจจะเป็นแค่การกำกับดูแล)
Nellius

@Nellius ~ แก้ไขแล้ว ~ และต้องขอบคุณรหัสการแข่งขันของคุณฉันกลับไปที่เหมืองและลบบล็อกแทรกเดี่ยวและลดค่าคงที่ที่มีอยู่ก่อนหน้านี้ในรหัสของฉันเอง ตอนนี้ต่ำกว่า 300 อย่างราบรื่น
jcolebrand

คุณสามารถทำให้มันลดลงเหลือ 293 โดยปล่อย "using System;" และเปลี่ยน "Console.WriteLine" เป็น "System.Console.WriteLine"
ทดสอบ 101

@ Tester101 ~ โทรได้ดี ไม่ได้คิดอย่างนั้น!
jcolebrand

4

จาวาสคริปต์ (7 ฟังก์ชั่น)

ไม่เล่นกอล์ฟ นี่เป็นจุดประสงค์ของการใช้งานฟังเพลงเป็นส่วนใหญ่

function firstUpper(s) {
    return s.slice(0, 1).toUpperCase() + s.slice(1);
}

function bottles(x) {
    return (x || "no more") + " " + (x == 1 ? "bottle" : "bottles") + " of beer";
}

function wall(x) {
    return bottles(x) + " on the wall";
}

function line1(x) {
    return wall(x) + ", " + bottles(x) + ".";
}

function line2(x, max) {
     return (x ? "take one down and pass it around, " + wall(x - 1) : "go to the store and buy some more, " + wall(max)) + ".";
}

function verse(x, max) {
    return [line1(x), line2(x, max)].map(firstUpper).join("\n") + "\n\n";
}


function song(max) {
    var text = "";
    for(var x = max; x >= 0; x--) {
        text += verse(x, max);
    }
    return text;
}

print(song(99));

4

ไป (263)

package main
import "fmt"
func main(){b,i,e,r:=fmt.Println,99,"bottles","of beer on the wall"
for i>0{b(i,e,r+",",i,e,r[:7]+".")
if i--;i<2{e=e[:6]}
if i>0{b("Take one down and pass it around,",i,e,r+`.
`)}}
b("Go to the store and buy some more,",99,e+"s",r+".")}

3

PHP - 252 ไบต์

$a=" bottles of beer";$b=str_replace("s","",$a);$c=" on the wall";for($i=98;$i;)echo($j=$i+1).$a.$c.", ".$j.$a.".
Take one down and pass it around, ".$i.($i-->1?$a:$b).$c.".

";echo"1".$b.$c.", 1".$b.".
Go to the store and buy some more, 99".$a.$c.".";

ฉันหวังว่าฉันจะบีบอัดอีกในวันพรุ่งนี้


3

ทับทิม 1.9.2p136: 223

ฉันไม่ใช่คนขี้ขลาดคุณสามารถอ่านของฉันได้หน้า

b="%d bottle%s of beer"
w=' on the wall'
99.downto(1){|z|s=b%[z,z>1?'s':'']
puts s+w+", "+s+".
"+(z>1?"Take one down and pass it around, "+b%[z-1,z>2?'s':'']+w+".

" :'Go to the store and buy some more, '+b%[99,'s']+w+".")}

3

(Oracle) SQL

ไม่มีการนับตัวละครฉันไม่ได้เล่นกอล์ฟ เพิ่งพบสิ่งนี้เป็นวิธีที่สนุกที่จะทำ

WITH
   bottles AS (
      SELECT LEVEL - 1 AS bottle 
      FROM dual
      CONNECT BY LEVEL <= &number_of_bottles + 1
   ),
   fragments AS (
      SELECT
         'no more ' AS none,
         'bottles of beer' AS supply,
         ' on the wall' AS wall,
         'Take one down and pass it around' AS drink,
         'Go to the store and buy some more' AS refill,
         CHR(13) || CHR(10) AS newline
      FROM dual
   ),
   combined AS (
      SELECT
         b.bottle,
         DECODE(
            b.bottle, 
            1, b.bottle || ' ' || REPLACE(f.supply, 's'),
            0, f.none || f.supply,  
            b.bottle || ' ' || f.supply
         ) AS supply
      FROM bottles b
      CROSS JOIN fragments f

   ),
   two_lines AS (
      SELECT LEVEL AS line
      FROM dual
      CONNECT BY LEVEL <= 2
   )
SELECT
   CASE l.line
      WHEN 1 THEN REPLACE(c1.supply, 'n', 'N') || f.wall || ', ' || c1.supply || '.'
      WHEN 2 THEN DECODE(b.bottle, 0, f.refill, f.drink) || ', '  || c2.supply || f.wall || '.' 
   END AS song 
FROM bottles b
LEFT JOIN combined c1 ON (c1.bottle = b.bottle)
LEFT JOIN combined c2 ON (c2.bottle = DECODE(b.bottle - 1, -1, &number_of_bottles, b.bottle - 1))
CROSS JOIN two_lines l
CROSS JOIN fragments f
ORDER BY
   b.bottle DESC,
   l.line;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.