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.


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 .


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


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 ║
              ╚═════╝╚═════════════════════════════════════════════════╝

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

;)


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


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

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

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

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


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

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]

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


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

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

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.


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

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

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

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


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

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


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


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

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

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

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

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

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


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

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.