99 butelek piwa [zamknięte]

65

Odtwórz „99 butelek piwa na ścianie”.

Pożądane wyjście to:

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.

Pokaż, jak rozwiązałbyś ten problem za pomocą swojego ulubionego języka programowania. Najbardziej kreatywne użycie języka wygrywa.

Nick Berardi
źródło
30
Myślę, że „najbardziej kreatywne wykorzystanie” jest zbyt subiektywne dla strony SE. Powinniśmy dążyć do stosowania obiektywnych kryteriów, takich jak „najkrótszy kod”.
Chris Jester-Young
5
Wciąż dobre pytanie
Chris Laplante
3
Czy ma działać nieskończenie? Tak założyłem. Również codegolf nie posiada 99 butelek piwa, więc nie ma powodu, aby o tym dyskutować.
1
@Chris - To będzie najtrudniejsza część tej strony SE, ponieważ całość opiera się na kreatywności, ponieważ jest to połowa zabawy z układaniem puzzli. Najbardziej kreatywne rozwiązanie nie zawsze jest najskuteczniejsze lub najkrótsze.
Nick Berardi
2
@Nick: Słyszę cię. Chcę tylko wiedzieć, jak można określić, jak kreatywne jest rozwiązanie - na podstawie własnego osądu? Oparte na wyborcach? Żaden z nich nie jest szczególnie niezawodny (bez obrazy). Coś w rodzaju zwięzłości jest niepodważalne - na przykład nikt nie może kwestionować „dobroci” 1-bajtowego rozwiązania przepełnienia kodu golfowego.
Chris Jester-Young

Odpowiedzi:

70

Perl (410 znaków)

Istnieje już witryna poświęcona temu konkursowi:

Jedno z rozwiązań Perla byłoby bardzo trudne do pokonania pod względem kreatywności, czytamy:

[bottles.pl]

         $ a =
        „procesor
       \ bmft p
       \ bg cff
       \ bs "; $ b
       = "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 /; dla(
  $ d = 100; $ d> 0; $ d -) {
  wydrukuj „$ d $ a $ b $ d”
  ; wydrukuj „$ a, \ n $ c”
  ; print ($ d-1); print
  „$ a $ b. \ n”;} $ x =
  „cjc”; $ y = "dobbz";
  $ z = "com"; print "\ n"
  ; print "- $ x \ @ $ y."
   ; print "$ z \ n \ n";

Oto link do oryginalnego pliku .

kalosze
źródło
1
Ładna prezentacja, ale ta prośba nie pasuje !!
F. Hauri
Szyfr „rot1”, nie najlepsza próba zaciemnienia, jaką widziałem. Użycie \b„usuwania” niechcianych postaci jest również nieco rozczarowujące.
primo
100

Brainf *** (1,509)

Doszedłem do wniosku, że mogę przebijać odpowiedź, nie tylko tworząc 9 butelek piwa zamiast 1, ale także używając tylko 7 różnych znaków w kodzie.

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

Muszę jednak przyznać, że w kodzie jest błąd (może możesz wymyślić, jak to naprawić dla mnie?) I nie drukuje on ostatniego zdania, Go to the store and buy some more, 99 bottles of beer on the wall.ale poza tym działa tak samo dobrze, jak którykolwiek z programy stworzone w tych sissy językach programowania, których wszyscy inni lubią.

Peter Olson
źródło
9
Masz tam tylko 9 butelek. Potrzebujesz jeszcze 90!
Joe Z.
Petycja: zmień nazwę tego języka na braindrunk?
Cyoce,
99

Funciton

Napisałem to innego dnia. :) (Zrzuty ekranu: początek i koniec )

Ponieważ wygląda to brzydko w StackExchange ze względu na dodatkowe odstępy między wierszami, rozważ uruchomienie następującego kodu w konsoli JavaScript przeglądarki, aby to naprawić: $('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
źródło
1
plus jeden, to jest niesamowite
gyurisc
1
Ten język jest niesamowity, świetna robota!
przestał obracać przeciwnie do zegara
1
Widziałem to na Esolang.org i podobało mi się to.
ML
56

jQuery + konsola FireBug

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

;)

powtac
źródło
2
Co powiesz na coś takiego jak eval($($('code')[8]).text().replace(/print/g,'console.log'))<del> (aka. Stealing) </del>? Drukuje cały tekst piosenki. : P
JiminP
2
Działa również na konsoli javascript w Chrome.
Spoike
Diabelnie sprytny.
Maks.
1
@JiminP Niestety, nie jest to stabilny selektor, biorąc pod uwagę, jak kolejność odpowiedzi może się zmieniać w czasie (w rzeczywistości nie działa już).
Muhd,
2
@Muhd Nadal działa, dopóki pytanie nie zostanie zmienione - pierwszy blok kodu jest tym w pytaniu.
Bob
24

HQ9 + (1 znak)

9

Wprawdzie nie jest to kompletny język Turinga, ale to i tak się liczy

tobyodavies
źródło
13
Dlaczego nie używasz HQ9 B ? Ukończono Turinga.
Mateen Ulhaq,
1
@muntoo Nie jestem pewien, czy HQ9 + B jest w trakcie dobierania. Polecenie B odpytuje dane z klawiatury i ocenia to jako bzdury, więc jest to HQ9 + z optonalnym interpretatorem Brainfuck. tzn. program „B” w HQ9 + B będzie odpytywał stdin, dopóki się nie pojawi! (lub EOF) i zinterpretuj to jako Brainfuck ..
Sylwester
20

Kto powiedział, że C # miał zbyt wiele ceremonii? Kimkolwiek był, nigdy nie mieli tak racji.

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
źródło
11
+1 Za bycie kolejnym barankiem ofiarnym w stylu C w oceanie Perl.
Glenn Nelson
Można to znacznie zmniejszyć.
Nellius 28.01.11
2
@Nellius Czy w ogóle czytałeś, co ilivewithiannapisano przed jego kodem?
Daniel Standage
1
@Daniel Tak, a to sugeruje, że uważa, że ​​wszystko w jego kodzie jest konieczne. Jeśli ma to być żart, nie należy głosować tak bardzo. Nie jest krótki, kreatywny, wydajny, a nawet nieco sprytny.
Nellius 28.01.11
@Nellius Nie był to poważny pretendent, na żadnym poziomie ten dobry kod nie jest. Jestem pewien, że można go zmniejszyć, zwiększyć wydajność i ogólnie znacznie poprawić.
Rob White
18

do

Ten program generuje pełny tekst piosenki jako pojedynczy ciąg przy użyciu preprocesora. Rzeczywisty kod C po prostu wyświetla tak skonstruowany ciąg. Wywołanie stringswygenerowanego pliku wykonywalnego ujawni pełny tekst utworu w pliku wykonywalnym.

#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
źródło
1
Prawdopodobnie najbardziej wydajne i najszybsze z nich.
Tom Pažourek
1
@tomp Efektywny czas, bardzo nieefektywny w rozmiarze pliku wykonywalnego :)
patrzqu.
14

C # ( 312 310 304 znaków)

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
źródło
1
Nie mogę uwierzyć, że masz go krótszego ode mnie. Jestem pod wrażeniem. Będę musiał się uczyć, aby uzyskać lepszy zestaw opcji
jcolebrand
A teraz uczyłem się do tego, mam poniżej 300;)
jcolebrand
12

DO#

Nie jest krótki, ale może to się liczy jako kreatywne?

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

Uwaga: to tylko jedno zdanie :)

Timwi
źródło
11

Zdecydowanie nie kwalifikuje się jako twórczy, ale wykonuje się go z wiersza poleceń za pomocą jednego polecenia.

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
źródło
11

Haskell, 272 , 250 , 243 znaków

(&)=(++)
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
źródło
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."

Dość bezpośredni.

Używam filtra do butelek piwa, ponieważ functionjest dłuższy i wywołanie wymaga nawiasów. Wykrywanie liczby mnogiej ( !!--$_) najpierw zmniejsza liczbę butelek o jeden (więc liczba mnoga jest różna od zera), rzuca ją na wartość logiczną i neguje ją z pierwszą !i ponownie ją neguje, więc teraz mamy wartość logiczną opisującą, czy liczba potrzebuje liczby mnogiej albo nie. Jest to następnie domyślnie rzutowane na liczbę całkowitą podczas mnożenia ciągu.

Podziały linii są zabawne.

Odradza więcej linii niż jest to potrzebne, a potem również cofa się.

Joey
źródło
Zdecydowanie krótki, a to postawiło poprzeczkę na próbę zejścia pod ziemię !!! Chociaż z mojego punktu widzenia pojawienie się „magicznej liczby”, takiej jak 196, należało do klasy rzeczy, których mam nadzieję uniknąć, ponieważ przechwytuje (99 * 2) - 2. Dla odpowiedzi, w której można zmienić butelkę liczyć w jednym miejscu :) patrz codegolf.stackexchange.com/questions/2/99-bottles-of-beer/…
Dr. Rebmu
Tęsknisz za „na ścianie”. w ostatnim wierszu produkcji i po zdjęciu każdej butelki.
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."naprawia to. Łącznie 199 znaków. (Dodaj podział wiersza po $wwcześniej ")
Iszi
Dzięki za poprawkę. Było tam również zbyteczne miejsce, więc liczba wynosi 198.
Joey
10

Zwinąć 19 znaków

(wymaga połączenia z Internetem)

curl -L j.mp/eGv9K5
Alexandru
źródło
7
Uważam to za rozciąganie tego za daleko.
marcog
8
Uważam to za żart. Wiele zapytań można ukryć za zapytaniem do serwera WWW.
Alexandru
3
Mimo to podoba mi się ten.
pimvdb
1
Gdyby cel był najkrótszym kodem, dałbym ci punkt za spryt.
Neil
9

Prawie poprawna gra w golfa od niezwykle zapalonego nowego programisty C, który uczy się Perla?

#!/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
źródło
Dlaczego nie /usr/bin/env perl?
nyuszika7h
1
@ nyuszika7h Wnikliwa krytyka! ;)
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>")

Edycja: Miałem jedną „1 butelkę piwa” w początkowej wersji, trzecia wersja jest całkowicie przepisana, zauważ fajne sztuczki, jak (a||99)dostać 99 w ostatnim wierszu, (a-1?'s':'')tworząc liczbę mnogą dla każdego przypadku, ale a==1bez potrzeby marnotrawstwa ==i ustawiając wartość od bwewnątrz instrukcji gdzie jest on używany.

aaaaaaaaaaaa
źródło
Wygląda na to, że optymalizacja butelki / butelek kosztuje więcej postaci niż oszczędza.
Yahel
Nie jestem pewien, co masz na myśli, co dokładnie byś zmienił?
aaaaaaaaaaaa
Ten kończy jeden wiersz zbyt wcześnie. Ostatni wiersz powinien odejść "no more bottles of beer on the wall, no more bottles..." - Patrz: 99-bottles-of-beer.net/lyrics.html
Már Örlygsson
BTW, zarządziłem pełną, poprawną wersją w 233 bajtach: 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 Witamy na stronie. Tekst tego wyzwania został zdefiniowany w poście otwierającym.
aaaaaaaaaaaa
7

do

Musiałem przegapić to pytanie, więc oto wersja, którą opublikowałem jako odpowiedź gdzie indziej. Jest to wersja oparta na quinie C. Skompiluj i uruchom, aby uzyskać następny wiersz piosenki. Powtarzaj, aż się nudzisz. Jeśli kod mówi „Czas iść ...”, wprowadź liczbę piw podczas następnego uruchomienia jako argument wiersza poleceń.

// 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);}
Skizz
źródło
@DreamWarrior, jeśli chodzi o proponowaną edycję, czy zastanawiałeś się nad wstawieniem kodu do pastebin, abyś mógł opublikować go jako komentarz?
nderscore
6

JavaScript (285)

Zakłada się, że istnieje funkcja o nazwie print, która wysyła ciąg znaków.

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

źródło
8
Nie jestem pewien, czy zakładane funkcje są uczciwe. Na przykład moim programem może być b();. Zakładając, że istnieje funkcja, b()która drukuje 99 butelek piwa na ścianie. :)
Chris Laplante
10
JavaScript nie zapewnia żadnego standardowego sposobu wyprowadzania łańcucha, jeśli uruchamiasz go w przeglądarce, nie ma funkcji drukowania, jeśli uruchamiasz go w nosorożcu, robisz to.
2
document.writelnPracuje.
Chris Laplante
4
... dla przeglądarek
5
JavaScript ma operacje wejścia / alertwyjścia z: jako dane wyjściowe, promptjako zmienne wejściowe i confirmjako dane logiczne. Ssają aż do interfejsu użytkownika, ale są standardowymi funkcjami blokującymi we / wy. alerti printmają tę samą długość, więc kod powinien być mniej więcej równy.
zzzzBov
6

Program (270)

Brak białych znaków:

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

Z białymi znakami:

    (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
źródło
6

Python - dużo

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

Dodatkowe informacje (bardzo mi pomogło z kodem): http://www.youtube.com/watch?v=Y0Z0raWIHXk

aditsu
źródło
5

Python (318)

Znalazłem taki sposób na skrócenie programu Python :)

exec'eJxtjrFqwzAQQHd/xVVgLCVqSbq5RHO2TtlcgyX7Qk3luyAphP59ZA0thGzi9O7es0bUERyn5DE/+AwOMdTxi0TljLeLmyzQB4GlaaCBg/hkWDigqMb/76aZz0CHHaCPCLaWTpLSTWw2kl7MXmkBTJC+EW7Wey3U9hmzzqU42R/MNMLEt6KFi40R5gQ28JUmndO0ODIkLhdjyjWFc9dfiLxg6Vsx1ZExu36Vddn2miVD2w59R4d9/6d+f8h7Wze3Y+GrS5gpwSjbVlV3Y1BZCg=='.decode('base64').decode('zip')
marinus
źródło
ten plik .decode.decode wydawał mi się głupi, kiedy go zobaczyłem po raz pierwszy, ale teraz używam go do celów praktycznych (wrzucanie kodu Pythona do mojego .bashrc jako funkcji w dyskretny sposób), więc dzięki.
ixtmixilix,
5
Liczę, że nieskompresowany kod ma 300 znaków. Po co więc kompresować?
Johannes Kuhn
5

Rebmu - 167 znaków

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

Prawdopodobnie mógł ogolić kilka postaci, to była tylko pierwsza próba. :)

Oto odpowiednik Rebola, którego skrót jest ugotowany. Nadal dość konkurencyjny, szczególnie biorąc pod uwagę jasność:

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

Skomentowany kod źródłowy dostępny na GitHub

Dr. Rebmu
źródło
5

PHP: 285 240 233 231 znaków

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

Wyjście tutaj: http://ideone.com/5fQmcd

Yahel
źródło
4

Python, 241 znaków

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
źródło
4

Rubinowy, 274 bajty

Nadal całkiem nowy w Ruby, naprawdę po prostu się bawię

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
źródło
4

C # (299 znaków)

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
źródło
1
W ostatnim wierszu wyświetla się „99 butelek” zamiast „99 butelek”, a twoja pętla zaczyna się od 19 zamiast 99 (choć to prawdopodobnie tylko przeoczenie).
Nellius
@Nellius ~ Poprawiony ~ i dzięki waszemu kodowi konkurencyjnemu ponownie odwiedziłem mój i usunąłem kilka pojedynczych bloków wstawiania i zmniejszyłem niektóre istniejące wcześniej stałe w moim własnym kodzie. Teraz płynnie poniżej 300.
jcolebrand
Możesz go obniżyć do 293, upuszczając „używając Systemu”; i zmieniając „Console.WriteLine” na „System.Console.WriteLine”
Tester101
@ Tester101 ~ Dobre połączenie. Nie wziąłem tego pod uwagę!
jcolebrand
4

JavaScript (7 funkcji)

Nie grał w golfa. Ma to na celu (głównie) funkcjonalną implementację utworu.

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));
Proszę wstać
źródło
4

Idź (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
źródło
3

PHP - 252 bajtów

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

Mam nadzieję, że jutro trochę skompresuję.

Aurel Bílý
źródło
3

Ruby 1.9.2p136: 223

Nie jestem tchórzem, możesz przeczytać moje; s

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

źródło
3

(Oracle) SQL

Brak liczby postaci, nie grałem w golfa. Właśnie znalazłem to świetny sposób, aby to zrobić.

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
źródło