Escriba un programa que muestre la letra de 99 Bottles of Beer, en el menor número de bytes posible .
Letra:
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.
Reglas:
- Su programa debe iniciar sesión en STDOUT o una alternativa aceptable, o debe ser devuelto desde una función (con o sin una nueva línea final).
- Su programa debe ser un programa o función completa y ejecutable.
Los idiomas escritos específicamente para enviar una respuesta de 0 bytes a este desafío están permitidos, pero no son particularmente interesantes.
Tenga en cuenta que debe haber un intérprete para que se pueda probar el envío. Se permite (e incluso se recomienda) escribir este intérprete usted mismo para un idioma previamente no implementado.
- Esto es diferente del resultado de HQ9 + o 99. Cualquier respuesta escrita en estos idiomas se eliminará.
Como se trata de un desafío de catálogo, no se trata de encontrar el idioma con la solución más corta para esto (hay algunos en los que el programa vacío funciona), se trata de encontrar la solución más corta en cada idioma. Por lo tanto, ninguna respuesta se marcará como aceptada.
Catálogo
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](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>
Respuestas:
C #,
285298289 Bytes(Mi primer intento de golf de código ...)
Un poco descabellado:
fuente
" bottle"
con un argumento de formato, aunque estoy seguro de que hay una mejor manera, tener 3 instancias de botella me duelen los ojos ...b==1
puede ser reemplazado conb<2
.for(int b = 100; b--> 1;)
Código de máquina Motorola MC14500B , 46612 bytes
Por razones de duración, no puedo publicar el programa aquí. Sin embargo, se puede encontrar aquí en hexadecimal y aquí en binario (rellenado con
0
s).Este es el programa más corto posible en el código de máquina Motorola MC14500B. Consiste en solo
1000
y1001
(8
y9
, respectivamente); un código de operación para cada bit de salida.Utiliza 93,224 códigos de operación de medio byte y genera las letras de las canciones de a una por vez. Este es el único método de salida posible.
Para aquellos interesados, la salida va al pin # 3 (de 16), el pin de E / S.
Explicación
El registro comienza a las
0
.Trivia de código
El hexadecimal es 93,224
8
s y9
S Long.El binario es 745,792
1
s y0
S Long.Usé el código de Python 2 a continuación para generar el código. Entrada
0
para binario y1
para hexadecimal.fuente
Vitsy, 0 bytes
En serio, no tengo nada conmigo. (@Mego lo siento mucho;;))
Pruébalo en línea! (Solo presiona "Ejecutar")
fuente
En serio , 1 byte
Si la pila está vacía (que está al principio),
N
empuja la letra. Luego se imprimen implícitamente en EOF.Gracias a @Mego por arreglar el intérprete en serio.
fuente
N
:)JavaScript ES6,
230218198196192188185 bytesSolo recorta algunos bytes mientras lo mantiene limpio y comprensible.
3 revisiones más recientes:
fuente
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 bytesEs una función anónima. Agregue
f=
al principio para hacer funcionar yf()
ejecutar.fuente
,+No, on the wall,,. Go to the store and buy some more, 99 bottles of beer on the wall.
C,
197196 bytesCreo que he alcanzado el límite de este enfoque.
fuente
"%d bottles of beer on the wallTake one down and pass it aroundGo to the store and buy some more,.\n"main(){for(;;)printf();}
solo es de 126 bytes, por lo que representa un límite inferior duro a menos que alguien encuentre una forma de comprimir o reutilizar partes de las cadenas sin una sobrecarga significativa. Sospecho que puede haber alcanzado el límite de enfoques en general, más o menos unos pocos bytes.Java
304301300295 BytesPrimera vez publicando una respuesta. Escuché que podíamos usar enum pero no podía encontrar cómo.
Sin golf
Gracias a
quartata
,J Atkin
yBenjamin Urquhart
fuente
i<2
en lugar dei==1
yi>2
aquí:i!=2
.99 bottle
y no99 bottles
Plantillas consideradas dañinas , 667 bytes
Tipo de expandido:
fuente
Haskell,
228223 bytesLa función
f
devuelve una cadena con la letra.fuente
/// , 341 bytes
Necesitaría 99 años para escribir una explicación adecuada de este código.
Probablemente incluiría el resultado de cada etapa ...
Básicamente, esto comprime la letra repetidamente (como es cada respuesta en /// ).
Pruébalo en línea!
Cada paso de descompresión
Como los reemplazos seguidos de reemplazos tendrán la cadena
//
, aparecerá con frecuencia.Parece bastante a menudo que decidí comprimir
//
en-
.Cuando esto se descomprime, el resultado es el siguiente:
La cadena
bottle
solo apareció tres veces, pero la comprimí de+
todos modos:Luego,
)
corresponde a/&/</
seguido por una nueva línea, y(
corresponde a//?/
, que son patrones que se usarán a menudo más tarde:Ahora, descomprimiríamos algunas cadenas útiles:
>
descomprime abottles of beer
^
descomprime abottles of beer on the wall
!
descomprime a^,
, donde^
está el de arriba.$
descomprime a>.\n
, donde>
es la primera regla y\n
es una nueva línea.@
descomprime a$
seguido porTake one down and pass it around,
, donde$
está la regla anterior.El código descomprimido ahora se convierte en:
fuente
Vim, 139 bytes
Guardado 6 bytes debido a xsot .
Este es mi primer intento de jugar golf con los comandos de Vim, aunque aparentemente es bastante popular . He incluido el final
ZZ
en el recuento de bytes (escribir en el archivo y salir), ya que parece ser la norma aceptada.Nota al margen: misión cumplida .
Explicación
fuente
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
/
y?
.JavaScript ES6,
237 217 208 203 195 193 189186 bytesSe está volviendo bastante difícil jugar golf ...
Editar 1: Alguien me superó por completo, parece que tengo que esforzarme más si quiero tener la mejor respuesta de Javascript.
Edición 2: ¡Honestamente, no puedo creer que logré jugar tanto al golf!
¿Me equivoqué en alguna parte? También me disculpo por usar
alert
, si desea probar mi código, reemplácelo conconsole.log
.Actualmente, hay otra respuesta notable de Javascript: "99 botellas de cerveza" . ¡Echale un vistazo! :RE
fuente
JavaScript ES6,
210209205199198196 bytesEsta es una traducción cruda de mi presentación en C. En realidad, no conozco JavaScript, por lo que definitivamente hay margen de mejora.
Editar: ordenado, descubrí backticks
fuente
console.log
conalert
y puedes usar `en lugar de". Luego puedes reemplazar \ n con una nueva línea. (Los ticks se usan para cadenas de plantillas, esas cadenas pueden tener líneas nuevas ...) ¡También, felicidades por pegarme!console.log
es más fácil de probar. De todos modos, ¡gracias por exponerme a backticks!console.log
, y mi victoria se reducirá a nada ... XD)%d bottle%s of beer%s%s
. El índice de cada verso (número de botellas) se calcula comoi/3|0
mientras que el índice de cada subcadena es simplei%3
.Brainfuck, 743 bytes
Pruébalo en línea!
Lo anterior utiliza celdas de ajuste en algunos lugares para guardar las instrucciones. También hice una versión sin envoltura en 755 instrucciones .
Sin comprimir
El siguiente es un políglota en Brainfuck Annotation Language .
fuente
Python 2, 204 bytes
La especificación está bastante subespecificada en términos de espacios en blanco, por lo que aquí supongo que la última línea debe tener una nueva línea final. Si la especificación aclara lo contrario, actualizaré esta respuesta.
Estoy bastante contento con esto, pero al mirar el golf de la anarquía, siento que todavía se puede jugar al golf, posiblemente con un enfoque diferente.
fuente
Laberinto ,
11951190932 bytesEsto es un poco excesivo ...
Si bien Labyrinth no es particularmente bueno para imprimir cadenas (porque necesita presionar todos los códigos de caracteres), creo que debería ser posible hacerlo mejor usando más líneas largas pero más cortas y volviéndose aún más loco con la rotación de la cuadrícula.
Como creo que cualquier mejora en el golf cambiará sustancialmente la estructura de este código, esperaré con una explicación hasta que me quede sin ideas sobre cómo seguir jugando al golf.
fuente
Pitón 2, 195
Tomó la
i/2
idea de la respuesta de Sp3000 .fuente
Lote de Windows, 376 bytes
Muy muy largo y feo:
fuente
Python, 254 bytes
Bastante sencillo, asigne algunas de las frases más comunes, imprima cada bit del 99 al 3, luego imprima las últimas líneas sumando las variables y algunas cadenas.
fuente
Julia,
227215213 bytesEsto utiliza la interpolación de cadenas (
"$variable"
) y los ternarios para construir la salida e imprimirla en STDOUT.Guardado 14 bytes gracias a Glen O!
fuente
(n>1?" bottles":" bottle")" of beer"
usar" bottle""s"^(n>1)*" of beer"
, tenga en cuenta que*
es necesario después(n<1)
porque, de lo contrario, intenta aplicarse(n>1)" of beer"
como el poder. Además, ¿hay algún beneficio en usarwhile n>0
overfor n=99:-1:1
(que permite que la condición al final sea más simple y evita la necesidad por separadon=99
)?\n
y cambie la parte central a interpolación (en lugar de",n>1?...","
usar$(n>1?...")
) para guardar un carácter, y mueva,
el condicional dentro de antes de la siguiente parte, por lo que solo debe escribirse una vez.JavaScript ES6, 214 bytes
Ventanas emergentes limitadas:
Expandido:
@ comentaristas: Gracias por la idea de las funciones de flecha, guardado 15 bytes
Para cerveza infinita solo usa este código aquí, 212 bytes
fuente
+o'
ya que luego se cambió a+o+'
. También vi la oportunidad de cambiar el ciclo y la respuesta.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
bucle y pronto publicaré el código resultante. ¡Gracias por la revisión del código! :)CJAM,
149148146144138137134 bytesEl hexdump anterior se puede revertir con
xxd -r
. Pruébelo en línea en el intérprete de CJam .Con un costo de 9 bytes adicionales, para un total de 143 bytes , podemos evitar caracteres no imprimibles:
Cómo funciona
fuente
base
dos veces ya agrega 8 bytes en GolfScript ...C,
303299297 bytesCompilar con
gcc -std=c99 -w
.fuente
GolfScript, 143 bytes
Todavía puede haber margen de mejora.Acercándome a la revisión final, creo.fuente
Mathematica,
238226222224 bytesGuardado varios bytes gracias a Martin Büttner.
fuente
Brainfuck, 4028 bytes
Esto es bastante horrible. Mucha duplicación y muy ineficiente, por lo que no ganará ningún premio. Sin embargo, lo comencé y estaba decidido a terminarlo.
Puedo intentar mejorar esto, pero probablemente no, porque, francamente, mi cerebro está jodido.
Golfed
Sin golf
Salida:
Pruébalo tú mismo aquí!De acuerdo, parece que la URL es demasiado larga para incluirla aquí, por lo que deberá copiar / pegar para probarla usted mismo.
Lo probé usando este intérprete .
fuente
PHP, 251 bytes
Esto explica el problema plural / singular.
Legible:
fuente
Haz ,
11411109 bytesTodavía tengo mucho espacio para jugar golf más allá con todos los espacios vacíos, pero se está volviendo muy difícil de seguir y se rompe con bastante facilidad :) Es muy similar al que publiqué para esta pregunta , excepto que va a la tienda antes de que la cerveza llegue a 1 y las celdas utilizadas para los parámetros hayan sido desplazadas. También he cambiado el diseño considerablemente. Intentaré hacer una explicación una vez que pruebe un par de diseños más.
Pruébalo en el fragmento de pila aquí
fuente
PHP,
250246244233228 bytesCreo que esto es el más pequeño hasta ahora. Esto se basa en el disparo 247, con algunas modificaciones para minimizar aún más.
Minimizado
Expandido
fuente
php -r
cual es equivalenteperl -e
y similar, es aceptable omitir la etiqueta de apertura. Vea la discusión relacionada en Ejecutar PHP con en-r
lugar de etiquetas de código .while($b)
funciona igual de bien