„99 butelek piwa”

71

Napisz program, który wyśle ​​tekst do 99 butelek piwa w jak najmniejszej liczbie bajtów .

Tekst piosenki:

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.

Zasady:

  • Twój program musi zalogować się do STDOUT lub akceptowalnej alternatywy albo zostać zwrócony z funkcji (z lub bez końcowego znaku nowej linii).
  • Twój program musi być pełnym, działającym programem lub funkcją.
  • Języki napisane specjalnie w celu przesłania 0-bajtowej odpowiedzi na to wyzwanie są dozwolone, ale nie są szczególnie interesujące.

    Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Zezwala się (a nawet zachęca) do samodzielnego napisania tego tłumacza dla wcześniej niewdrożonego języka.

  • Różni się to od danych wyjściowych HQ9 + lub 99. Wszelkie odpowiedzi napisane w tych językach zostaną usunięte.

Ponieważ jest to wyzwanie katalogowe, nie chodzi o znalezienie języka z najkrótszym rozwiązaniem do tego (są takie, w których pusty program spełnia swoje zadanie) - chodzi o znalezienie najkrótszego rozwiązania w każdym języku. Dlatego żadna odpowiedź nie zostanie oznaczona jako zaakceptowana.

Katalog

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

GamrCorps
źródło
13
Ktokolwiek to powiedział, ten drugi to konkurs popularności ...
TheDoctor,
21
Jest to podzadanie gry Stwórz golfa dla tłumacza HQ9 + .
Geobits,
4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Nie mam jeszcze VTCd, wciąż decyduję, jak się z tym czuję. Tak czy inaczej, myślę, że niektóre odpowiedzi (lub fragmenty z nich) z drugiej strony można bezpośrednio skopiować / wkleić, pozostając konkurencyjnym , co jest zwykłym testem na powielanie.
Geobits,
13
Zauważ, że quartata już kilka tygodni temu opublikował w piaskownicy katalog 99BB i planował go opublikować.
Alex A.,
13
@GamrCorps Nie zmieniaj niepotrzebnie zasad po rozpoczęciu wyzwania. Żaden ze znaków na wyjściu nie powinien być opcjonalny.
feersum

Odpowiedzi:

43

C #, 285 298 289 bajtów

(Moja pierwsza próba gry w golfa Code ...)

class d{static void Main(){for(int b=99;b>0;)System.Console.Write("{0}{6}{1}{2}, {0}{6}{1} of beer. {3}, {4}{6}{5}{2}.{7}",b,b==1?"":"s"," of beer on the wall",b==1?"Go to the store and buy some more":"Take one down and pass it around",b==1?99:b-1,b==2?"":"s"," bottle",b--<2?"":"\n\n");}}

Nieco golfista:

class d{
    static void Main(){
        for(int b = 99; b > 0;){
            System.Console.Write("{0}{6}{1}{2}, {0}{6}{1} of beer.\n{3}, {4}{6}{5}{2}.{7}", b, b==1 ? "" : "s", " of beer on the wall", b == 1 ? "Go to the store and buy some more" : "Take one down and pass it around", b == 1 ? 99 : b-1, b== 2 ? "" : "s", " bottle", b--<2 ? "" : "\n\n");
        }
    }
}
Florian Bach
źródło
10
wskazówka - użyj var zamiast łańcucha :)
Belfield,
2
2 bajty od zastąpienia " bottle"argumentem formatu, chociaż jestem pewien, że jest lepszy sposób, mając 3 przypadki butelki boli mnie oczy ...
Sven pisze kod z
4
b==1można zastąpić b<2.
LegionMammal978,
2
Twoja pętla for może być napisana w ten sposóbfor(int b = 100; b--> 1;)
Yassin Hajaj
2
Może powinniśmy poczekać, aż autor wyzwania zdecyduje, czy końcowy znak nowej linii jest dozwolony, czy nie.
Florian Bach
31

Kod maszynowy Motorola MC14500B , 46612 bajtów

Ze względu na długość nie mogę opublikować programu tutaj. Można go jednak znaleźć tutaj w systemie szesnastkowym , a tutaj w formacie binarnym (wypełnionym 0s).


Jest to najkrótszy możliwy program w kodzie maszynowym Motorola MC14500B. Składa się wyłącznie 1000a 1001( 8i 9, odpowiednio); jeden kod operacji dla każdego bitu wyjściowego.

Wykorzystuje 93,224 pół bajtów kodów i wysyła tekst piosenki po kawałku. Jest to jedyna możliwa metoda wyjściowa.

Dla zainteresowanych wyjście odbywa się na pin nr 3 (z 16), pin I / O.


Wyjaśnienie

8    Store the register's value
9    Store the logical complement of the register's value

Rejestr zaczyna się od 0.


Ciekawostki dotyczące kodu

  • Szesnastkowy jest 93,224 8s i 9s długo.

  • Binarny jest 745,792 1s i 0s długo.

  • Użyłem kodu Python 2 poniżej do wygenerowania kodu. Wprowadź dane 0binarne i 1szesnastkowe.

    a,b=["8","9"]if input()else["00001000","00001001"]
    f="""99 Bottles of Beer lyrics"""
    print''.join(b if int(i)else a for i in''.join((8-len(bin(i)[2:]))*'0'+bin(i)[2:]for i in bytearray(f)))
Zach Gates
źródło
4
Proszę powiedz mi, że nie napisałeś tego wszystkiego bez generatora ciągów ...: c
Addison Crump,
1
Zobacz nową sekcję „Ciekawostki o kodzie”: P @VoteToClose
Zach Gates,
Linki są zerwane :(
ETHproductions
Naprawię to, kiedy wrócę do domu. Przepraszam za to): @ETHproductions
Zach Gates
28

Vitsy, 0 bajtów



Poważnie nic na mnie nie ma. (@Mego przepraszam.;))

Wypróbuj online! (Wystarczy nacisnąć „Uruchom”)

Addison Crump
źródło
7
o_o Potrzebuję czegoś interesującego, aby Simplex mógł zrobić w zerowych bajtach: P
Conor O'Brien
4
@ CᴏɴᴏʀO'Bʀɪᴇɴ Myślę, że masz na myśli: „Potrzebuję czegoś użytecznego dla Simplex w zerowych bajtach”.
Martin Ender,
3
@VoteToClose - Jak to działa? Naprawdę nie wiem, nie jestem golfistą, ale lubię tu przyjeżdżać i oglądać ludzi i języki. Ale nie mogę tego zrozumieć. +1, ponieważ wygląda imponująco!
Jonnny,
1
@Jonnny Kliknij tutaj, aby wyświetlić procedurę obsługi plików tłumacza. Program obsługi plików zobaczy, że plik zawiera zero bajtów, a jeśli tak, wydrukuje tekst. c:
Addison Crump,
1
@Jonnny Tak - to praca w toku, któregoś dnia będzie lepsza niż Poważnie. Ale na razie ... Czekamy. Jeśli chcesz dobrego języka gry w golfa, zobacz Poważnie odpowiedz, ma w sobie trochę szalonych rzeczy.
Addison Crump,
27

Poważnie , 1 bajt

N

Jeśli stos jest pusty (który jest na początku), Nwypycha słowa. Następnie są domyślnie drukowane na EOF.

Dzięki @Mego za naprawienie poważnie interpretera.

lirtosiast
źródło
22
Martin powiedział w konkursie Hello World: „> proszę nie głosować nudnych (ale ważnych) odpowiedzi w językach, w których nie ma wiele do golfa - są one nadal przydatne w tym pytaniu, ponieważ próbuje skompilować katalog tak kompletny, jak to możliwe. Jednak przede wszystkim oceniaj odpowiedzi w językach, w których autorzy musieli włożyć wysiłek w grę w golfa ”. Ta odpowiedź jest nieciekawa, ale jest to prawidłowe i najkrótsze rozwiązanie.
lirtosiast
1
Czytając pytanie, nie mogłem się doczekać, aż zobaczysz poważną odpowiedź. Ale wygląda na to, że nawet nie muszę czekać. :)
Heksaholic
8
Poważnie ????????
Vajura,
1
Z niecierpliwością czekam na twoje rozwiązanie bez użycia N:)
Mego
1
Tak - mam cztery głosy w dół i moja odpowiedź jest ważna. Zgadzam się z tym, co zostało powiedziane w głównym komentarzu tutaj.
Addison Crump,
19

JavaScript ES6, 230 218 198 196 192 188 185 bajtów

for(x=99,z=(a=' on the wall')=>`${x||99} bottle${1-x?'s':''} of beer`+a;x;)alert(z()+', '+z`.
`+(--x?'Take one down and pass it around, ':'Go to the store and buy some more, ')+z()+'.')

Po prostu odetnij kilka bajtów, jednocześnie zachowując czystość i zrozumiałość.

3 najnowsze wersje:

for(x=99,z=a=>`${x||99} bottle${1-x?'s':''} of beer${a||' on the wall'}`;x;)alert(z()+', '+z(`.
`)+(--x?'Take one down and pass it around, ':'Go to the store and buy some more, ')+z()+'.')

for(x=99,z=a=>(x||99)+' bottle'+(1-x?'s':'')+' of beer',w=' on the wall';x;)alert(z()+w+', '+z()+(--x?`.
Take one down and pass it around, `:`.
Go to the store and buy some more, `)+z()+w+'.')

for(x=99,o=' bottle',q=b=o+'s',e=' of beer',w=e+" on the wall";x;)alert(x+b+w+', '+x+b+e+(--x?`.
Take one down and pass it around, `+x:`.
Go to the store and buy some more, 99`)+(b=1-x?q:o)+w+'.')
Adam Dally
źródło
1
2 bajty zapisane przez umieszczenie zmiennych poza kontrolkami pętli:x=99;w=" on the wall";e=" of beer";o=" bottle";b=o+"s";for(z="Go to the store and buy some more, "+x+b;0<x;)console.log(x+(2>x?o:b)+e+w+", "+x+(2>x?o:b)+e+".\n"+(1>--x?z:"Take one down and pass it around, "+x+(2>x?o:b))+e+w+".")
Użytkownik ogólny
To nie oszczędza tych 2 bajtów w kodzie. To właściwie usunięcie nawiasu wokół (--x <1). Na razie zostawię zmienne wewnątrz instrukcji for w celu zapewnienia czytelności, aby zachować je wszystkie razem.
Adam Dally,
1
@Stefnotch Jeśli zastanawiasz się, znalazłem tę edycję, sprawdzając moje wywołania funkcji ... ale nie sądzę, żeby to była twoja intencja. Twoje porady są jednak nadal aktualne.
Adam Dally,
1
@ Paŭlo Ebermann Wykonuje alert dla każdego wiersza, ale możesz go zmienić na console.log, aby wykonać w konsoli, co dałoby 194 bajtów. Ponadto ostrzeżenie o całym tekście za jednym razem nie działa w Firefoksie, przynajmniej ... przycina dobre 5-10 wierszy.
Adam Dally,
1
@Stefnotch. Cóż, 1-x jest w tej chwili użyteczny.
Adam Dally
18

JavaScript ES6, 328 318 307 305 bajtów

Jest funkcją anonimową. Dodaj f=na początku, aby wykonać funkcję i f()wykonać.

x=>eval('s=o=>v=(o?o:" no more")+" bottle"+(1==o?"":"s");for(o="",i=99;i>0;)o+=`${s(i)}@ on the wall, ${v}@.\nTake one down, pass it around, ${s(--i)}@ on the wall.\n`;o+`No more bottles@ on the wall, no more bottles@.\nGo to the store and buy some more, 99 bottles@ on the wall.`'.replace(/@/g," of beer"))
Conor O'Brien
źródło
2
Pretty byłby o wiele bardziej interesujący, gdyby był to więcej niż tylko jeden długi ciąg konkatenacji
Sp3000,
9
Dlaczego losowa grafika ASCII została skopiowana z innej strony?
feersum,
7
Zwłaszcza, że ​​nie działa, ostrzega:,+No, on the wall,,. Go to the store and buy some more, 99 bottles of beer on the wall.
Użytkownik ogólny
14

C 197 196 bajtów

main(i){for(i=299;i--/3;printf("%d bottle%s of beer%s%s",i/3?:99,"s"+5/i%2,i%3?" on the wall":i^3?".\nTake one down and pass it around":".\nGo to the store and buy some more",~i%3?", ":".\n\n"));}

Myślę, że osiągnąłem limit tego podejścia.

xsot
źródło
1
"%d bottles of beer on the wallTake one down and pass it aroundGo to the store and buy some more,.\n"main(){for(;;)printf();}sam ma 126 bajtów, co oznacza twardą dolną granicę, chyba że ktoś znajdzie sposób na kompresję lub ponowne użycie części ciągów bez znaczącego obciążenia. Podejrzewam, że ogólnie osiągnąłeś limit podejść plus minus kilka bajtów.
Ray
12

Java 304 301 300 295 bajtów

Pierwszy raz zamieszczam odpowiedź. Słyszałem, że możemy użyć enum, ale nie mogliśmy znaleźć sposobu.

interface A{static void main(String[]a){String b=" of beer",c=" on the wall",n=".\n",s;for(int i=100;i-->1;s=" bottle"+(i>1?"s":""),System.out.println(i+s+b+c+", "+i+s+b+n+(i<2?"Go to the store and buy some more, 99":"Take one down and pass it around, "+(i-1))+" bottle"+(i!=2?"s":"")+b+c+n));}}

Nie golfił

interface A {
    static void main(String[] a) {
        String b = " of beer", c = " on the wall", n = ".\n", s;
        for (int i = 100; i-- > 1; s = " bottle" + (i > 1 ? "s" : ""), System.out.println(i + s + b + c + ", " + i + s + b + n + (i < 2 ? "Go to the store and buy some more, 99" : "Take one down and pass it around, " + (i - 1)) + " bottle" + (i != 2 ? "s" : "") + b + c + n));
    }
}

Dzięki quartata, J AtkiniBenjamin Urquhart

Yassin Hajaj
źródło
Można zapisać za pomocą 2 bajty i<2w miejscu i==1i i>2tutaj: i!=2.
J Atkin,
@JAtkin Dziękuję. W przypadku pierwszego jest w porządku, wyjście pozostaje takie samo. Ale po drugie, jeśli 99 bottle99 bottles
dokonam
1
Jak się okazuje, jest to dobre dla java, ale to nie działa dobrze dla groovy (213 vs 245 bajtów).
J Atkin,
1
Nie bardzo, groovy jest jednym z języków JVM. Dla większości aplikacji groovy kod jest krótszy niż kod Java, który robi to samo. goovy-lang.org
J Atkin
1
@BenjaminUrquhart Świetnie! Zmodyfikowałem to!
Yassin Hajaj
11

Szablony uważane za szkodliwe , 667 bajtów

Ap<Fun<Ap<Fun<Cat<Cat<Cat<Cat<Ap<A<1,1>,A<1>>,A<2,1>>,St<44,32>>,Ap<A<1,1>,A<1>>>,If<A<1>,Cat<Cat<Cat<Cat<St<46,10,84,97,107,101,32,111,110,101,32,100,111,119,110,32,97,110,100,32,112,97,115,115,32,105,116,32,97,114,111,117,110,100,44,32>,Ap<A<1,1>,Sub<A<1>,T>>>,A<2,1>>,St<46,10,10>>,Ap<A<0>,Sub<A<1>,T>>>,Cat<Cat<Cat<St<46,10,71,111,32,116,111,32,116,104,101,32,115,116,111,114,101,32,97,110,100,32,98,117,121,32,115,111,109,101,32,109,111,114,101,44,32>,Ap<A<1,1>,I<98>>>,A<2,1>>,St<46>>>>>,I<98>>>,Fun<Cat<Cat<Cat<Add<A<1>,T>,St<32,98,111,116,116,108,101>>,If<A<1>,St<'s'>,St<>>>,St<32,111,102,32,98,101,101,114>>>,St<32,111,110,32,116,104,101,32,119,97,108,108>>

Rodzaj rozwiniętej:

Ap<
    Fun<
        Ap<
            Fun<
                Cat<
                    Cat<Cat<Cat< Ap<A<1,1>,A<1>> , A<2,1> >, St<44,32> >, Ap<A<1,1>,A<1>> >,
                    If<A<1>,
                        Cat<Cat<Cat<Cat< St<46,10,84,97,107,101,32,111,110,101,32,100,111,119,110,32,97,110,100,32,112,97,115,115,32,105,116,32,97,114,111,117,110,100,44,32> , Ap<A<1,1>,Sub<A<1>,T>> >, A<2,1> >, St<46,10,10> >, Ap<A<0>,Sub<A<1>,T>> >,
                        Cat<Cat<Cat< St<46,10,71,111,32,116,111,32,116,104,101,32,115,116,111,114,101,32,97,110,100,32,98,117,121,32,115,111,109,101,32,109,111,114,101,44,32> , Ap<A<1,1>,I<98>> >, A<2,1> >, St<46> >
                    >
                >
            >,
            I<98>
        >
    >,
    Fun< Cat<Cat<Cat< Add<A<1>,T> , St<32,98,111,116,116,108,101> >, If<A<1>,St<'s'>,St<>>  >, St<32,111,102,32,98,101,101,114> > >,
    St<32,111,110,32,116,104,101,32,119,97,108,108>
>
feersum
źródło
11

Haskell, 228 223 bajtów

o=" of beer on the wall"
a n=shows n" bottle"++['s'|n>1]
b 1="Go to the store and buy some more, "++a 99
b n="Take one down and pass it around, "++a(n-1)
f=[99,98..1]>>= \n->[a n,o,", ",a n," of beer.\n",b n,o,".\n\n"]>>=id

Funkcja fzwraca ciąg z tekstem.

nimi
źródło
10

/// , 341 bajtów

/-/\/\///+/ bottle-)/\/&\/<\/
-(/\/\/?\/ ->/+s of beer-^/> on the wall-!/^,-$/>.
-@/$Take one down and pass it around,-#/^.
-*/?1@?0#<0!?0@-%/99!?9@?8#<8!?8@?7#<7!?7@?6#<6!?6@?5#<5!?5@?4#<4!?4@?3#<3!?3@?2#<2!?2@?1#<1!-&/?9#
%*-</
9(9/%*/</
8(8)7(7)6(6)5(5)4(4)3(3)2(2)1(1)0(0-
0/
- 0/ /#/1+s/1+/
% 01$Go to the store and buy some more, 099^.

Napisanie właściwego wyjaśnienia tego kodu wymagałoby 99 lat.

Prawdopodobnie po prostu podałbym wynik każdego etapu ...

Zasadniczo kompresuje to tekst wielokrotnie (jak każda odpowiedź w /// ).

Wypróbuj online!

Każdy etap dekompresji

Ponieważ zamiany, a następnie zamiany będą miały ciąg //, będą się pojawiać często.

Wydaje się dość często, że zdecydowałem się skompresować //do -.

Po dekompresji wynik jest następujący:

/+/ bottle//)/\/&\/<\/
//(/\/\/?\/ //>/+s of beer//^/> on the wall//!/^,//$/>.
//@/$Take one down and pass it around,//#/^.
//*/?1@?0#<0!?0@//%/99!?9@?8#<8!?8@?7#<7!?7@?6#<6!?6@?5#<5!?5@?4#<4!?4@?3#<3!?3@?2#<2!?2@?1#<1!//&/?9#
%*//</
9(9/%*/</
8(8)7(7)6(6)5(5)4(4)3(3)2(2)1(1)0(0//
0/
// 0/ /#/1+s/1+/
% 01$Go to the store and buy some more, 099^.

Ciąg bottlepojawił się tylko trzy razy, ale i tak go skompresowałem +:

/)/\/&\/<\/
//(/\/\/?\/ //>/ bottles of beer//^/> on the wall//!/^,//$/>.
//@/$Take one down and pass it around,//#/^.
//*/?1@?0#<0!?0@//%/99!?9@?8#<8!?8@?7#<7!?7@?6#<6!?6@?5#<5!?5@?4#<4!?4@?3#<3!?3@?2#<2!?2@?1#<1!//&/?9#
%*//</
9(9/%*/</
8(8)7(7)6(6)5(5)4(4)3(3)2(2)1(1)0(0//
0/
// 0/ /#/1 bottles/1 bottle/
% 01$Go to the store and buy some more, 099^.

Następnie )odpowiada /&/</znakowi nowej linii i (odpowiada //?/ , które są wzorcami, które będą często używane później:

/>/ bottles of beer//^/> on the wall//!/^,//$/>.
//@/$Take one down and pass it around,//#/^.
//*/?1@?0#<0!?0@//%/99!?9@?8#<8!?8@?7#<7!?7@?6#<6!?6@?5#<5!?5@?4#<4!?4@?3#<3!?3@?2#<2!?2@?1#<1!//&/?9#
%*//</
9//?/ 9/%*/</
8//?/ 8/&/</
7//?/ 7/&/</
6//?/ 6/&/</
5//?/ 5/&/</
4//?/ 4/&/</
3//?/ 3/&/</
2//?/ 2/&/</
1//?/ 1/&/</
0//?/ 0//
0/
// 0/ /#/1 bottles/1 bottle/
% 01$Go to the store and buy some more, 099^.

Teraz zdekompresowalibyśmy kilka użytecznych ciągów:

  • > dekompresuje do bottles of beer
  • ^ dekompresuje do bottles of beer on the wall
  • !dekompresuje do ^,, gdzie ^jest ten powyżej.
  • $dekompresuje do >.\n, gdzie >jest pierwszą zasadą i \njest nową linią.
  • @dekompresuje, $po Take one down and pass it around,czym $następuje reguła powyżej.

Rozpakowany kod staje się teraz:

/*/?1 bottles of beer.
Take one down and pass it around,?0 bottles of beer on the wall.
<0 bottles of beer on the wall,?0 bottles of beer.
Take one down and pass it around,//%/99 bottles of beer on the wall,?9 bottles of beer.
Take one down and pass it around,?8 bottles of beer on the wall.
<8 bottles of beer on the wall,?8 bottles of beer.
Take one down and pass it around,?7 bottles of beer on the wall.
<7 bottles of beer on the wall,?7 bottles of beer.
Take one down and pass it around,?6 bottles of beer on the wall.
<6 bottles of beer on the wall,?6 bottles of beer.
Take one down and pass it around,?5 bottles of beer on the wall.
<5 bottles of beer on the wall,?5 bottles of beer.
Take one down and pass it around,?4 bottles of beer on the wall.
<4 bottles of beer on the wall,?4 bottles of beer.
Take one down and pass it around,?3 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 bottles of beer on the wall.
<1 bottles of beer on the wall,//&/?9 bottles of beer on the wall.

%*//</
9//?/ 9/%*/</
8//?/ 8/&/</
7//?/ 7/&/</
6//?/ 6/&/</
5//?/ 5/&/</
4//?/ 4/&/</
3//?/ 3/&/</
2//?/ 2/&/</
1//?/ 1/&/</
0//?/ 0//
0/
// 0/ / bottles of beer on the wall.
/1 bottles/1 bottle/
% 01 bottles of beer.
Go to the store and buy some more, 099 bottles of beer on the wall.
Leaky Nun
źródło
9

Vim, 139 bajtów

Zapisano 6 bajtów z powodu xsot .

i, 99 bottles of beer on the wall.<ESC>YIGo to t<SO> store and buy some more<ESC>qa
3P2xgJX$12.+<CAN>YITake one down a<SO> pass it around<ESC>o<ESC>q98@adk?s
xn.n.ZZ

To moja pierwsza próba grania w polecenia Vima, choć podobno jest dość popularna . Uwzględniłem finał ZZw liczbie bajtów (zapis do pliku i wyjście), ponieważ wydaje się to być przyjętą normą.

Uwaga dodatkowa: misja zakończona .


Wyjaśnienie

Command                                    Effect
-------------------------------------------------------------------------------------------
i, 99 bottles of beer on the wall.<ESC>    insert text at cursor
Y                                          copy this line into buffer
IGo to t<SO> store and buy some more<ESC>  insert text at beginning of line
                                           auto-complete "the" (<Ctrl-N>, searches forward)
qa                                         begin recording macro into "a"
<LF>                                       move down one line (if present)
3P                                         paste 3 times before cursor
2x                                         delete 2 characters at cursor
gJ                                         join this line with next (without space between)
X                                          delete character before cursor
$                                          move to last non-whitespace character of line
12.                                        repeat the last edit command (X) 12 times
+                                          move to column 0 of next line
<CAN>                                      numeric decrement (<Ctrl-X>)
Y                                          copy this line into buffer
ITake one down a<SO> pass it around<ESC>   insert text at beginning of line
                                           auto-complete "and" (<Ctrl-N>, searches forward)
o<ESC>                                     insert text on new line
q                                          stop recording macro
98@a                                       repeat macro "a" 98 times
dk                                         delete upwards (this line and the one above it)
?s<LF>                                     move to previous /s/
x                                          delete character at cursor
n.n.                                       repeat last match and delete 2 times
ZZ                                         write to file and exit
primo
źródło
1
Niewielka poprawa:i99 bottles of beer on the wall.<ESC>Yqa3P$r,J5wDr.+<CAN>YITake one down and pass it around, <ESC>o<ESCjq98@aiGo to the store and buy some more, <ESC>kdk?s<LF>xnxnxZZ
xsot
@xsot dzięki za to. Jakoś całkowicie przeoczyłem /i ?.
primo
btw możliwe jest osiągnięcie 153 na anagolu z tą poprawą
xsot
@xsot mam to;)
primo
8

JavaScript ES6, 237 217 208 203 195 193 189 186 bajtów

Robi się dość trudne do golfa to ...
Edit 1: Ktoś całkowicie outgolfed mnie wygląda muszę starać, jeśli chcę mieć najlepszą odpowiedź Javascript.
Edycja 2: Szczerze mówiąc, nie mogę uwierzyć, że tyle udało mi się zagrać w golfa!

for(i=99,Y=" on the wall",o=k=>k+(i||99)+` bottle${i==1?'':'s'} of beer`;i;)alert(o``+Y+o`, `+o(--i?`.
Take one down and pass it around, `:`.
Go to the store and buy some more, `)+Y+`.`)

Czy gdzieś zepsułem? Przepraszam również za użycie alert, jeśli chcesz przetestować mój kod, zastąp go console.log.

Obecnie istnieje jeszcze jedna znacząca odpowiedź JavaScript: „99 butelek piwa” . Sprawdź to! :RE

Stefnotch
źródło
Ponownie sprawdzę twoje warunki i powinieneś być w stanie odciąć kilka bajtów. Jednak dobry wysiłek nadąża!
Adam Dally,
@AdamDally Ok !! : D Ale nie lubię kopiować rzeczy innych ludzi ... (
Czułbym
@AdamDally Tak, pomieszałem swoje funkcje i zaoszczędziłem sporo bajtów! (Przekreślona linia jest coraz dłuższa ...)
Stefnotch
Doskonały! O ile nie ma innej ścieżki, którą całkowicie przeoczyłem, czuję, że oboje zbliżamy się do końca.
Adam Dally
7

JavaScript ES6, 210 209 205 199 198 196 bajtów

s=""
for(i=299;--i>1;s+=`${i/3|0||99} bottle${5/i^1?"s":""} of beer`+(i%3?" on the wall":i^3?`.
Take one down and pass it around`:`.
Go to the store and buy some more`)+(~i%3?", ":`.

`));alert(s)

To jest nieprzetworzone tłumaczenie mojego zgłoszenia w języku C. Tak naprawdę nie znam javascript, więc jest zdecydowanie miejsce na ulepszenia.

Edycja: Zgrabne, odkryłem backticks

xsot
źródło
można wymienić console.logz alerti można użyć `zamiast”. Następnie można zastąpić \ n z nową linią. (kleszcze są stosowane do ciągów szablonów, te łańcuchy mogą mieć nowe linie ...) Również gratulacje dla mnie bić!
Stefnotch
1
Myślę, że zostawię wyjście w spokoju, chyba że ktoś inny mnie pokona, bo console.logłatwiej to przetestować. W każdym razie dzięki za wystawienie mnie na backticks!
xsot
Wohoo, wygram twój! Dziękujemy również za korzystanie z || w twoim kodzie na pewno się przydał ... (Meh, możesz to zmienić console.log, a moje zwycięstwo zostanie zredukowane do
zera
1
Nadążanie za wyzwaniem jest trudne! Niestety, interesujący byłby podział twojego kodu.
Adam Dally,
1
@AdamDally Zasadniczo, każdy wiersz jest podzielony na 3 części o następującej strukturze: %d bottle%s of beer%s%s. Indeks każdego wiersza (liczba butelek) oblicza się tak i/3|0, jak podczas gdy indeks każdego podłańcucha jest po prostu i%3.
xsot
7

Brainfuck, 743 bajtów

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

Wypróbuj online!

Powyżej używa zawijania komórek w kilku miejscach, aby zapisać instrukcje. Wykonałem również wersję bez opakowania w instrukcjach 755 .


Bez kompresji

Poniżej znajduje się poliglot w Brainfuck Annotation Language .

; byte sequence
; \n _ _ _ _ c \n comma space d t o l T G
++++++++++>>
--->++++>------>-->>++>+>>+>->++
[[>+++++++[>++>+>+<<<-]<-]+<+++]
>>>>>-->>-->>++>->+++[<]

c = 0
n = 100

>
while(n)
[
  n = n minus 1
  -<<
  N = str(n)
  ; first time \n _ becomes 9 9
  +[<->-----]<---[<[<]>[->]<]
  +<[>-]>[-<++++++++++<->>>]
  -[<->-----]<+++[<[<]>[+>]<]

  <->>>
  if(c)
  [
    >
    if(n)
    [
      'Take one down and'
      [>]<<<<.<<<<---.>>>-.<<<++++.<.>>>.-.<<.<.>-.>>+.<+++.>-.<<<.>---.>>.<<+++.
      ' pass it around' comma space
      <.>>>++.<<---.>----..<<.>>>>--.+++<<+.<<.>.>--.>-.<+++.->-.+<<+++.<<.>.<<<<-<
    ]>
    else
    [
      'Go to the store and'
      [>]<<<-.<<<.<<<.>>.>.<<<.>>.<++++.---.<.>>-.+.>.<--.<.<.>----.>>-.<<+++.
      ' buy some more' comma space
      <.>--.>+++.++++.<<.>>------.>+.--.<<+++.<.>>>.++.<-.++<.-<<.>.<<<<-
      N = '9'
      N
      <<<+++++++++.>>>
    ]
    <+>
  ]

  c = c plus 2
  <++

  while(c)
  [
    N
    <<[<]>[.>]>>>
    ' bottle'
    >>>.>--.>>.<..->>.<<<+++.<<<<
    if(n minus 1) 's'
    -[>>>>>.[<]]<[>]>+
    ' of beer'
    >>>.>>>.<<+.<.>----.+++..->-.++

    [<<]<-
    if(c minus 1)
    [
      ' on the wall'
      >>>>>.>>>.-.+<<<.>>.<++++.---.<.>>+++.---<----.+++>>>..[<<]
    ]

    <<[>]>-
    if(c minus 2)
    [
      period newline
      >>>>++.--<.<<<+
      if(c minus 1) newline
      [>>>.<<<<]>[>]<-<
    ]>>
    else
    [
      comma space
      >>.>.<<<<
    ]

    if(not n) c = c minus 2
    >[<<++>]

    c = c minus 1
    <[>]<-
  ]

  c = 1
  >+>
]
primo
źródło
6

Python 2, 204 bajty

n=198
while n:s="bottle%s of beer"%"s"[:n^2>1];print n%2*"GToa kteo  otnhee  dsotwonr ea nadn dp absusy  isto maer omuonrde,,  "[n>1::2]+`n/2or 99`,s,"on the wall"+[", %d %s."%(n/2,s),".\n"[:n]][n%2];n-=1

Specyfikacja jest dość nieokreślona pod względem białych znaków, więc tutaj zakładam, że ostatnia linia musi mieć jedną końcową nową linię. Jeśli specyfikacja wyjaśnia inaczej, zaktualizuję tę odpowiedź.

Jestem z tego całkiem zadowolony, ale patrząc na anarchię golfa czuję, że można w nią grać w golfa, być może z innym podejściem.

Sp3000
źródło
6

Labirynt , 1195 1190 932 bajtów

"{"9"
^ }
 ""
 <
 713.101.801..:611.111.89.23}!:({.23.44.001.011.711.111.411.79.23.611.501.23..:511.79.211.23.001.011.79.23.011.911.111.001.23.101.(.:111.23.101.701.79.48\.411..:101.89.23.201.111.23.511.101.801..:611.111.89.23}!:{.23.44..:801.79.911.23.101.401.611.23.(.:111.23.411..:101.89.23.201.111.23.511.101.801..:611.111.89.23}!:{
 _
 3`<
 _ ( 
""""
"
{(32.111.102.32.98.101:..114.32.111:.(.32.116.104.101.32.119.97.108:..46.\\49.32.98.111.116:..108.101.32.111.102.32.98.101:..114.32.111:.(.32.116.104.101.32.119.97.108:..44.32.49.32.98.111.116:..108.101.32.111.102.32.98.101:..114.46.\71.111.32.116.111.32.116.104.101.32.115:.).111.114.101.32.97.110.100.32.98.117.121.32.115.111.109.101.32.109.111.114.101.44.32.9!9!32.98.111.116:..108.101.115.32.111.102.32.98.101:..114.32.111:.(.32.116.104.101.32.119.97.108:..46.@
 )
 }
 <
 87\\.64..:801.79.911.23.101.401.611.23.(.:111.23.411..:101.89.23.201.111.23.511
 _
 3`<
 _ ( 
v"""

To trochę przesada ...

Podczas gdy Labirynt nie jest szczególnie dobry w drukowaniu ciągów znaków (ponieważ musisz wypychać wszystkie kody znaków), myślę, że powinno być możliwe zrobienie tego lepiej, stosując więcej, ale krótsze długie linie i jeszcze bardziej zwariowane z rotacją siatki.

Ponieważ uważam, że wszelkie ulepszenia gry w golfa znacząco zmienią strukturę tego kodu, poczekam z wyjaśnieniem, dopóki nie będę miał pomysłów, jak dalej grać w golfa.

Martin Ender
źródło
6

Python 2, 195

i=198
while i:s=`i/2or 99`+' bottle%s of beer'%'s'[1<i<4:];print['%s, '+s+'.','Take one down and pass it around, %s.\n',"Go to the store and buy some more, %s."][i%2+1/i]%(s+' on the wall');i-=1

Wziął i/2pomysł z odpowiedzi Sp3000 .

xnor
źródło
6

Pakiet Windows, 376 bajtów

Bardzo, bardzo długi i brzydki:

@echo off
setlocal enabledelayedexpansion
set B=bottles
set C=on the wall
set D=of beer
for /l %%* in (99,-1,1) do (
set A=%%*
if !A! EQU 1 set B=bottle
echo !A! !B! !D! !C!, !A! !B! !D!.
set /a A=!A!-1
if !A! EQU 1 set B=bottle
if !A! EQU 0 (
echo Go to the store and buy some more, 99 bottles !D! !C!.
) else (
echo Take one down and pass it around, !A! !B! !D! !C!.
echo.
))
Adnan
źródło
5

Python, 254 bajty

b,o,s,t="bottles of beer","on the wall","bottle of beer",".\nTake one down and pass it around,"
i=99;exec'print i,b,o+",",i,b+t,i-1,b,o+".\\n";i-=1;'*97
print"2",b,o+", 2",b+t+" 1",s,o+".\n\n1",s,o+", 1",s+".\nGo to the store, buy some more, 99",b,o+"."

Całkiem prosto, przypisz niektóre z najczęściej używanych wyrażeń, wypisz każdy bit od 99 do 3, a następnie wydrukuj ostatnie wiersze, dodając do siebie zmienne i niektóre ciągi.

Loovjo
źródło
5

Julia, 227 215 213 bajtów

w=" on the wall"
b=" bottles"
o=" of beer"
k=b*o
for n=99:-1:1
println("$n$k$w, $n$k.
$(n>1?"Take one down and pass it around":"Go to the store and buy some more"), $(n>1?"$(n-1)$(k=b*"\b"^(n<3)*o)":"99$b"o)$w.
")end

Wykorzystuje interpolację łańcuchową ( "$variable") i trójskładniki, aby skonstruować dane wyjściowe i wydrukować je do STDOUT.

Zaoszczędź 14 bajtów dzięki Glen O!

Alex A.
źródło
1
Zamiast tego (n>1?" bottles":" bottle")" of beer"użyj " bottle""s"^(n>1)*" of beer"- zauważ, że *jest to konieczne po, (n<1)ponieważ w przeciwnym razie próbuje zastosować (n>1)" of beer"jako moc. Ponadto, czy jest jakaś korzyść z używania while n>0nad for n=99:-1:1(co pozwala na uproszczenie warunku na końcu i pozwala uniknąć osobnej potrzeby n=99)?
Glen O
Użyj również nowych znaków zamiast \ni przełącz środkową część na interpolację (zamiast ",n>1?...",", użyj $(n>1?...")), aby zapisać znak, i przenieś , wnętrze warunku na przed następną częścią, więc wystarczy napisać tylko raz.
Glen O
Właściwie, zasugeruj czas na zakończenie - właśnie zdałem sobie sprawę, że będziesz musiał odjąć jeden, robiąc ostatni numer w każdym wersecie, więc nie ma żadnej korzyści netto.
Glen O
@GlenO Dziękuję jak zawsze za wspaniałe sugestie!
Alex A.,
1
Miałem nadzieję, że będę mógł po prostu zasugerować zmianę - to trochę głupie, że nie pozwala na tę opcję, jeśli masz wystarczającą liczbę przedstawicieli, aby dokonać edycji bez zgody pierwotnego odbiorcy. Przepraszam, jeśli zrobiłem to w jakikolwiek sposób. Właśnie przesunąłem ocenę części „butelka <s> piwa” na koniec, więc trzeba to zrobić tylko raz i zainicjować. Użyłem również backspace zamiast warunkowych „s”, aby trochę zaoszczędzić.
Glen O,
5

JavaScript ES6, 214 bajtów

Edycja: Usunięto cały poprzedni kod, przeglądaj zmiany, jeśli chcesz zobaczyć starszy kod.

Ograniczone wyskakujące okienka:

p='.';o=" of beer";e=o+" on the wall";i=99;u=m=>i+" bottle"+(i==1?'':'s');while(i>0){alert(u()+e+", "+u()+o+p+(--i>0?"Take one down and pass it around, "+u()+e:"Go to the store and buy some more, 99 bottles"+e)+p)}

Rozszerzony:

p='.';
o=" of beer";
e=o+" on the wall";
i=99;
u=m=>i+" bottle"+(i==1?'':'s');
while(i>0){
    alert(u()+e+", "+u()+o+p+(--i>0?"Take one down and pass it around, "+u()+e:"Go to the store and buy some more, 99 bottles"+e)+p)
}

@commenters: Dziękujemy za pomysł funkcji strzałek, zapisane 15 bajtów

W przypadku piwa nieskończonego użyj tego kodu, 212 bajtów

p='.';o=" of beer";e=o+" on the wall";i=99;u=m=>i+" bottle"+(i==1?'':'s');while(i>0){alert(u()+e+", "+u()+o+p+(--i>0?"Take one down and pass it around, "+u()+e:"Go to the store and buy some more, "+u(i=99)+e)+p)}
ŽaMan
źródło
1
Nie mogę uruchomić kodu, jakiej przeglądarki / środowiska używasz? „SyntaxError: brakuje; przed instrukcją” Spójrz także na funkcje strzałek!
Stefnotch
Zajęło mi chwilę, aby znaleźć błąd składni, +o'ponieważ został on zmieniony na +o+'. Widziałem także okazję do zmiany pętli i odpowiedzi.
Sprawdzę
1
232 bajty dla ostatniego rozwiązania:b=a=>a+" bottle"+(1<a?"s":"");for(i=100;100>--i;)l="\n",p="."+l,o=" of beer",e=o+" on the wall",alert(l+b(i)+e+", "+b(i)+o+p+(1<i?"Take one down and pass it around, "+b(i-1)+e:"Go to the store and buy some more, "+b((i=100)-1)+e)+p)
Użytkownik ogólny
Po krótkiej zabawie trzymam się mojej whilepętli i wkrótce opublikuję wynikowy kod. Dziękujemy za recenzję kodu! :)
ŽaMan,
5

CJam, 149 148 146 144 138 137 137 bajtów

00000000: 39 39 7b 5b 22 2c 2e 22 22 01 bd 8f 2d b4 49 b5 f5  99{[",.""...-.I..
00000011: 9d bd 21 e8 f2 72 27 df 4d 4f 22 7b 32 36 39 62 32  ..!..r'.MO"{269b2
00000022: 35 62 27 61 66 2b 27 6a 53 65 72 28 65 75 5c 2b 2a  5b'af+'jSer(eu\+*
00000033: 7d 3a 44 7e 4e 4e 32 24 32 3e 29 34 24 4a 3c 5c 4e  }:D~NN2$2>)4$J<\N
00000044: 5d 73 27 78 2f 39 39 40 2d 73 2a 7d 2f 27 73 2d 5d  ]s'x/99@-s*}/'s-]
00000055: 22 07 9c 4b a2 4e 15 d7 df d5 82 88 c9 d9 a7 ad 37  "..K.N..........7
00000066: 16 7e 76 22 44 33 35 2f 28 5d 22 41 90 1d b1 f3 69  .~v"D35/(]"A....i
00000077: ba 3d 05 45 81 50 af 07 e4 1b 38 f7 19 22 44        .=.E.P....8.."D

Powyższy zrzut heksowy można odwrócić za pomocą xxd -r. Wypróbuj online w interpretatorze CJam .

Kosztem 9 dodatkowych bajtów, w sumie 143 bajtów , możemy uniknąć znaków niedrukowalnych:

99{[", X bottles of beer on the wall."NN2$2>)4$J<\N]s'X/99@-s*}/'s-]"Take one down and pass it around"*35/("Go to the store and buy some more"\

Jak to działa

99{         e# For each I in [0 ... 98]:
  [         e# 
    ",."    e#     Push that string.
    "…"     e#     Push a string.
    {       e#     Define a decoder function:
      269b  e#       Convert the string from base 269 to integer.
      25b   e#       Convert from integer to base 25.
      'af+  e#       Add 'a' to each base-25 digit.
      'jSer e#       Replace j's with spaces.
      (     e#       Shift the first character from the resulting string.
      eu    e#       Convert it to uppercase.
      \+    e#       Prepend it to the remaining string.
      *     e#       Join the string/array on the stack, using the 
            e#       generated string as delimiter.
    }:D~    e#     Name the function D and execute it.
            e#     This pushes ", x bottles of beer on the wall.".
    NN      e#     Push two linefeeds.
    2$      e#     Push a copy of the generated string.
    2>)     e#     Discard the first two characters and pop the dot.
    4$      e#     Push another copy of the generated string.
    J<      e#     Discard all but the first 19 characters.
            e#     This pushes ", x bottles of beer on the wall".
    \N      e#     Swap the string with the dot and push a linefeed.
  ]s        e#   Collect in an array and cast to string.
  'x/       e#   Split at occurrences of 'x'.
  99@-      e#   Rotate I on top of 99 and compute their difference.
  s*        e#   Cast to string and and join.
            e#   This replaces x's with 99-I.
}/          e#
's-         e# Remove all occurrences of 's' for the last generated string.
]           e# Wrap the entire stack in an array.
"…"D        e# Join the array with separator "Take one down and pass it around".
35/(        e# Split into chunks of length 35 and shift out the first.
            e# This shifts out ", 99 bottles of beer on the wall.\n\n".
]           e# Wrap the modified array and shifted out chunk in an array.
"…"D        e# Join the array with separator "Go to the store and buy some more".
Dennis
źródło
Baza 259 ? Ciekawy.
lirtosiast
Baza 256 miała zwroty karetki, które nie działają z tłumaczem online. Na szczęście baza 259 nie wytwarza znaków spoza zakresu ISO 8559-1.
Dennis
Zakładałem, że CJam będzie o co najmniej 2 bajty krótszy niż GolfScript - prawie trywialnie. Nie spodziewał się jednak 137!
primo
1
@primo Aby być uczciwym, większość oszczędności pochodzi z konwersji podstawowej. Niestety basedwukrotne użycie już dodaje 8 bajtów w GolfScript ...
Dennis,
5

C, 303 299 297 bajtów

#define B"%d bottle%s of beer"    
#define O" on the wall"
#define P printf(
#define V(n,m,S)q(n);P O);P", ");q(n);P S);q(m);P".\n");
*s[]={"","s"};q(n){P B,n,s[n>1]);}main(){for(int i=99;--i;){V(i+1,i,".\nTake one down and pass it around, ")P"\n");}V(1,99,".\nGo to the store and buy some more, ");}

Kompiluj z gcc -std=c99 -w.

firefrorefiddle
źródło
1
Golf w dół do 300 bajtów: ... for (int i = 99; - i;) {V (i + 1, i, "....
Glenn Randers-Pehrson
@ GlennRanders-Pehrson Thanks. Usunąłem także podział wiersza przed main ().
fireforefiddle
5

GolfScript, 143 bajty

[99.{[', '\.' bottle''s of beer'@(:i!>' on the wall''.
'n].1>~;5$4<\'Take one down and pass it around'i}**'Go to the store and buy some more'](

Nadal może być miejsce na ulepszenia. Myślę, że zbliżam się do ostatecznej wersji.

primo
źródło
3
Właśnie poprawiłem rekord golfowego anagolu o 12 bajtów.
primo
5

Mathematica, 238 226 222 224 bajty

Zaoszczędził kilka bajtów dzięki Martinowi Büttnerowi.

a={ToString@#," bottle",If[#<2,"","s"]," of beer"}&;b=a@#<>" on the wall"&;Echo[{b@n,", ",a@n,".
"}<>If[n<2,"Go to the store and buy some more, "<>b@99<>".","Take one down and pass it around, "<>b[n-1]<>".
"]]~Do~{n,99,1,-1}
alephalpha
źródło
5

Brainfuck, 4028 bajtów

To jest dość ohydne. Dużo duplikacji i bardzo nieefektywne, więc nie zdobędzie żadnych nagród. Jednak zacząłem go i byłem zdeterminowany, aby go ukończyć.

Mogę spróbować to poprawić, ale prawdopodobnie nie, bo szczerze mówiąc, mój mózg jest pieprzony.

Grał w golfa

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

Nie golfił

# SETUP COUNTERS
>>+++[-<+++<+++>>]
>>++++++[-<++++++++++<++++++++++>>]<---<--->>

# SETUP CONSTANTS
>+++++[-<++++++>]<++>
>++++++++++[-<++++++++++>]<-->        # B
>++++++++++[-<+++++++++++>]<+>        # O
>++++++++++[-<++++++++++>]<+>         # E
>++++++++++[-<++++++++++>]<++>        # F
>++++++++++[-<+++++++++++>]<++++++>   # T
>++++++++++[-<++++++++++>]<++++>      # H
>++++++++++[-<+++++++++++>]<-->       # L
>++++++++++[-<+++++++++++>]<++++>     # R
>++++++++++[-<+++++++++++>]<+++++>    # S
>++++++++++[-<+++++++++++>]           # N
>++++++++++[-<+++++++++++>]<+++++++++># W
>++++++++++[-<++++++++++>]<--->       # A
>+++++[-<++++++>]<++>                 # SPACE
>++++[-<++++++++++++>]<---->          # Comma
>++++[-<++++++++++++>]<-->            # Stop
++++++++++>                           # Newline
>++++++++++[-<+++++++++++>]<--->      # K
>++++++++++[-<++++++++++>]            # D
>++++++++++[-<+++++++++++>]<++>       # P
>++++++++++[-<++++++++++>]<+++++>     # I
>++++++++++[-<+++++++++++>]<+++++++   # U

# BACK TO START
<<<<<<<<<<<<<<<<<<<<<<<<<
[>
    [
        -> # Dec x0 counter
        .> # Print 0x char
        .> # Print x0 char
        .>
        .>.>>>..>>.<<<<.>>>>>>. # Bottles
        <<<<<<<<<.
        >>.>>.       # Of
        <<<<.
        >.>>..>>>>>. # Beer
        <<<<<<<<.
        >>.>>>>>>>>. # On
        >>>.
        <<<<<<<<.>.<<<. # The
        <<<.
        >>>>>>>>>>>.>.<<<<<.. # Wall
        >>>>>>>.     # Comma
        <.
        <<<<<<<<<<<<<<<.>.- # Counter with decrement
        >.
        >.>.>>>..>>.<<<<.>>>>>>. # Bottles
        <<<<<<<<<.
        >>.>>.       # Of
        <<<<.
        >.>>..>>>>>. # Beer
        >>>>>>>.     # Stop
        >.           # Newline
        <<<<<<<<<<<.>>>>>>>.>>>>>.<<<<<<<<<<<<<<. # Take
        <<<.
        >>.>>>>>>>>.<<<<<<<. # One
        <<<.
        >>>>>>>>>>>>>>>>>>.<<<<<<<<<<<<<<<<.>>>>>>>>>.<. # Down
        >>>. 
        <.<<.>>>>>>>>.  # And
        <<<<<.
        >>>>>>.<<<<<<<.<<<..    # Pass
        >>>>.
        >>>>>>>.<<<<<<<<<<<<<<<. # It
        >>>>>>>>.
        <.<<<<.<<<<<<.>>>>>>>>>>>>>>>>>>>.<<<<<<<<<<<.>>>>>>>>. # Around
        <<<<. # Comma
        <.
        <<<<<<<<<<<<<<<.>. # 0x and x0
        >.
        >.>.>>>..>>.<<<<.>>>>>>. # Bottles
        <<<<<<<<<.
        >>.>>.  # Of
        <<<<.
        >.>>..>>>>>. # Beer
        <<<<<<<<.
        >>.>>>>>>>>. # On
        >>>.
        <<<<<<<<.>.<<<. # The
        <<<.
        >>>>>>>>>>>.>.<<<<<.. # Wall
        >>>>>>>>.    # Stop
        >..   # Newline x2
        <<<<<<<<<<<<<<<<<<<      # Reset loop
    ]
    <-
    >+++++++++
    >.>.
    >.
    >.>.>>>..>>.<<<<.>>>>>>. # Bottles
    <<<<<<<<<.
    >>.>>.       # Of
    <<<<.
    >.>>..>>>>>. # Beer
    <<<<<<<<.
    >>.>>>>>>>>. # On
    >>>.
    <<<<<<<<.>.<<<. # The
    <<<.
    >>>>>>>>>>>.>.<<<<<.. # Wall
    >>>>>>>.     # Comma
    <.
    <<<<<<<<<<<<<<<.- # 0x with decrement
    >.+++++++++ # x0 with increment
    >.
    >.>.>>>..>>.<<<<.>>>>>>. # Bottles
    <<<<<<<<<.
    >>.>>.       # Of
    <<<<.
    >.>>..>>>>>. # Beer
    >>>>>>>.     # Stop
    >.           # Newline
    <<<<<<<<<<<.>>>>>>>.>>>>>.<<<<<<<<<<<<<<. # Take
    <<<.
    >>.>>>>>>>>.<<<<<<<. # One
    <<<.
    >>>>>>>>>>>>>>>>>>.<<<<<<<<<<<<<<<<.>>>>>>>>>.<. # Down
    >>>. 
    <.<<.>>>>>>>>.  # And
    <<<<<.
    >>>>>>.<<<<<<<.<<<..    # Pass
    >>>>.
    >>>>>>>.<<<<<<<<<<<<<<<. # It
    >>>>>>>>.
    <.<<<<.<<<<<<.>>>>>>>>>>>>>>>>>>>.<<<<<<<<<<<.>>>>>>>>. # Around
    <<<<. # Comma
    <.
    <<<<<<<<<<<<<<<.>. # Counter
    >.
    >.>.>>>..>>.<<<<.>>>>>>. # Bottles
    <<<<<<<<<.
    >>.>>.  # Of
    <<<<.
    >.>>..>>>>>. # Beer
    <<<<<<<<.
    >>.>>>>>>>>. # On
    >>>.
    <<<<<<<<.>.<<<. # The
    <<<.
    >>>>>>>>>>>.>.<<<<<.. # Wall
    >>>>>>>>.    # Stop
    >..   # Newline x2
    <<<<<<<<<<<<<<<<<<<<      # Reset outer loop
]
>-- # Decrement counter to only count from 7
# Last 8 loop
[
    -> # Dec counter
    >. # Print x0 char    
    >.
    >.>.>>>..>>.<<<<.>>>>>>. # Bottles
    <<<<<<<<<.
    >>.>>.       # Of
    <<<<.
    >.>>..>>>>>. # Beer
    <<<<<<<<.
    >>.>>>>>>>>. # On
    >>>.
    <<<<<<<<.>.<<<. # The
    <<<.
    >>>>>>>>>>>.>.<<<<<.. # Wall
    >>>>>>>.     # Comma
    <.
    <<<<<<<<<<<<<<.- # x with decrement
    >.
    >.>.>>>..>>.<<<<.>>>>>>. # Bottles
    <<<<<<<<<.
    >>.>>.       # Of
    <<<<.
    >.>>..>>>>>. # Beer
    >>>>>>>.     # Stop
    >.           # Newline
    <<<<<<<<<<<.>>>>>>>.>>>>>.<<<<<<<<<<<<<<. # Take
    <<<.
    >>.>>>>>>>>.<<<<<<<. # One
    <<<.
    >>>>>>>>>>>>>>>>>>.<<<<<<<<<<<<<<<<.>>>>>>>>>.<. # Down
    >>>. 
    <.<<.>>>>>>>>.  # And
    <<<<<.
    >>>>>>.<<<<<<<.<<<..    # Pass
    >>>>.
    >>>>>>>.<<<<<<<<<<<<<<<. # It
    >>>>>>>>.
    <.<<<<.<<<<<<.>>>>>>>>>>>>>>>>>>>.<<<<<<<<<<<.>>>>>>>>. # Around
    <<<<. # Comma
    <.
    <<<<<<<<<<<<<<. # Count
    >.
    >.>.>>>..>>.<<<<.>>>>>>. # Bottles
    <<<<<<<<<.
    >>.>>.  # Of
    <<<<.
    >.>>..>>>>>. # Beer
    <<<<<<<<.
    >>.>>>>>>>>. # On
    >>>.
    <<<<<<<<.>.<<<. # The
    <<<.
    >>>>>>>>>>>.>.<<<<<.. # Wall
    >>>>>>>>.    # Stop
    >..   # Newline x2
    <<<<<<<<<<<<<<<<<<<     # Reset loop
]
# Last but 1 exception
>>. # Counter
>.
>.>.>>>..>>.<<<<.>>>>>>. # Bottles
<<<<<<<<<.
>>.>>.       # Of
<<<<.
>.>>..>>>>>. # Beer
<<<<<<<<.
>>.>>>>>>>>. # On
>>>.
<<<<<<<<.>.<<<. # The
<<<.
>>>>>>>>>>>.>.<<<<<.. # Wall
>>>>>>>.     # Comma
<.
<<<<<<<<<<<<<<.- # x with decrement
>.
>.>.>>>..>>.<<<<.>>>>>>. # Bottles
<<<<<<<<<.
>>.>>.       # Of
<<<<.
>.>>..>>>>>. # Beer
>>>>>>>.     # Stop
>.           # Newline
<<<<<<<<<<<.>>>>>>>.>>>>>.<<<<<<<<<<<<<<. # Take
<<<.
>>.>>>>>>>>.<<<<<<<. # One
<<<.
>>>>>>>>>>>>>>>>>>.<<<<<<<<<<<<<<<<.>>>>>>>>>.<. # Down
>>>. 
<.<<.>>>>>>>>.  # And
<<<<<.
>>>>>>.<<<<<<<.<<<..    # Pass
>>>>.
>>>>>>>.<<<<<<<<<<<<<<<. # It
>>>>>>>>.
<.<<<<.<<<<<<.>>>>>>>>>>>>>>>>>>>.<<<<<<<<<<<.>>>>>>>>. # Around
<<<<. # Comma
<.
<<<<<<<<<<<<<<. # Count
>.
>.>.>>>..>>.<<<<. # Bottle
<<<.
>>.>>.  # Of
<<<<.
>.>>..>>>>>. # Beer
<<<<<<<<.
>>.>>>>>>>>. # On
>>>.
<<<<<<<<.>.<<<. # The
<<<.
>>>>>>>>>>>.>.<<<<<.. # Wall
>>>>>>>>.    # Stop
>..   # Newline x2
# Last 1 exception
<<<<<<<<<<<<<<<<<. # Counter
>.
>.>.>>>..>>.<<<<. # Bottle
<<<.
>>.>>.       # Of
<<<<.
>.>>..>>>>>. # Beer
<<<<<<<<.
>>.>>>>>>>>. # On
>>>.
<<<<<<<<.>.<<<. # The
<<<.
>>>>>>>>>>>.>.<<<<<.. # Wall
>>>>>>>.     # Comma
<.
<<<<<<<<<<<<<<.++++++++ # x with reset to 99
>.
>.>.>>>..>>.<<<<. # Bottle
<<<.
>>.>>.       # Of
<<<<.
>.>>..>>>>>. # Beer
>>>>>>>.     # Stop
>.           # Newline
>----        # Change K to G
>>+++++++++  # Change P to Y
>++++        # Change I to M
<<<.<<<<<<<<<<<<<<<. # Go
<<.
>>>>>.<<<.           # To
<<.
>>>>>.>.<<<.         # The
<<<.
>>>>>>>>>.<<<<.<<<.>>>>>>.<<<<<. # Store
<<<.
>>>>>>>>>>>>.<<.>>>>>>>>.       # And
<<<<<.
<<<<<<<<<<<<.>>>>>>>>>>>>>>>>>>>>.<<. # Buy
<<<<<<.
<<<<.<<<<<<<.>>>>>>>>>>>>>>>>>>.<<<<<<<<<<<<<<<<<. # Some
>>>>>>>>>>.
>>>>>>>.<<<<<<<<<<<<<<<<<<.>>>>>>.<<<<<. # More
>>>>>>>>>>>.
<.
<<<<<<<<<<<<<<..  # 99
>.
>.>.>>>..>>.<<<<.>>>>>>. # Bottles
<<<<<<<<<.
>>.>>.  # Of
<<<<.
>.>>..>>>>>. # Beer
<<<<<<<<.
>>.>>>>>>>>. # On
>>>.
<<<<<<<<.>.<<<. # The
<<<.
>>>>>>>>>>>.>.<<<<<.. # Wall
>>>>>>>>.    # Stop
>.   # Newline x2

Wynik:

Spróbuj sam tutaj!
OK, więc wygląda na to, że adres URL jest za długi, aby go tu umieścić, więc musisz go skopiować / wkleić, aby wypróbować go samodzielnie.

Przetestowałem to za pomocą tego interpretera .

Hywel Rees
źródło
4

PHP, 251 bajtów

To wyjaśnia problem liczby mnogiej / pojedynczej.

<?php for($i=99;$i>0;$i--){$b=" of beer";$s=" bottles$b";$r=" bottle$b";$w=" on the wall";$h=$i-1;echo$h>=1?"$i$s$w, $i$s.\nTake one down and pass it around, $h".($h<2?$r:$s)."$w.\n\n":"$i$r$w, $i$r. \nGo to the store and buy some more, 99$s$w.\n\n";}

Czytelny:

for ($i=99; $i > 0; $i--) {
  $b = " of beer";
  $s = " bottles$b";
  $r = " bottle$b";
  $w = " on the wall";
  $h = $i - 1;
  echo $h >= 1 ? "$i$s$w, $i$s.\nTake one down and pass it around, $h" . ($h<2 ? $r : $s) . "$w.\n\n" : "$i$r$w, $i$r. \nGo to the store and buy some more, 99$s$w. \n\n";
}
Sven
źródło
4

Belka , 1141 1109 bajtów

Nadal mam dużo miejsca na grę w golfa ze wszystkimi pustymi przestrzeniami, ale bardzo trudno jest je śledzić i łatwo się psuje :) Jest bardzo podobny do tego, który napisałem na to pytanie , z wyjątkiem tego , że trafia do sklepu zanim piwo osiągnie 1, a komórki użyte do parametrów zostały przesunięte. Zmieniłem także znacznie układ. Spróbuję wyjaśnić, gdy wypróbuję jeszcze kilka układów.

P'P''''>`++++++)++'''P>`+++++++++++++)'''''''''''P+++++++++++++`P```>`++\ v@@++++++++++L(`<@+p'''''''''PL<
v``P''(++++++`<P'''''''''(++++++++`<L```P'+++++P'+++P'++++++P'++++P''''(/> p++@---@``p@'''''p+++@`> `)''' 'p-@''p\
>''p:'p@'p@'\>n'   >`>`)'''p@''''p@\>n'''p@''''p@-@````p@'''''p@`>`)'''''/v  `P+p``@p'''(`<@-p''''''''P'+up(`<`@@/
^/``@@p'@p''/ >'''\ /-p'@p'@p``@p``/`>-'P''''''''p+@>`)''p`n`L++++++++++@S 'p@````p@````p@'''''p@`p@````p@'''''p@```p++@---@``p@'''''p-@+@`p@+++@``p-@``p@'p-@'''p-@```p++@`p@'p@''''p+@++++@`````p@'''''p-@`p@--@``p-@``p@''''p--@p@+++@``p-@''''p-@>`)'''p@'p+:`p@'p@'''p@'p@@``p@`p-@'''p-@`>`)'''p@''''p@``p@``p@'p@'p-@@'''p--@`>`)'''p@''''p@-@````p@'''''p@`>`)'''''p++@---@``p@'''''p+++@`>`)''''p-@''p@@'''p+@H
^\p@`p-@```p`//'''/ \@@'''p--@`>`)'p/``````@pS@++++++++++L`<vP+p`P-p`P-p`@ p'''(`<@-p''''@--p``@-p`@+p'@p`@--p''''@-p'@p`````@p'''@+++p''@p```\
^             \'p-@/v               \ p-@''p-@`p-@``p@''''p@ -@``p-@``p@'p ++@'''p@'p+++@`p-@````p@'p-@'''p-@```p++@`p@''''p+@```p-@''''p-@@``/
^                   <                                       <             <

Wypróbuj go we fragmencie stosu tutaj

MickyT
źródło
4

PHP, 250 246 244 233 228 bajtów

Uważam, że jest to jak dotąd najmniejszy. Jest to oparte na strzale 247, z pewnymi modyfikacjami w celu dalszej minimalizacji.

Zminimalizowane

<?php $b=99;function x($n){return"$n bottle".($n-1?'s':'')." of beer";}$y=" on the wall";while($b){$c=x($b);echo"$c$y, $c.\n",--$b?"Take one down and pass it around":"Go to the store and buy some more",", ".x($b?:99)."$y.\n\n";}

Rozszerzony

<?php

$b=99;
function x($n){return"$n bottle".($n-1?'s':'')." of beer";}
$y=" on the wall";
while(b){
    $c=x($b);
    echo"$c$y, $c.\n",--$b?"Take one down and pass it around":"Go to the store and buy some more",", ".x($b?:99)."$y.\n\n";
}
Phroggyy
źródło
1
Ponieważ możesz uruchamiać PHP z wiersza poleceń, php -rktóry jest równoważny perl -ei podobny, można pominąć znacznik otwierający. Zobacz pokrewną dyskusję w Uruchamianie PHP z -rzamiast znaczników kodu .
manatwork
Ach, dzięki @manatwork, myślę, że mógłbym jeszcze bardziej zdjąć mój.
Phroggyy,
while($b)działa równie dobrze.
od
Na końcu jest jednak nowa linia.
od
Dzięki za całą sugestię! Nowa linia jest jednak wymagana, aby między wierszami była linia
Phroggyy,