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 N
jest 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
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 64198; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 36670; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "//api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "//api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(42), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Odpowiedzi:
C #,
285298289 bajtów(Moja pierwsza próba gry w golfa Code ...)
Nieco golfista:
źródło
" bottle"
argumentem formatu, chociaż jestem pewien, że jest lepszy sposób, mając 3 przypadki butelki boli mnie oczy ...b==1
można zastąpićb<2
.for(int b = 100; b--> 1;)
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
0
s).Jest to najkrótszy możliwy program w kodzie maszynowym Motorola MC14500B. Składa się wyłącznie
1000
a1001
(8
i9
, 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
Rejestr zaczyna się od
0
.Ciekawostki dotyczące kodu
Szesnastkowy jest 93,224
8
s i9
s długo.Binarny jest 745,792
1
s i0
s długo.Użyłem kodu Python 2 poniżej do wygenerowania kodu. Wprowadź dane
0
binarne i1
szesnastkowe.źródło
Vitsy, 0 bajtów
Poważnie nic na mnie nie ma. (@Mego przepraszam.;))
Wypróbuj online! (Wystarczy nacisnąć „Uruchom”)
źródło
Poważnie , 1 bajt
Jeśli stos jest pusty (który jest na początku),
N
wypycha słowa. Następnie są domyślnie drukowane na EOF.Dzięki @Mego za naprawienie poważnie interpretera.
źródło
N
:)JavaScript ES6,
230218198196192188185 bajtówPo prostu odetnij kilka bajtów, jednocześnie zachowując czystość i zrozumiałość.
3 najnowsze wersje:
źródło
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+".")
JavaScript ES6,
328318307305 bajtówJest funkcją anonimową. Dodaj
f=
na początku, aby wykonać funkcję if()
wykonać.źródło
,+No, on the wall,,. Go to the store and buy some more, 99 bottles of beer on the wall.
C
197196 bajtówMyślę, że osiągnąłem limit tego podejścia.
źródło
"%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.Java
304301300295 bajtówPierwszy raz zamieszczam odpowiedź. Słyszałem, że możemy użyć enum, ale nie mogliśmy znaleźć sposobu.
Nie golfił
Dzięki
quartata
,J Atkin
iBenjamin Urquhart
źródło
i<2
w miejscui==1
ii>2
tutaj:i!=2
.99 bottle
99 bottles
Szablony uważane za szkodliwe , 667 bajtów
Rodzaj rozwiniętej:
źródło
Haskell,
228223 bajtówFunkcja
f
zwraca ciąg z tekstem.źródło
/// , 341 bajtów
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:
Ciąg
bottle
pojawił się tylko trzy razy, ale i tak go skompresowałem+
:Następnie
)
odpowiada/&/</
znakowi nowej linii i(
odpowiada//?/
, które są wzorcami, które będą często używane później:Teraz zdekompresowalibyśmy kilka użytecznych ciągów:
>
dekompresuje dobottles of beer
^
dekompresuje dobottles of beer on the wall
!
dekompresuje do^,
, gdzie^
jest ten powyżej.$
dekompresuje do>.\n
, gdzie>
jest pierwszą zasadą i\n
jest nową linią.@
dekompresuje,$
poTake one down and pass it around,
czym$
następuje reguła powyżej.Rozpakowany kod staje się teraz:
źródło
Vim, 139 bajtów
Zapisano 6 bajtów z powodu xsot .
To moja pierwsza próba grania w polecenia Vima, choć podobno jest dość popularna . Uwzględniłem finał
ZZ
w liczbie bajtów (zapis do pliku i wyjście), ponieważ wydaje się to być przyjętą normą.Uwaga dodatkowa: misja zakończona .
Wyjaśnienie
źródło
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
/
i?
.JavaScript ES6,
237 217 208 203 195 193 189186 bajtówRobi 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!
Czy gdzieś zepsułem? Przepraszam również za użycie
alert
, jeśli chcesz przetestować mój kod, zastąp goconsole.log
.Obecnie istnieje jeszcze jedna znacząca odpowiedź JavaScript: „99 butelek piwa” . Sprawdź to! :RE
źródło
JavaScript ES6,
210209205199198196 bajtówTo 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
źródło
console.log
zalert
i 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ć!console.log
łatwiej to przetestować. W każdym razie dzięki za wystawienie mnie na backticks!console.log
, a moje zwycięstwo zostanie zredukowane do%d bottle%s of beer%s%s
. Indeks każdego wiersza (liczba butelek) oblicza się taki/3|0
, jak podczas gdy indeks każdego podłańcucha jest po prostui%3
.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 .
źródło
Python 2, 204 bajty
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.
źródło
Labirynt ,
11951190932 bajtówTo 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.
źródło
Python 2, 195
Wziął
i/2
pomysł z odpowiedzi Sp3000 .źródło
Pakiet Windows, 376 bajtów
Bardzo, bardzo długi i brzydki:
źródło
Python, 254 bajty
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.
źródło
Julia,
227215213 bajtówWykorzystuje 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!
źródło
(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żywaniawhile n>0
nadfor n=99:-1:1
(co pozwala na uproszczenie warunku na końcu i pozwala uniknąć osobnej potrzebyn=99
)?\n
i 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.JavaScript ES6, 214 bajtów
Ograniczone wyskakujące okienka:
Rozszerzony:
@commenters: Dziękujemy za pomysł funkcji strzałek, zapisane 15 bajtów
W przypadku piwa nieskończonego użyj tego kodu, 212 bajtów
źródło
+o'
ponieważ został on zmieniony na+o+'
. Widziałem także okazję do zmiany pętli i odpowiedzi.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)
while
pętli i wkrótce opublikuję wynikowy kod. Dziękujemy za recenzję kodu! :)CJam,
149148146144138137 137bajtówPowyż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:
Jak to działa
źródło
base
dwukrotne użycie już dodaje 8 bajtów w GolfScript ...C,
303299297 bajtówKompiluj z
gcc -std=c99 -w
.źródło
GolfScript, 143 bajty
Nadal może być miejsce na ulepszenia.Myślę, że zbliżam się do ostatecznej wersji.źródło
Mathematica,
238226222224 bajtyZaoszczędził kilka bajtów dzięki Martinowi Büttnerowi.
źródło
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ł
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 .
źródło
PHP, 251 bajtów
To wyjaśnia problem liczby mnogiej / pojedynczej.
Czytelny:
źródło
Belka ,
11411109 bajtówNadal 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.
Wypróbuj go we fragmencie stosu tutaj
źródło
PHP,
250246244233228 bajtówUważam, że jest to jak dotąd najmniejszy. Jest to oparte na strzale 247, z pewnymi modyfikacjami w celu dalszej minimalizacji.
Zminimalizowane
Rozszerzony
źródło
php -r
który jest równoważnyperl -e
i podobny, można pominąć znacznik otwierający. Zobacz pokrewną dyskusję w Uruchamianie PHP z-r
zamiast znaczników kodu .while($b)
działa równie dobrze.