99 chai bia [đóng cửa]


65

Tái tạo '99 chai bia trên tường '.

Đầu ra mong muốn là đây:

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.

Chỉ cho tôi cách bạn sẽ giải quyết điều này với ngôn ngữ lập trình yêu thích của bạn. Hầu hết sử dụng sáng tạo của một ngôn ngữ chiến thắng.


30
"Hầu hết sử dụng sáng tạo" là quá chủ quan cho một trang web SE, tôi nghĩ. Chúng ta nên đặt mục tiêu sử dụng các tiêu chí khách quan, chẳng hạn như "mã ngắn nhất".
Chris Jester-Young

5
Vẫn là một câu hỏi hay
Chris Laplante

3
Có phải nó sẽ chạy vô tận? Tôi giả sử như vậy. Ngoài ra codegolf không sở hữu 99 chai bia nên không có lý do gì để thảo luận về nó.

1
@Chris - Đó sẽ là phần khó nhất của trang SE này, bởi vì toàn bộ điều này dựa trên sự sáng tạo, bởi vì đó là một nửa niềm vui của các câu đố lập trình. Giải pháp sáng tạo nhất không phải lúc nào cũng hiệu quả nhất hoặc ngắn nhất.
Nick Berardi

2
@Nick: Tôi nghe bạn. Tôi chỉ muốn biết làm thế nào người ta có thể xác định một giải pháp sáng tạo như thế nào --- dựa trên phán đoán của riêng bạn? Dựa vào cử tri? Không phải là đặc biệt đáng tin cậy (không có hành vi phạm tội). Một cái gì đó như sự ngắn gọn là không thể chối cãi --- ví dụ, không ai có thể tranh cãi về "tính tốt" của giải pháp chơi gôn mã ngăn xếp 1 byte.
Chris Jester-Young

Câu trả lời:


70

Perl (410 ký tự)

Đã có một trang web dành riêng cho cuộc thi này:

Một trong những giải pháp Perl sẽ rất khó đánh bại về mặt sáng tạo, nó đọc:

[chai.pl]

         $ a =
        "cpuu
       \ bmft p
       \ bg cff
       \ bs "; $ b
       = "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 /; cho (
  $ d = 100; $ d> 0; $ d -) {
  in "$ d $ a $ b $ d"
  ; in "$ a, \ n $ c,"
  ; in ($ d-1); in
  "$ a $ b. \ n";} $ x =
  "Cjc"; $ y = "dobbz";
  $ z = "com"; in "\ n"
  ; in "- $ x \ @ $ y."
   ; in "$ z \ n \ n";

Đây là liên kết đến tập tin gốc .


1
Trình bày đẹp, nhưng điều này không phù hợp với yêu cầu !!
F. Hauri

Mật mã 'rot1', không phải là nỗ lực tốt nhất trong việc xáo trộn mà tôi đã thấy. Việc sử dụng \bđể 'loại bỏ' các ký tự không mong muốn cũng gây ra một chút thất vọng.
primo

100

Brainf *** (1,509)

Tôi hình dung rằng tôi có thể thực hiện câu trả lời này bằng cách không chỉ tạo ra 9 chai bia thay vì 1 mà còn bằng cách sử dụng 7 ký tự khác nhau trong mã.

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

Tôi phải thừa nhận mặc dù, có một lỗi trong mã (có lẽ bạn có thể tìm ra cách khắc phục nó cho tôi?) Và nó không in câu cuối cùng, Go to the store and buy some more, 99 bottles of beer on the wall.nhưng ngoài ra, nó hoạt động tốt như bất kỳ các chương trình được thực hiện trong các ngôn ngữ lập trình sissy mà mọi người khác dường như thích sử dụng.


9
Bạn chỉ có 9 chai ở đó. Bạn cần thêm 90!
Joe Z.

Đơn khởi kiện: đổi tên ngôn ngữ này thành braindrunk?
Cyoce

99

Chức năng

Tôi đã viết điều này chỉ ngày khác. :) (Ảnh chụp màn hình: bắt đầukết thúc )

Vì điều này trông xấu trong StackExchange do khoảng cách dòng bổ sung, hãy xem xét việc chạy đoạn mã sau trong bảng điều khiển JavaScript của trình duyệt của bạn để khắc phục điều đó: $('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
cộng với một, điều này thật tuyệt vời
gyurisc

1
Ngôn ngữ đó thật tuyệt vời, công việc tuyệt vời!
đã ngừng quay ngược chiều

1
Tôi đã thấy điều này trên Esolang.org và thích giao diện của nó.
ML

56

Bảng điều khiển jQuery + FireBug

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

;)


2
Điều gì về một cái gì đó như eval($($('code')[8]).text().replace(/print/g,'console.log'))<del> (còn gọi là ăn cắp) </ del>? Nó in toàn bộ lời bài hát. : P
JiminP

2
Cũng hoạt động trên bảng điều khiển javascript của Chrome.
Spoike

Quỷ dữ thông minh.
Tối đa

1
@JiminP Thật không may, đó không phải là một bộ chọn ổn định cho biết thứ tự câu trả lời có thể thay đổi theo thời gian như thế nào (thực tế, nó không còn hoạt động nữa).
Muhd

2
@Muhd Vẫn hoạt động miễn là câu hỏi không thay đổi - khối mã đầu tiên là câu hỏi trong câu hỏi.
Bob

24

HQ9 + (1 ký tự)

9

Phải thừa nhận rằng nó không phải là ngôn ngữ hoàn chỉnh Turing, nhưng điều này vẫn được tính


13
Tại sao bạn không sử dụng HQ9 B ? Nó đã hoàn thành.
Mateen Ulhaq

1
@muntoo Tôi không chắc HQ9 + B đã hoàn tất chưa .. Lệnh B thăm dò đầu vào bàn phím và đánh giá rằng đó là Brainfuck vì vậy đó là HQ9 + với trình thông dịch Brainfuck optonal. tức là chương trình "B" trong HQ9 + B sẽ thăm dò ý kiến ​​cho đến khi được! (hoặc EOF) và giải thích rằng là Brainfuck ..
Sylwester

20

Ai nói C # có quá nhiều buổi lễ? Dù đó là ai, họ chưa bao giờ đúng như vậy.

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 Vì là một con cừu hiến tế kiểu C khác trong đại dương Perl.
Glenn Nelson

Điều đó có thể được giảm khá đáng kể.
Nellius

2
@Nellius Bạn thậm chí đã đọc những gì ilivewithiannói trước mã của mình?
Daniel Standage

1
@Daniel Có, và nó ngụ ý rằng anh ấy nghĩ rằng mọi thứ trong mã của mình là cần thiết. Nếu có ý nghĩa như một trò đùa, nó không nên được bình chọn nhiều như vậy. Nó không ngắn, sáng tạo, hiệu quả, hoặc thậm chí hơi thông minh.
Nellius

@Nellius Nó không có nghĩa là một ứng cử viên nghiêm túc, không có cấp độ nào là mã tốt này. Tôi chắc chắn rằng nó có thể được giảm, làm cho hiệu quả hơn và thường được cải thiện đáng kể.
Rob White

18

C

Chương trình này đang tạo văn bản bài hát hoàn chỉnh dưới dạng một chuỗi bằng bộ tiền xử lý. Mã C thực tế chỉ xuất ra chuỗi do đó được xây dựng. Gọi stringsvào thực thi được tạo sẽ tiết lộ văn bản bài hát hoàn chỉnh trong thực thi.

#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
Có lẽ là giải pháp hiệu quả nhất và nhanh nhất trong số này.
Tom Pažourek

1
@tomp Thời gian hiệu quả, rất không hiệu quả trong kích thước tệp thực thi :)
xem

14

C # ( 312 310 304 ký tự)

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
Tôi không thể tin rằng bạn có nó ngắn hơn tôi. Tôi rất ấn tượng. Tôi sẽ phải nghiên cứu để có một bộ tùy chọn tốt hơn
jcolebrand

Và bây giờ tôi đã nghiên cứu về nó, tôi xuống dưới 300;)
jcolebrand

12

C #

Không có ý định ngắn, nhưng có lẽ điều này được coi là sáng tạo?

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
        ))));
    }
}

Lưu ý đây chỉ là một tuyên bố duy nhất :)


11

Chắc chắn không đủ điều kiện là sáng tạo, nhưng nó được thực hiện từ dòng lệnh bằng một lệnh duy nhất.

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 ký tự

(&)=(++)
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."

Khá đơn giản.

Tôi đang sử dụng bộ lọc cho các chai bia, vì functionnó dài hơn và cần có dấu ngoặc đơn trong mọi trường hợp. Phát hiện số nhiều ( !!--$_) trước tiên làm giảm số lượng chai theo một (vì vậy số nhiều là số khác không), biến nó thành boolean và phủ định nó với số đầu tiên !và phủ định lại một lần nữa để bây giờ chúng ta có một số boolean mô tả xem số đó có cần số nhiều không hay không. Điều này sau đó được ngầm định thành một số nguyên khi nhân chuỗi.

Ngắt dòng nội tuyến là niềm vui.

Sinh ra nhiều dòng hơn mức cần thiết và cắt giảm sau đó, quá.


Chắc chắn là ngắn, và điều này đặt ra một thanh để thử và đi theo !!! Mặc dù theo quan điểm của tôi, sự xuất hiện của một "số ma thuật" như 196 là trong lớp những điều tôi hy vọng có thể tránh được vì nó chụp (99 * 2) - 2. Để có câu trả lời, bạn có thể thay đổi chai đếm ở một nơi :) xem codegolf.stackexchange.com/questions/2/99-bottles-of-beer/ gợi
Tiến sĩ Rebmu

Bạn đang thiếu "trên tường." trong dòng đầu ra cuối cùng và sau mỗi chai được gỡ xuống.
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."sửa lỗi đó Tổng cộng 199 ký tự. (Thêm ngắt dòng sau $wtrước ")
Iszi

Cảm ơn đã sửa chữa. Có một không gian thừa trong đó, vì vậy số lượng là 198 thay vào đó.
Joey

10

Curl 19 ký tự

(yêu cầu kết nối internet)

curl -L j.mp/eGv9K5

7
Tôi xem xét điều này kéo dài nó quá xa.
marcog

8
Tôi coi đó là một trò đùa. Nhiều giải pháp có thể được ẩn đằng sau một truy vấn đến một máy chủ web.
Alexandru

3
Tôi vẫn thích cái này.
pimvdb

1
Nếu mục tiêu là mã ngắn nhất, tôi sẽ cho bạn một điểm cho sự thông minh.
Neil

9

Chống golf gần như chính xác từ lập trình viên C mới háo hức, những người đang họ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;
  }
}

Tại sao không /usr/bin/env perl?
nyuszika7h

1
@ nyuszika7h Phê bình sâu sắc! ;)
Daniel Standage 30/12/14

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

Chỉnh sửa: Có một "1 chai bia" trong phiên bản ban đầu, phiên bản thứ 3 được viết lại hoàn toàn, chú ý các thủ thuật hay như (a||99)lấy 99 ở dòng cuối cùng, (a-1?'s':'')tạo số nhiều cho mọi trường hợp nhưng a==1không cần lãng phí ==và đặt giá trị các bbên trong một tuyên bố, nơi nó được sử dụng.


Có vẻ như tối ưu hóa chai / chai của bạn đang tiêu tốn của bạn nhiều nhân vật hơn nó tiết kiệm.
Yahel

Tôi không chắc ý của bạn là gì, chính xác bạn sẽ thay đổi điều gì?
aaaaaaaaaaaa

Điều này dừng lại một câu quá sớm. Câu thơ cuối cùng nên đi "no more bottles of beer on the wall, no more bottles..." - Xem: 99-bottles-of-beer.net/lyrics.html
Már Örlygsson

BTW, tôi đã quản lý một phiên bản đầy đủ, chính xác trong 233 byte: 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 Chào mừng đến với trang web. Lời bài hát cho thử thách này được xác định trong bài mở đầu.
aaaaaaaaaaaa

7

C

Tôi đã bỏ lỡ câu hỏi này, vì vậy đây là một phiên bản tôi đã đăng dưới dạng câu trả lời ở nơi khác. Đây là phiên bản dựa trên C quine. Biên dịch và chạy để có được dòng bài hát tiếp theo. Lặp lại cho đến khi chán. Nếu mã nói "Thời gian để đi ..." thì hãy nhập số lượng bia vào lần tới khi bạn chạy dưới dạng đối số dòng lệnh.

// 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);}

@DreamWar Warrior liên quan đến chỉnh sửa được đề xuất của bạn, bạn đã xem xét đưa mã của mình vào pastebin để bạn có thể đăng nó dưới dạng nhận xét chưa?
nderscore

6

Javascript (285)

Giả định này có một hàm gọi là print, để xuất ra một chuỗi.

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
Tôi không chắc chắn rằng các chức năng giả định là công bằng. Ví dụ, chương trình của tôi có thể b();. Giả sử có một chức năng b()in 99 chai bia trên tường. :)
Chris Laplante

10
Javascript không cung cấp bất kỳ cách tiêu chuẩn nào để xuất một chuỗi, nếu bạn đang chạy nó trong trình duyệt, thì nó không có chức năng in, nếu bạn đang chạy nó trong tê giác, bạn sẽ làm như vậy.

2
document.writelnlàm.
Chris Laplante

4
... cho các trình duyệt

5
JavaScript có IO với: alertlà đầu ra, promptlà đầu vào biến và confirmđầu vào boolean. Chúng hút xa như UI, nhưng chúng là các hàm IO chặn tiêu chuẩn. alertprintcó cùng độ dài, vì vậy mã của bạn phải bằng nhau.
zzzzBov

6

Sơ đồ (270)

Không có khoảng trắng:

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

Với khoảng trắng:

    (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

Con trăn - rất nhiều

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

Tham khảo bổ sung (đã giúp tôi rất nhiều với mã): http://www.youtube.com/watch?v=Y0Z0raWIHXk


5

Con trăn (318)

Tôi thấy cách này làm cho chương trình Python ngắn hơn :)

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

Công cụ .decode.decode này có vẻ ngu ngốc đối với tôi khi lần đầu tiên tôi nhìn thấy nó, nhưng bây giờ tôi đang sử dụng cho các mục đích thực tế (để đưa mã python vào .bashrc của tôi dưới dạng các hàm theo cách không phô trương), cảm ơn.
ixtmixilix

5
Tôi đếm rằng mã không nén có 300 ký tự. Tại sao lại nén nó?
Julian Kuhn

5

Rebmu - 167 ký tự

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]]

Có lẽ có thể cạo một vài ký tự, đây chỉ là lần thử đầu tiên. :)

Đây là Rebol tương đương có tốc ký. Vẫn còn khá cạnh tranh đặc biệt là xem xét sự rõ ràng:

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
    ]
]

Mã nguồn nhận xét có sẵn trên GitHub


5

PHP: 285 240 233 231 Ký tự

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

Đầu ra ở đây: http://ideone.com/5fQmcd


4

Python, ký tự 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 byte

Vẫn còn khá mới mẻ với Ruby, thực sự chỉ chơi xung quanh

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 ký tự)

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
Dòng cuối cùng của bạn hiển thị "99 chai" thay vì "99 chai" và bạn có vòng lặp bắt đầu từ 19 thay vì 99 (mặc dù đó có thể chỉ là một giám sát).
Nellius

@Nellius ~ Đã sửa ~ và nhờ mã cạnh tranh của bạn, tôi đã xem lại của tôi và xóa một số khối chèn đơn lẻ và giảm một số hằng số có sẵn trong mã của riêng tôi. Bây giờ xuống dưới 300 trơn tru.
jcolebrand

Bạn có thể giảm xuống còn 293 bằng cách bỏ "bằng cách sử dụng Hệ thống;" và thay đổi "Console.WriteLine" thành "System.Console.WriteLine"
Tester101

@ Tester101 ~ Cuộc gọi tốt. Chưa xem xét điều đó!
jcolebrand

4

JavaScript (7 chức năng)

Không chơi gôn. Điều này được dự định là một thực hiện chức năng (chủ yếu) của bài hát.

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

Đi (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 byte

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

Tôi hy vọng tôi sẽ nén thêm vào ngày mai.


3

Ruby 1.9.2p136: 223

Tôi không hèn nhát, bạn có thể đọc của tôi; p

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

Không có số lượng nhân vật, tôi đã không chơi nó. Chỉ cần tìm thấy một cách thú vị để làm điều đó.

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.