99 Botol Bir [ditutup]

65

Buat '99 botol bir di dinding '.

Output yang diinginkan adalah ini:

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.

Tunjukkan pada saya bagaimana Anda akan menyelesaikan ini dengan bahasa pemrograman favorit Anda. Penggunaan bahasa yang paling kreatif menang.

Nick Berardi
sumber
30
"Penggunaan paling kreatif" terlalu subyektif untuk situs SE, saya pikir. Kita harus bertujuan untuk menggunakan kriteria objektif, seperti "kode terpendek".
Chris Jester-Young
5
Masih pertanyaan yang bagus
Chris Laplante
3
Apakah ini seharusnya berjalan tanpa batas? Saya mengira begitu. Codegolf juga tidak memiliki 99 botol bir sehingga tidak ada alasan untuk membahasnya.
1
@ Chris - Itu akan menjadi bagian tersulit dari situs SE ini, karena semuanya didasarkan pada kreativitas, karena itu adalah setengah kesenangan dari teka-teki pemrograman. Solusi paling kreatif tidak selalu yang paling efisien atau terpendek.
Nick Berardi
2
@Nick: Saya mendengarmu. Saya hanya ingin tahu bagaimana seseorang dapat menentukan seberapa kreatif solusinya --- berdasarkan penilaian Anda sendiri? Berdasarkan pemilih? Keduanya tidak dapat diandalkan (tidak ada pelanggaran). Sesuatu seperti keringkasan tidak dapat dibantah --- misalnya, tidak ada yang dapat membantah "kebaikan" dari solusi golf kode stack 1-byte stack overflow.
Chris Jester-Young

Jawaban:

70

Perl (410 karakter)

Ada sudah situs yang didedikasikan untuk kontes ini:

Salah satu solusi Perl akan sangat sulit dikalahkan dalam hal kreativitas, berbunyi:

[bottles.pl]

         $ a =
        "cpuu
       \ bmft p
       \ bg cff
       \ bs "; $ b
       = "po ui
       \ bf xbm
      \ bm "; $ c ="
      Ypv ublf p
     \ epofo 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 /; untuk(
  $ d = 100; $ d> 0; $ d -) {
  cetak "$ d $ a $ b $ d"
  ; cetak "$ a, \ n $ c,"
  ; print ($ d-1); print
  "$ a $ b. \ n";} $ x =
  "cjc"; $ y = "dobbz";
  $ z = "com"; print "\ n"
  ; cetak "- $ x \ @ $ y."
   ; cetak "$ z \ n \ n";

Inilah tautan ke file asli .

sepatu karet
sumber
1
Presentasi yang bagus, tetapi permintaan ini tidak cocok !!
F. Hauri
Cipher 'rot1', bukan upaya terbaik untuk kebingungan yang pernah saya lihat. Penggunaan \buntuk 'menghapus' karakter yang tidak diinginkan juga sedikit mengecewakan.
Primo
100

Brainf *** (1,509)

Saya pikir saya dapat mengalahkan jawaban ini dengan tidak hanya membuat 9 botol bir, bukan 1, tetapi juga dengan hanya menggunakan 7 karakter berbeda dalam kode.

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

Namun saya harus mengakui, ada bug dalam kode (mungkin Anda bisa mencari cara memperbaikinya untuk saya?) Dan tidak mencetak kalimat terakhir, Go to the store and buy some more, 99 bottles of beer on the wall.tetapi selain itu, fungsinya sama baiknya dengan program-program yang dibuat dalam bahasa-bahasa pemrograman banci itu sepertinya disukai semua orang.

Peter Olson
sumber
9
Anda hanya memiliki 9 botol di sana. Anda membutuhkan 90 lagi!
Joe Z.
Petisi: ganti nama bahasa ini menjadi braindrunk?
Cyoce
99

Funciton

Saya menulis ini hanya beberapa hari yang lalu. :) (Tangkapan layar: mulai dan selesai )

Karena ini terlihat jelek di StackExchange karena spasi baris tambahan, coba jalankan kode berikut di konsol JavaScript browser Anda untuk memperbaikinya: $('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 ║
              ╚═════╝╚═════════════════════════════════════════════════╝
Timwi
sumber
1
ditambah satu, ini luar biasa
gyurisc
1
Bahasa itu luar biasa, pekerjaan hebat!
Berhenti menghidupkan counterclockwis
1
Saya melihat ini di Esolang.org dan menyukai tampilan itu.
ML
56

jQuery + FireBug Console

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

;)

powtac
sumber
2
Bagaimana dengan sesuatu seperti eval($($('code')[8]).text().replace(/print/g,'console.log'))<del> (alias. Mencuri) </del>? Itu mencetak seluruh lirik lagu. : P
JiminP
2
Juga berfungsi di konsol javascript Chrome.
Spoike
Iblis pintar.
Maks.
1
@ JiminP Sayangnya, itu bukan pemilih stabil mengingat bagaimana urutan jawaban dapat berubah dari waktu ke waktu (pada kenyataannya, itu tidak lagi berfungsi).
Muhd
2
@ Muhd ​​Masih berfungsi selama pertanyaan tidak berubah - blok kode pertama adalah yang ada di pertanyaan.
Bob
24

HQ9 + (1 karakter)

9

Memang ini bukan bahasa lengkap Turing, tapi ini masih diperhitungkan

tobyodavies
sumber
13
Mengapa Anda tidak menggunakan HQ9 B ? Ini Turing lengkap.
Mateen Ulhaq
1
@muntoo Saya tidak yakin HQ9 + B sedang menyelesaikan lengkap .. Perintah B polling input keyboard dan mengevaluasi itu sebagai brainfuck jadi itu HQ9 + dengan interpreter Brainfuck optonal. yaitu program "B" di HQ9 + B akan mem-polling stdin sampai didapat! (atau EOF) dan menafsirkannya sebagai Brainfuck ..
Sylwester
20

Siapa bilang C # terlalu banyak upacara? Siapa pun itu, mereka tidak pernah benar.

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);
            }
         }
    }
}
Rob White
sumber
11
+1 Karena menjadi domba kurban gaya C lain di samudera Perl.
Glenn Nelson
Itu bisa dikurangi secara substansial.
Nellius
2
@Nellius Apakah Anda bahkan membaca apa yang ilivewithiandikatakan sebelum kode-nya?
Daniel Standage
1
@ Daniel Ya, dan itu menyiratkan bahwa dia pikir semua yang ada dalam kodenya diperlukan. Jika dimaksudkan sebagai lelucon, itu tidak boleh terlalu banyak dipilih. Itu tidak pendek, kreatif, efisien, atau bahkan sedikit pintar.
Nellius
@Nellius Itu tidak dimaksudkan sebagai lawan yang serius, pada tingkat tidak ada kode yang baik ini. Saya yakin itu bisa dikurangi, dibuat lebih efisien dan secara umum ditingkatkan.
Rob White
18

C

Program ini menghasilkan teks lagu lengkap sebagai string tunggal menggunakan preprosesor. Kode C aktual hanya menghasilkan string yang dibangun. Memanggil stringsexecutable yang dihasilkan akan mengungkapkan teks lagu lengkap dalam executable.

#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;
}
celtschk
sumber
1
Mungkin solusi paling efisien dan tercepat dari semua ini.
Tom Pažourek
1
@tomp Efisien secara waktu, sangat tidak efisien dalam ukuran file yang dapat dieksekusi :)
seequ
14

C # ( 312 310 304 karakter)

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));}}
Nellius
sumber
1
Saya tidak percaya Anda mendapatkannya lebih pendek dari saya. Saya terkesan. Saya harus belajar untuk satu set pilihan yang lebih baik
jcolebrand
Dan sekarang saya telah belajar untuk itu, saya turun ke bawah 300;)
jcolebrand
12

C #

Tidak bermaksud pendek, tapi mungkin ini dianggap kreatif?

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

Perhatikan ini hanya satu pernyataan :)

Timwi
sumber
11

Jelas tidak memenuhi syarat sebagai kreatif, tetapi dilakukan dari baris perintah dengan satu perintah.

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");'
Daniel Standage
sumber
11

Haskell, 272 , 250 , 243 karakter

(&)=(++)
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]
Jonathan Sternberg
sumber
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."

Cukup mudah.

Saya menggunakan filter untuk botol-botol bir, karena functionlebih lama dan doa perlu kurung dalam hal apapun. Deteksi jamak ( !!--$_) pertama-tama mengurangi jumlah botol dengan satu (jadi jamak adalah sesuatu yang tidak nol), melemparkannya ke boolean dan meniadakannya dengan yang pertama !dan meniadakannya lagi sehingga kita sekarang memiliki boolean yang menjelaskan apakah nomor tersebut membutuhkan jamak. atau tidak. Ini kemudian secara implisit dicor ke integer ketika mengalikan string.

Istirahat baris sebaris itu menyenangkan.

Menumbuhkan lebih banyak garis dari yang dibutuhkan dan memotong kembali juga.

Joey
sumber
Jelas pendek, dan ini menetapkan bar untuk mencoba dan gagal !!! Meskipun dari sudut pandang saya, penampilan "angka ajaib" seperti 196 berada di kelas yang saya harap dapat saya hindari karena ia menangkap (99 * 2) - 2. Untuk jawaban di mana Anda dapat mengganti botol hitung di satu tempat :) lihat codegolf.stackexchange.com/questions/2/99-bottles-of-beer/…
Dr. Rebmu
Anda hilang "di dinding." di garis akhir output dan setelah setiap botol diturunkan.
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."memperbaikinya. Total 199 karakter. (Tambahkan jeda baris setelah $wsebelumnya ")
Iszi
Terima kasih untuk perbaikannya. Ada ruang berlebihan di sana juga, jadi hitungnya adalah 198.
Joey
10

Ikal 19 karakter

(membutuhkan koneksi internet)

curl -L j.mp/eGv9K5
Alexandru
sumber
7
Saya menganggap ini terlalu jauh.
marcog
8
Saya menganggapnya sebagai lelucon. Banyak solusi dapat disembunyikan di balik kueri ke server web.
Alexandru
3
Saya suka yang ini.
pimvdb
1
Jika objektif adalah kode terpendek, saya akan memberi Anda poin untuk kepintaran.
Neil
9

Anti-golf hampir-benar dari programmer C uber-bersemangat baru yang belajar 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;
  }
}
Daniel Standage
sumber
Mengapa tidak /usr/bin/env perl?
nyuszika7h
1
@ nyuszika7h Kritik mendalam! ;)
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>")

Sunting: Memiliki satu "1 botol bir" di versi awal, versi ke-3 sepenuhnya ditulis ulang, perhatikan trik-trik keren seperti (a||99)mendapatkan 99 di baris terakhir, (a-1?'s':'')membuat jamak untuk setiap kasus tetapi a==1meskipun tanpa perlu boros ==, dan mengatur nilainya dari bdalam sebuah pernyataan di mana ia digunakan.

aaaaaaaaaaaa
sumber
Sepertinya optimasi botol / botol Anda dikenakan biaya lebih banyak karakter daripada menghemat.
Yahel
Saya tidak yakin apa yang Anda maksud, apa yang sebenarnya akan Anda ubah?
aaaaaaaaaaaa
Yang ini berhenti satu ayat terlalu dini. Ayat terakhir harus "no more bottles of beer on the wall, no more bottles..." - Lihat: 99-bottles-of-beer.net/lyrics.html
Már Örlygsson
BTW, saya mengelola versi lengkap, benar dalam 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 Selamat datang di situs. Lirik untuk tantangan ini ditentukan di pos pembuka.
aaaaaaaaaaaa
7

C

Saya pasti melewatkan pertanyaan ini, jadi inilah versi yang saya poskan sebagai jawaban di tempat lain. Ini adalah versi berbasis C quine. Kompilasi dan jalankan untuk mendapatkan baris lagu berikutnya. Ulangi sampai bosan. Jika kode mengatakan "Waktunya pergi ..." lalu masukkan jumlah bir saat Anda menjalankan argumen baris perintah.

// 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);}
Mendesis
sumber
@DreamWarrior sehubungan dengan pengeditan yang Anda usulkan, sudahkah Anda mempertimbangkan untuk meletakkan kode Anda di pastebin sehingga Anda dapat mempostingnya sebagai komentar?
nderscore
6

Javascript (285)

Ini mengasumsikan ada fungsi yang disebut print, untuk menghasilkan string.

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

sumber
8
Saya tidak yakin bahwa fungsi yang diasumsikan adil. Misalnya, program saya bisa b();. Dengan asumsi ada fungsi b()yang mencetak 99 botol bir di dinding. :)
Chris Laplante
10
Javascript tidak menyediakan cara standar untuk menampilkan string, jika Anda menjalankannya di browser, itu tidak memiliki fungsi cetak, jika Anda menjalankannya di badak, Anda melakukannya.
2
document.writelnbekerja.
Chris Laplante
4
... untuk browser
5
JavaScript memiliki IO dengan: alertsebagai output, promptsebagai input variabel dan confirmsebagai input boolean. Mereka menyedot sejauh UI berjalan, tetapi mereka adalah fungsi standar IO pemblokiran. alertdan printpanjangnya sama, sehingga kode Anda harus sama.
zzzzBov
6

Skema (270)

Tanpa spasi putih:

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

Dengan spasi putih:

    (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))))))
Hoa Long Tam
sumber
6

Python - banyak

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

Referensi tambahan (banyak membantu saya dengan kode): http://www.youtube.com/watch?v=Y0Z0raWIHXk

aditsu
sumber
5

Python (318)

Saya menemukan cara ini untuk membuat program Python lebih pendek :)

exec'eJxtjrFqwzAQQHd/xVVgLCVqSbq5RHO2TtlcgyX7Qk3luyAphP59ZA0thGzi9O7es0bUERyn5DE/+AwOMdTxi0TljLeLmyzQB4GlaaCBg/hkWDigqMb/76aZz0CHHaCPCLaWTpLSTWw2kl7MXmkBTJC+EW7Wey3U9hmzzqU42R/MNMLEt6KFi40R5gQ28JUmndO0ODIkLhdjyjWFc9dfiLxg6Vsx1ZExu36Vddn2miVD2w59R4d9/6d+f8h7Wze3Y+GrS5gpwSjbVlV3Y1BZCg=='.decode('base64').decode('zip')
marinus
sumber
hal-hal .decode.decode ini tampak bodoh bagi saya pertama kali saya melihatnya, tetapi saya sekarang menggunakan untuk tujuan praktis (untuk memasukkan kode python ke dalam .bashrc saya sebagai fungsi dengan cara yang tidak mencolok), jadi terima kasih.
ixtmixilix
5
Saya menghitung bahwa kode yang tidak terkompresi memiliki 300 karakter. Mengapa mengompresnya?
Johannes Kuhn
5

Rebmu - 167 karakter

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

Mungkin bisa mencukur beberapa karakter, ini hanya percobaan pertama. :)

Berikut ini adalah Rebol yang setara yang memiliki singkatan tulisannya . Masih cukup kompetitif terutama mengingat kejelasan:

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

Kode sumber yang dikomentari tersedia di GitHub

Rebmu
sumber
5

PHP: 285 240 233 231 Karakter

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

Keluaran di sini: http://ideone.com/5fQmcd

Yahel
sumber
4

Python, 241 karakter

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+"."
Keith Randall
sumber
4

Ruby, 274 byte

Masih cukup baru di Ruby, benar-benar hanya bermain-main

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}."
derekerdmann
sumber
4

C # (299 karakter)

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);}}
jcolebrand
sumber
1
Baris terakhir Anda menampilkan "99 botol" alih-alih "99 botol", dan Anda memiliki perulangan mulai dari 19 alih-alih 99 (meskipun itu mungkin hanya kekeliruan).
Nellius
@Nellius ~ Diperbaiki ~ dan berkat kode kompetitif Anda, saya mengunjungi kembali tambang dan menghapus beberapa blok sisipan tunggal dan mengurangi beberapa konstanta yang sudah ada sebelumnya dalam kode saya sendiri. Sekarang turun menjadi di bawah 300 dengan lancar.
jcolebrand
Anda bisa turun ke 293 dengan menjatuhkan "menggunakan Sistem;" dan mengubah "Console.WriteLine" menjadi "System.Console.WriteLine"
Tester101
@ Tester101 ~ Panggilan bagus. Tidak mempertimbangkan itu!
jcolebrand
4

JavaScript (7 fungsi)

Tidak golf. Ini dimaksudkan sebagai (sebagian besar) implementasi fungsional lagu.

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));
Tolong berdiri
sumber
4

Go (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+".")}
Slitione
sumber
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.".";

Saya harap saya akan kompres lagi besok.

Aurel Bílý
sumber
3

Ruby 1.9.2p136: 223

Saya bukan pengecut, Anda dapat membaca milik saya; hlm

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+".")}

sumber
3

(Oracle) SQL

Tidak ada hitungan karakter, saya tidak bermain golf. Baru saja menemukan ini cara yang menyenangkan untuk melakukannya.

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;
SQB
sumber