Escreva um programa que produza a letra para 99 Bottles of Beer, no menor número possível de bytes .
Letra da música:
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.
Regras:
- Seu programa deve efetuar logon no STDOUT ou em uma alternativa aceitável ou retornar de uma função (com ou sem uma nova linha à direita).
- Seu programa deve ser um programa ou função executável e completa.
Idiomas escritos especificamente para enviar uma resposta de 0 byte a esse desafio são permitidos, mas não particularmente interessantes.
Observe que deve haver um intérprete para que o envio possa ser testado. É permitido (e até encorajado) escrever esse intérprete para um idioma anteriormente não implementado.
- Isso é diferente da saída do HQ9 + ou 99. Quaisquer respostas escritas nesses idiomas serão excluídas.
Como esse é um desafio do catálogo, não se trata de encontrar o idioma com a solução mais curta para isso (existem algumas onde o programa vazio faz o truque) - trata-se de encontrar a solução mais curta em todos os idiomas. Portanto, nenhuma resposta será marcada como aceita.
Catálogo
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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>
Respostas:
C #,
285298289 Bytes(Minha primeira tentativa no Code golfing ...)
Um pouco destroçado:
fonte
" bottle"
com um argumento de formato que eu tenho certeza que há uma maneira melhor, com 3 casos de garrafa machuca meus olhos ...b==1
pode ser substituído porb<2
.for(int b = 100; b--> 1;)
Motorola MC14500B Código da máquina , 46612 bytes
Por motivos de duração, não posso postar o programa aqui. No entanto, ele pode ser encontrado aqui em hexadecimal e aqui em binário (preenchido com
0
s).Este é o programa mais curto possível no código de máquina Motorola MC14500B. Consiste em apenas
1000
e1001
(8
e9
, respectivamente); um código de operação para cada bit de saída.Ele usa 93.224 opcodes de meio byte e produz a letra da música um bit de cada vez. Este é o único método de saída possível.
Para os interessados, a saída vai para o pino 3 (de 16), o pino de E / S.
Explicação
O registro começa às
0
.Code Trivia
O hexadecimal tem 93.224 se
8
es9
.O binário tem 745.792 se
1
es0
.Eu usei o código Python 2 abaixo para gerar o código. Entrada
0
para binário e1
hexadecimal.fonte
Vitsy, 0 bytes
Sério, não tem nada em mim. (@Mego me desculpe.;))
Experimente online! (Basta clicar em "Executar")
fonte
Sério , 1 byte
Se a pilha estiver vazia (como está no início),
N
empurra a letra. Em seguida, eles são impressos implicitamente na EOF.Agradecemos ao @Mego por corrigir o intérprete sério.
fonte
N
:) :)JavaScript ES6,
230218198196192188185 bytesApenas aparando alguns bytes, mantendo-o limpo e compreensível.
3 revisões mais recentes:
fonte
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 bytesÉ uma função anônima. Adicione
f=
no início a função ef()
a execução.fonte
,+No, on the wall,,. Go to the store and buy some more, 99 bottles of beer on the wall.
C,
197196 bytesEu acho que atingi o limite dessa abordagem.
fonte
"%d bottles of beer on the wallTake one down and pass it aroundGo to the store and buy some more,.\n"main(){for(;;)printf();}
sozinho possui 126 bytes, o que representa um limite inferior rígido, a menos que alguém encontre uma maneira de compactar ou reutilizar partes das cadeias sem sobrecarga significativa. Eu suspeito que você possa ter atingido o limite de abordagens em geral, mais ou menos alguns bytes.Java
304301300295 bytesPrimeira postagem de uma resposta. Ouvi dizer que poderíamos usar enum, mas não conseguimos encontrar como.
Ungolfed
Graças a
quartata
,J Atkin
eBenjamin Urquhart
fonte
i<2
no lugar doi==1
ei>2
aqui:i!=2
.99 bottle
e não99 bottles
Modelos considerados nocivos , 667 bytes
Tipo de expandido:
fonte
Haskell,
228223 bytesFunção
f
retorna uma string com a letra.fonte
/// , 341 bytes
Seria necessário 99 anos para escrever uma explicação adequada desse código.
Eu provavelmente incluiria apenas o resultado de todas as etapas ...
Basicamente, isso comprime a letra repetidamente (como todas as respostas em /// ).
Experimente online!
Cada passo da descompressão
Como as substituições seguidas pelas substituições terão a sequência
//
, ela aparecerá com frequência.Parece muitas vezes que eu decidi para comprimir
//
em-
.Quando isso é descompactado, o resultado é o seguinte:
A string
bottle
apareceu apenas três vezes, mas eu a comprimi de+
qualquer maneira:Em seguida,
)
corresponde a/&/</
seguido por uma nova linha e(
corresponde a//?/
, que são padrões que serão frequentemente usados posteriormente:Agora, descomprimiríamos algumas seqüências úteis:
>
descomprime parabottles of beer
^
descomprime parabottles of beer on the wall
!
descompacta para^,
, onde^
está o acima.$
descompacta para>.\n
, onde>
é a primeira regra e\n
é uma nova linha.@
descompacta para$
seguido porTake one down and pass it around,
, onde$
está a regra acima.O código descompactado agora se torna:
fonte
Vim, 139 bytes
Salvo 6 bytes devido ao xsot .
Esta é minha primeira tentativa de jogar comandos no Vim, embora aparentemente seja bastante popular . Incluí a final
ZZ
na contagem de bytes (gravar no arquivo e sair), pois parece ser a norma aceita.Nota lateral: missão cumprida .
Explicação
fonte
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
/
e?
.JavaScript ES6,
237 217 208 203 195 193 189186 bytesEstá ficando muito difícil jogar golfe ...
Edit 1: Alguém me superou totalmente, parece que tenho que me esforçar mais se quiser ter a melhor resposta Javascript.
Edit 2: Sinceramente, não acredito que consegui jogar tanto!
Eu errei em algum lugar? Também peço desculpas por usar
alert
, se você quiser testar meu código, substitua-o porconsole.log
.Atualmente, há uma outra resposta Javascript notável: "99 garrafas de cerveja" . Confira! : D
fonte
JavaScript ES6,
210209205199198196 bytesEsta é uma tradução grosseira do meu envio em C. Na verdade, eu não sei javascript, então definitivamente há espaço para melhorias.
Edit: puro, eu descobri backticks
fonte
console.log
comalert
e pode usar `em vez de". Então você pode substituir \ n por uma nova linha. (Os ticks são usados para strings de modelo, essas strings podem ter novas linhas ...) Além disso, parabéns por me derrotar!console.log
é mais fácil de testar. De qualquer forma, obrigado por me expor a backticks!console.log
, e minha vitória será reduzido a nada .. XD)%d bottle%s of beer%s%s
. O índice de cada verso (número de garrafas) é calculado como sei/3|0
o índice de cada substring fosse simplesi%3
.Brainfuck, 743 bytes
Experimente online!
O exemplo acima usa quebra automática de células em alguns lugares para salvar as instruções. Também fiz uma versão não empacotável nas instruções 755 .
Descomprimido
A seguir, um poliglota na linguagem de anotações Brainfuck .
fonte
Python 2, 204 bytes
A especificação é bastante subespecificada em termos de espaço em branco, então, aqui estou assumindo que a última linha precisa ter uma única nova linha à direita. Se a especificação esclarecer o contrário, atualizarei esta resposta.
Estou muito feliz com isso, mas, olhando para o golfe da anarquia, sinto que isso ainda pode ser praticado, possivelmente com uma abordagem diferente.
fonte
Labirinto ,
11951190932bytesIsso é um pouco excessivo ...
Enquanto Labyrinth não é particularmente bom em imprimir strings (porque você precisa pressionar todos os códigos de caracteres), acho que deve ser possível fazer melhor do que isso usando linhas longas, porém mais curtas, e ficando ainda mais louco com a rotação da grade.
Como acho que qualquer melhoria no golfe alterará substancialmente a estrutura desse código, esperarei com uma explicação até que eu esteja sem ideias de como jogar ainda mais.
fonte
Python 2, 195
Partiu da
i/2
ideia da resposta do Sp3000 .fonte
Lote do Windows, 376 bytes
Muito, muito longo e feio:
fonte
Python, 254 bytes
Bem simples, atribua algumas das frases mais comuns, imprima cada bit de 99 a 3, depois imprima as últimas linhas adicionando as variáveis e algumas seqüências.
fonte
Julia,
227215213 bytesIsso usa interpolação de strings (
"$variable"
) e ternários para construir a saída e imprimi-la em STDOUT.Economizou 14 bytes graças a Glen O!
fonte
(n>1?" bottles":" bottle")" of beer"
usar" bottle""s"^(n>1)*" of beer"
- observe que*
é necessário depois,(n<1)
porque, caso contrário, ele tenta se aplicar(n>1)" of beer"
como poder. Além disso, existe algum benefício em usarwhile n>0
overfor n=99:-1:1
(que permite que a condição no final seja mais simples e evita a necessidade separadan=99
)?\n
e mude a parte do meio para interpolação (em vez de",n>1?...","
usar$(n>1?...")
) para salvar um personagem e mova o,
interior do condicional para antes da próxima parte, para que ele precise ser escrito apenas uma vez.JavaScript ES6, 214 bytes
Pop-ups limitados:
Expandido:
@ comentadores: Obrigado pela idéia das funções de seta, salvas 15 bytes
Para cerveja infinita, use este código aqui, 212 bytes
fonte
+o'
, que foi alterado para+o+'
. Também vi oportunidade de alterar o ciclo e a resposta. Estará verificando as funções de seta agora :)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
loop e em breve publicarei o código resultante. Obrigado pela revisão do código! :) #CJam,
149148146144138137134 bytesO hexdump acima pode ser revertido com
xxd -r
. Experimente online no intérprete CJam .Ao custo de 9 bytes extras, para um total de 143 bytes , podemos evitar caracteres não imprimíveis:
Como funciona
fonte
base
duas vezes já adiciona 8 bytes em GolfScript ...C,
303299297 bytesCompile com
gcc -std=c99 -w
.fonte
GolfScript, 143 bytes
Ainda pode haver espaço para melhorias.Chegando perto da revisão final, eu acho.fonte
Mathematica,
238226222224 bytesSalvou vários bytes graças a Martin Büttner.
fonte
Brainfuck, 4028 bytes
Isso é bastante hediondo. Muita duplicação e muito ineficiente, por isso não ganhará nenhum prêmio. No entanto, iniciei e estava determinado a terminá-lo.
Eu posso tentar melhorar isso, mas provavelmente não, porque, francamente, meu cérebro está ferrado.
Golfe
Ungolfed
Resultado:
Tente você mesmo aqui!OK, parece que o URL é muito longo para ser incluído aqui; portanto, você precisará copiar / colar para tentar por conta própria.
Eu testei usando esse intérprete .
fonte
PHP, 251 bytes
Isso explica o problema do plural / singular.
Legível:
fonte
Feixe ,
11411109 bytesAinda tenho muito espaço para jogar golfe com todos os espaços vazios, mas está ficando muito difícil de acompanhar e quebra com bastante facilidade :) É muito parecido com o que eu postei para essa pergunta , exceto que ele vai para a loja antes que a cerveja atinja 1 e as células usadas para os parâmetros tenham sido deslocadas. Também mudei o layout consideravelmente. Vou tentar fazer uma explicação quando experimentar mais alguns layouts.
Experimente no fragmento de pilha aqui
fonte
PHP,
250246244233228 bytesEu acredito que este seja o menor até agora. Isso é baseado na foto 247, com algumas modificações para minimizar ainda mais.
Minimizado
Expandido
fonte
php -r
qual é equivalenteperl -e
e semelhante, é aceitável omitir a tag de abertura. Consulte a discussão relacionada em Executando PHP com-r
tags de código em vez de .while($b)
funciona tão bem.