99 garrafas de cerveja [fechado]

65

Recrie '99 garrafas de cerveja na parede '.

A saída desejada é esta:

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.

Mostre-me como você resolveria isso com sua linguagem de programação favorita. O uso mais criativo de um idioma vence.

Nick Berardi
fonte
30
"O uso mais criativo" é subjetivo demais para um site de SE, eu acho. Devemos procurar usar critérios objetivos, como "código mais curto".
Chris Jester-Young
5
Continua sendo uma boa pergunta
Chris Laplante
3
É suposto funcionar infinitamente? Eu presumi que sim. Além disso, o codegolf não possui 99 garrafas de cerveja, então não há motivo para discuti-lo.
11
@ Chris - Essa será a parte mais difícil deste site do SE, porque tudo é baseado na criatividade, porque isso é metade da diversão da programação de quebra-cabeças. A solução mais criativa nem sempre é a mais eficiente ou a mais curta.
precisa saber é o seguinte
2
@ Nick: eu ouço você. Eu só quero saber como é possível determinar o quão criativa é uma solução --- com base em seu próprio julgamento? Baseado nos eleitores? Nenhum dos dois é particularmente confiável (sem ofensas). Algo como brevidade é incontestável - por exemplo, ninguém pode contestar a "bondade" da solução de golfe com código de estouro de pilha de 1 byte.
Chris Jester-Young

Respostas:

70

Perl (410 caracteres)

Já existe um site dedicado a este concurso:

Uma das soluções Perl seria muito, muito difícil de vencer em termos de criatividade, diz:

[bottles.pl]

         $ a =
        "cpuu
       \ bmft p
       \ bg cff
       \ bs "; $ b
       = "po ui
       \ bf xbm
      \ bm "; $ c ="
      Ypv ublf p
     \ bof epxo qb
   \ btt ju bspvoe ";
  $ a = ~ s / \ n //; $ a = ~
  s / \ s + / / g; $ b = ~
  s / \ n //; $ b = ~
  s / \ s + / / g; $ c = ~
  s / \ n //; $ c = ~
  s / \ s + / / g; $ a = ~
  y / bz / az /; $ b = ~
  tr / bz / az /; $ c = ~
  tr / bz / az /; para(
  $ d = 100; $ d> 0; $ d -) {
  imprimir "$ d $ a $ b $ d"
  ; imprima "$ a, \ n $ c"
  ; print ($ d-1); print
  "$ a $ b. \ n";} $ x =
  "cjc"; $ y = "dobbz";
  $ z = "com"; imprima "\ n"
  ; imprimir "- $ x \ @ $ y."
   ; imprime "$ z \ n \ n";

Aqui está o link para o arquivo original .

botas de borracha
fonte
11
Boa apresentação, mas isso não corresponde ao pedido !!
7294 F. Hauri
Uma cifra 'rot1', não a melhor tentativa de ofuscação que eu já vi. O uso de \b'remover' caracteres indesejados também é um pouco decepcionante.
primo
100

Brainf *** (1.509)

Imaginei que poderia superar essa resposta não apenas produzindo 9 garrafas de cerveja em vez de 1, mas também usando apenas 7 caracteres diferentes no código.

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

Eu tenho que admitir, porém, há um erro no código (talvez você possa descobrir como corrigi-lo para mim?) E ele não imprime a frase final. Go to the store and buy some more, 99 bottles of beer on the wall.Mas , fora isso, ele funciona tão bem quanto os programas feitos nessas linguagens de programação sissy que todo mundo parece gostar de usar.

Peter Olson
fonte
9
Você só tem 9 garrafas lá. Você precisa de mais 90!
Joe Z.
Petição: renomear esse idioma para braindrunk?
Cyoce
99

Funciton

Eu escrevi isso outro dia. :) (Imagens: início e término )

Como isso fica feio no StackExchange devido ao espaçamento extra de linhas, considere executar o seguinte código no console JavaScript do navegador para corrigir isso: $('pre').css('line-height',1)

                                            ╓┬────╖
     ╔════╗  ┌───╖                          ╟┘99b ║
     ║ −1 ╟──┤ + ╟──┐                       ╙──┬──╜
     ╚════╝  ╘═╤═╝  ├──────────────────────────┴─────────────────────────────┐
     ╔════╗  ┌─┴─╖  │  ╔════════════════════════════════════════════════════╗│
     ║ 99 ╟──┤ ? ╟──┘  ║ 93438979891487426396059469986395555362079573844971 ║│
     ╚════╝  ╘═╤═╝     ║ 71377306928718494179034460561943201885027745835961 ║│
            ┌──┴───╖   ║ 98129935108241412387473531261660077880505710501626 ║│
    ╔════╗  │ 99bp ║   ║ 32694396343717333192558234646820019070451056711    ║│
    ║ 99 ║  ╘══╤═══╝   ╚══════════════════════════╤═════════════════════════╝│
    ╚═╤══╝   ┌─┴─╖                       ┌───╖  ┌─┴─╖  ╔═════════════════╗   │
   ┌──┴──╖   │ ‼ ╟───────────────────────┤ ‼ ╟──┤ ? ╟──╢ 445551776368547 ║   │
   │ 99b ║   ╘═╤═╝┌─────────────────────┐╘═╤═╝  ╘═╤═╝  ║ 925186328623383 ║   │
   ╘══╤══╝     │  │╔═══════════════════╗│  │      │    ║ 851314944882510 ║   │
      │        │  │║ 15177132563375318 ║│  │      │    ║ 812246570019017 ║   │
 ╔════════╗    │  │║ 07655616350359109 ║│  │      │    ║ 240477365113929 ║   │
 ║ 318287 ║    │  │║ 82597577171382437 ║│  │      │    ║ 659548419629671 ║   │
 ║ 023073 ║    │  │║ 18150105146396039 ║│  │      │    ║ 952755268258505 ║   │
 ║ 603558 ║    │  │║ 2022986808360992  ║│  │      │    ║ 759402210908648 ║   │
 ║ 743780 ║    │  │╚══════════╤════════╝│  │      │    ║ 737406010882693 ║   │
 ║ 068900 ║    │  │         ┌─┴─╖ ┌───╖ │  │      │    ║ 018745757193818 ║   │
 ║ 028319 ║    │  │         │ ‼ ╟─┤ ‼ ╟─┘  │      │    ║ 597439618635403 ║   │
 ║ 948400 ║    │  │         ╘═╤═╝ ╘═╤═╝    │      │    ║ 821854707881243 ║   │
 ║ 620075 ║    │  │         ┌─┴─╖   │    ┌─┴─╖    │    ║ 92049082452     ║   │
 ║ 955580 ║    │  └─────┬───┤ ‼ ╟────────┤ ‼ ║    │    ╚═════════════════╝   │
 ║ 347161 ║    │        │   ╘═══╝┌──────┐╘═╤═╝    └─────────────┐            │
 ║ 651333 ║    │   ╔═══╗│┌──────╖│╔════╗│ ╔╧═════════╗          │            │
 ║ 590970 ║    │   ║ 0 ║└┤ 99bp ╟┘║ −1 ║└┐║ 20971566 ║          ├────────────┘
 ║ 678045 ║    │   ╚══╤╝ ╘══════╝ ╚══╤═╝ │╚══════════╝          │
 ║ 336290 ║  ┌─┴─╖  ┌─┴─╖  ┌─────╖  ┌┴──╖├──────────────────────┘
 ║ 721824 ╟──┤ ‼ ╟──┤ ? ╟──┤ 99b ╟──┤ + ║│
 ╚════════╝  ╘═══╝  ╘═╤═╝  ╘═════╝  ╘═╤═╝│    ╓┬──────╖
                      └───────┬───────┘  │    ╟┘ 99bp ║
                              └──────────┘    ╙───┬───╜
 ┌────────────────────────────────────────────────┴──────────────┐
 │╔══════════════════════════════════════════╗╔═══════════╗      │
 │║ 8592134145756414358602136806465202028576 ║║ 232783950 ║      │
 │╚══════════════════════════════╤═══════════╝╚╤══════════╝      │
 │               ┌───╖  ╔═══╗  ┌─┴─╖  ┌───╖  ┌─┴─╖  ┌─────────╖  │
 └───────────────┤ = ╟──╢ 1 ║  │ ‼ ╟──┤ ‼ ╟──┤ ? ╟──┤ int→str ╟──┴┐
                 ╘═╤═╝  ╚═══╝  ╘═╤═╝  ╘═╤═╝  ╘═╤═╝  ╘═════════╝   │
          ╔═══╗  ┌─┴─╖         ┌─┴─╖    │      └──────────────────┘
          ║ 0 ╟──┤ ? ╟─────────┤ ‼ ╟──┐
          ╚═══╝  ╘═╤═╝         ╘═══╝  │
              ╔════╧╗╔════════════════╧════════════════════════════════╗
              ║ 115 ║║ 20338288213193790107412311132593873016630280224 ║
              ╚═════╝╚═════════════════════════════════════════════════╝
Timwi
fonte
11
mais um, isso é incrível
gyurisc
11
Essa linguagem é incrível, ótimo trabalho!
deixou de girar contra-
11
Eu vi isso no Esolang.org e gostei da aparência.
ML
56

Console jQuery + FireBug

$('code:first').text()

;)

Powtac
fonte
2
Que tal algo como eval($($('code')[8]).text().replace(/print/g,'console.log'))<del> (também conhecido como roubo) </del>? Ele imprime a letra inteira da música. : P
JiminP
2
Também funciona no console javascript do Chrome.
Spoike 22/09
Diabolicamente inteligente.
Max28
11
@JiminP Infelizmente, esse não é um seletor estável, considerando como a ordem das respostas pode mudar com o tempo (na verdade, não funciona mais).
quer
2
@ Muhd ​​Ainda funciona, desde que a pergunta não seja alterada - o primeiro bloco de código é o da pergunta.
Bob
24

HQ9 + (1 caractere)

9

É certo que não é uma língua completa de Turing, mas isso ainda conta

tobyodavies
fonte
13
Por que você não usa o HQ9 B ? É Turing completo.
Mateen Ulhaq
11
@muntoo Não sei se o HQ9 + B está completo. O comando B pesquisa a entrada do teclado e avalia isso como uma troca de ideias, então é HQ9 + com um intérprete de Brainfuck opcional. ou seja, o programa "B" no HQ9 + B pesquisará stdin até chegar! (ou EOF) e interpretar que como Brainfuck ..
Sylwester
20

Quem disse que o C # tinha muita cerimônia? Quem quer que fosse, nunca esteve tão certo.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _99Bottles
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintSong(99);
        }

        static void PrintSong(int bottleCount)
        {
            Func<int, string> sOrBlank = howMany => howMany > 1 ? "s" : "";

            PrintBottles(howManyBottles =>
            {
                Console.WriteLine("{0} bottle{1} of beer on the wall, {0} bottle{1} of beer.", howManyBottles, sOrBlank(howManyBottles));
                if (howManyBottles > 1)
                {
                    Console.WriteLine("Take one down and pass it around, {0} bottle{1} of beer on the wall.", --howManyBottles, sOrBlank(howManyBottles));
                }
                else
                {
                    Console.WriteLine("Go to the store and buy some more, 99 bottles of beer on the wall.", --howManyBottles);
                }
            },
            bottleCount);
        }

        static void PrintBottles(Action<int> printBottles, int count)
        {
            printBottles(count);

            if (count > 1)
            {
                PrintBottles(printBottles, --count);
            }
         }
    }
}
Rob White
fonte
11
+1 Por ser outro cordeiro de sacrifício no estilo C em um oceano de Perl.
Glenn Nelson
Isso pode ser reduzido substancialmente.
Nellius 28/01
2
@Nellius Você leu o que ilivewithiandisse antes do código dele?
Daniel Standage
11
@ Daniel Sim, e isso implica que ele acha que tudo em seu código é necessário. Se for uma piada, não deve ser votado tanto assim. Não é curto, criativo, eficiente ou até um pouco inteligente.
Nellius 28/01
@ Nellius Não era para ser um candidato sério, em nenhum nível esse código é bom. Tenho certeza de que pode ser reduzido, tornado mais eficiente e geralmente melhorado consideravelmente.
Rob Rob
18

C

Este programa está gerando o texto completo da música como sequência única, usando o pré-processador. O código C real apenas gera a string assim construída. Chamar stringso executável gerado revelará o texto completo da música no executável.

#define BOTTLES(n) n " bottles of beer"
#define BOTTLE "1 bottle of beer"
#define OTW " on the wall, "
#define TAKE "Take one down, pass it around, "
#define BUY "Go to the store and buy some more, "
#define STOP "."
#define NL "\n"

#define LINE1(n) BOTTLES(n) OTW BOTTLES(n) STOP NL
#define LINE1A BOTTLE OTW BOTTLE STOP NL
#define LINE2(n) TAKE BOTTLES(n) STOP NL
#define LINE2A TAKE BOTTLE STOP NL
#define LINEX BUY BOTTLES("99") NL

#define MIDDLEPART(n) LINE2(n) NL LINE1(n)
#define MIDDLELAST LINE2A NL LINE1A

#define EIGHT_TO_TWO(S, M) M(S "8") M(S "7") M(S "6") M(S "5") M(S "4") M(S "3") M(S "2")
#define EIGHT_TO_ONE(S, M) EIGHT_TO_TWO(S, M) M(S "1")
#define EIGHT_TO_TWO_AGAIN(S, M) M(S "8") M(S "7") M(S "6") M(S "5") M(S "4") M(S "3") M(S "2")
#define EIGHT_TO_ONE_AGAIN(S, M) EIGHT_TO_TWO_AGAIN(S, M) M(S "1")
#define NINE_TO_TWO(S, M) M(S "9") EIGHT_TO_TWO(S, M)
#define EIGHT_TO_ZERO(S, M) EIGHT_TO_ONE(S, M) M(S "0")
#define NINE_TO_ZERO(S, M) M(S "9") EIGHT_TO_ZERO(S, M)

#define NINETIES EIGHT_TO_ZERO("9", MIDDLEPART)
#define NTIES(n) NINE_TO_ZERO(n, MIDDLEPART)
#define EIGHTIES_TO_TENS EIGHT_TO_ONE_AGAIN("", NTIES)
#define NAUGHTIES NINE_TO_TWO("", MIDDLEPART)

#define SONG LINE1("99") NINETIES EIGHTIES_TO_TENS NAUGHTIES MIDDLELAST LINEX

#include <stdio.h>

int main()
{
  puts(SONG);
  return 0;
}
celtschk
fonte
11
Provavelmente as soluções mais eficientes e rápidas.
Tom Pažourek 06/06
11
@tomp timewise eficiente, muito ineficiente no tamanho do arquivo executável :)
seequ
14

C # ( 312 310 304 caracteres)

class P{static void Main(){string b=" bottle",w=" on the wall",o=" of beer",p=".\n",s="s";for(int i=99;i>0;i--)System.Console.Write(i+b+(i>1?s:"")+o+w+", "+i+b+(i>1?s:"")+o+p+(i>1?"Take one down and pass it around, "+(i-1)+b+(i-1>1?s:"")+o+w+p+"\n":"Go to the store and buy some more, "+99+b+s+o+w+p));}}
Nellius
fonte
11
Não acredito que você conseguiu mais curto que eu. Estou impressionado. Eu vou ter que estudar para um melhor conjunto de opções
jcolebrand
E agora eu estudei para isso, eu estou para baixo para menos de 300;)
jcolebrand
12

C #

Não pretende ser curto, mas talvez isso conte como criativo?

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        Console.WriteLine(string.Join(Environment.NewLine, Enumerable.Range(0, 100).Select(i =>
            string.Format(
                string.Format(
                    "{0} {1} {{3}} {{4}},{{9}}{0} {1} {{3}}.{{9}}{2},{{9}}{3} {4} {{3}} {{4}}.{{9}}",
                    i == 99 ? "{0}" : "{7}",
                    i == 98 ? "{1}" : "{2}",
                    i == 99 ? "{6}" : "{5}",
                    i == 98 ? "{0}" : "{8}",
                    i == 97 ? "{1}" : "{2}"
                ),
                "No",
                "bottle",
                "bottles",
                "of beer",
                "on the wall",
                "Take one down, pass it around",
                "Go to the store, buy some more",
                99 - i,
                (198 - i) % 100,
                Environment.NewLine
        ))));
    }
}

Note que esta é apenas uma afirmação :)

Timwi
fonte
11

Definitivamente não se qualifica como criativo, mas é feito a partir da linha de comando com um único comando.

perl -e '$i=99;while($i>1){print("$i bottles of beer on the wall, $i bottles of beer.\nTake one down and pass it around, ".--$i." bottles of beer on the wall\n\n");}print("1 bottle of beer on the wall, 1 bottle of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n");'
Daniel Standage
fonte
11

Haskell, 272 , 250 , 243 caracteres

(&)=(++)
b 1=" bottle"
b _=b 1&"s"
w=" on the wall"
p n=show n&b n&" of beer"
f n=putStrLn$p n&w&","&p n&".\n"&c(n-1)
c 0="Go to the store and buy some more, "&p 99&w&"."
c n="Take one down and pass it around, "&p n&w&"\n"
main=mapM f[99,98..1]
Jonathan Sternberg
fonte
11

Windows PowerShell (198)

filter b{"$_ bottle$('s'*!!--$_) of beer"}(99..1|%{($_|b)+($w=' on the wall')+", $($_|b)."
"Take one down and pass it around, $(--$_|b)$w.
"})[0..196]
"Go to the store and buy some more, $(99|b)$w."

Bastante direto.

Estou usando um filtro para as garrafas de cerveja, já que functioné mais longa e a invocação precisa de parênteses em qualquer caso. A detecção plural ( !!--$_) primeiro diminui o número de garrafas por um (portanto, plural é qualquer coisa que não seja zero), lança-o para booleano e o nega com o primeiro !e nega-o novamente, para que agora tenhamos um booleano que descreve se o número precisa de um plural ou não. Isso é convertido implicitamente em um número inteiro ao multiplicar a sequência.

Quebras de linha em linha são divertidas.

Gerando mais linhas do que o necessário e cortando depois também.

Joey
fonte
Definitivamente curto, e isso estabeleceu um bar para tentar ir abaixo !!! Embora, do meu ponto de vista, a aparência de um "número mágico" como 196 estivesse na classe de coisas que espero poder evitar, porque captura (99 * 2) - 2. Para uma resposta em que você pode trocar a garrafa conte em um só lugar :) consulte codegolf.stackexchange.com/questions/2/99-bottles-of-beer/…
Dr. Rebmu
Você está faltando "na parede". na linha final de saída e após cada garrafa ser retirada.
Iszi
filter b{"$_ bottle$('s'*!!--$_) of beer"}(99..1|%{($_|b)+($w=' on the wall')+", $($_|b).";"Take one down and pass it around, $(--$_|b)$w. "})[0..196];"Go to the store and buy some more, $(99|b) $w."corrige isso. Totaliza 199 caracteres. (Adicione uma quebra de linha depois de $wantes ")
Iszi 24/11
Obrigado pela correção. Também havia um espaço supérfluo, então a contagem é 198.
Joey
10

Enrolar 19 caracteres

(requer conexão com a internet)

curl -L j.mp/eGv9K5
Alexandru
fonte
7
Eu considero isso muito longe.
marcog
8
Eu considero uma piada. Muitas soluções podem estar ocultas atrás de uma consulta em um servidor web.
Alexandru
3
Eu gosto deste, no entanto.
Pimvdb
11
Se o objetivo fosse o código mais curto, eu daria a você um ponto de inteligência.
Neil
9

Anti-golfe quase correto do super programador C que está aprendendo Perl?

#!/usr/bin/perl
#      ^
#      |
#      |
# That's the Perl interpreter.
# You might need to change this line based on
# your Linux/Unix distribution.

# Pragmas for debugging!
use strict;
use warnings;

# Library dependencies...none! lolz

# Main implementation
my $number_of_bottles_of_beer_on_the_wall = 99; #start with 99 bottles
LOOP: while( $number_of_bottles_of_beer_on_the_wall > 0 )
{
  printf( "%d bottles of beer on the wall, %d bottles of beer\n",
          $number_of_bottles_of_beer_on_the_wall,
          $number_of_bottles_of_beer_on_the_wall,                  );

  if( $number_of_bottles_of_beer_on_the_wall > 1 )
  {
    $number_of_bottles_of_beer_on_the_wall -= 1;
    printf( "Take one down and pass it around, %d bottles of beer on the wall.\n\n",
            $number_of_bottles_of_beer_on_the_wall,                               );
  }
  else
  {
    printf( "Go to the store and buy some more, %d bottles of beer on the wall\n",
            99                                                                     );
    last LOOP;
  }
}
Daniel Standage
fonte
Por que não /usr/bin/env perl?
nyuszika7h
11
@ nyuszika7h Crítica perspicaz! ;)
Daniel Standage
8

JavaScript ( 216 228 215)

for(a=99,c=" on the wall";a;)document.write((d=eval(b="(a||99)+' bottle'+(a-1?'s':'')+' of beer'"))+c+", "+d+".<br>"+(--a?"Take one down and pass it around, ":"Go to the store and buy some more, ")+eval(b)+c+".<p>")

Edit: Teve uma única "1 garrafa de cerveja" na versão inicial, a 3ª versão foi completamente reescrita, observe truques legais como (a||99)obter 99 na última linha, (a-1?'s':'')tornando plural para todos os casos, mas a==1sem a necessidade do desperdício ==, e definindo o valor de bdentro de uma declaração em que é usada.

aaaaaaaaaaaa
fonte
Parece que sua otimização de garrafas está custando mais caracteres do que economiza.
Yahel
Não tenho certeza do que você quer dizer, o que exatamente você mudaria?
aaaaaaaaaaaa
Este para um verso muito cedo. O último verso deve ir "no more bottles of beer on the wall, no more bottles..." - Veja: 99-bottles-of-beer.net/lyrics.html
Már Örlygsson
BTW, eu consegui uma versão completa e correta em 233 bytes: for(o,e,n=100,t=" on the wall";n-->-1;)o=e+t+", "+e+".<br>"+(n>-1?"Take one down, pass it around, ":"Go to the store and buy some more, ")+(e=(0>n?99:n||"no more")+" bottle"+(1!=n?"s":"")+" of beer")+t+".<p>",99>n&&document.write(o)
Már Örlygsson
@ MárÖrlygsson Bem-vindo ao site. As letras para este desafio estão definidas no post de abertura.
Aaaaaaaaaaaa
7

C

Eu devo ter esquecido essa pergunta, então aqui está uma versão que eu postei como resposta em outro lugar. É uma versão baseada em C quine. Compile e corra para obter a próxima linha de música. Repita até ficar entediado. Se o código indicar "Hora de ir ...", digite o número de cervejas na próxima vez que executar como argumento da linha de comando.

// Time to go to the shop and get some beer
//
//
//
//
// #####.#####.#####.#####.#####.#####.#####
// ##.#####.#####.#####.#####.#####.#####.##
// #####.#####.#####.#####.#####.#####.#####
// ##.#####.#####.#####.#####.#####.#####.##

char *z [] = {
"void l(char *s,int b){int i;printf(\"// \");for(i=0;i<b;++i)printf(s);",
"printf(\"\\n\");}\nint main(int argc, char *argv[]){\nint i,j,k,x=%d;",
"char*p;\nif(!x&&argc==2)x=atoi(argv[1]);\nif(!x){printf(\"// Time to ",
"go to the shop and get some beer\\n//\\n//\\n//\\n//\\n\");k=7;\n",
"}else{printf(\"// %%d bottles of beer on the wall, %%d bottles of beer",
".\\n\",x,x);printf(\"// Take one down and pass it round, \");\n",
"if(x>1)printf(\"%%d bottles of beer on the wall.\\n//\\n\",x-1);\n",
"else printf(\"no more bottles of beer on the wall.\\n//\\n\");\n",
"k=x>2?x:2;l(\"  ^   \",x);l(\" / \\\\  \",x);l(\"/   \\\\ \",x);",
"l(\"|   | \",x);l(\"|Duf| \",x);l(\"|   | \",x);l(\"----- \",x);}\n",
"for(i=0;i<4;++i){\nprintf(\"// %%s\", i&1 ? \"##.\" : \"\");\n",
"for(j=i&1;j<k;++j)\nprintf(\"%%s#####\",j!=(i&1)?\".\":\"\");\n",
"printf(\"%%s\\n\",i&1?\".##\":\"\");}\nprintf(\"\\nchar *z [] = {\\n\");\n",
"for(i=0;i<sizeof z/sizeof z[0];++i){\nprintf(\"\\\"\");\n",
"for(p=z[i];*p;++p)\nswitch (*p){\ncase '\\n':printf(\"\\\\n\");break;\n",
"case '\\\\':printf(\"%%c%%c\",92,92);break;\n",
"case '%%':printf(\"%%c\",37);break;\ncase '\"':printf(\"%%c%%c\",92,'\"');break;\n",
"default:printf(\"%%c\", *p);break;}\nprintf(\"\\\",\\n\");}\n",
"printf(\"};\\n\");\nfor(i=0;i<sizeof z/sizeof z[0];++i)\n",
"printf(z[i],x?x-1:0);}\n",
};
void l(char *s,int b){int i;printf("// ");for(i=0;i<b;++i)printf(s);printf("\n");}
int main(int argc, char *argv[]){
int i,j,k,x=0;char*p;
if(!x&&argc==2)x=atoi(argv[1]);
if(!x){printf("// Time to go to the shop and get some beer\n//\n//\n//\n//\n");k=7;
}else{printf("// %d bottles of beer on the wall, %d bottles of beer.\n",x,x);printf("// Take one down and pass it round, ");
if(x>1)printf("%d bottles of beer on the wall.\n//\n",x-1);
else printf("no more bottles of beer on the wall.\n//\n");
k=x>2?x:2;l("  ^   ",x);l(" / \\  ",x);l("/   \\ ",x);l("|   | ",x);l("|Duf| ",x);l("|   | ",x);l("----- ",x);}
for(i=0;i<4;++i){
printf("// %s", i&1 ? "##." : "");
for(j=i&1;j<k;++j)
printf("%s#####",j!=(i&1)?".":"");
printf("%s\n",i&1?".##":"");}
printf("\nchar *z [] = {\n");
for(i=0;i<sizeof z/sizeof z[0];++i){
printf("\"");
for(p=z[i];*p;++p)
switch (*p){
case '\n':printf("\\n");break;
case '\\':printf("%c%c",92,92);break;
case '%':printf("%c",37);break;
case '"':printf("%c%c",92,'"');break;
default:printf("%c", *p);break;}
printf("\",\n");}
printf("};\n");
for(i=0;i<sizeof z/sizeof z[0];++i)
printf(z[i],x?x-1:0);}
Skizz
fonte
@DreamWarrior em relação à sua edição proposta, você considerou colocar seu código em pastebin para poder publicá-lo como um comentário?
Ndscore
6

Javascript (285)

Isso pressupõe que existe uma função chamada print, para gerar uma string.

b=' of beer on the wall';n=100;while(--n>1)if(n>1)print(n+" bottles"+b+', '+n+" bottles of beer.\nTake one down and pass it around, "+(n-1)+' bottle'+(n-1>1?'s':'')+b+'.\n\n');print("1 bottle"+b+", 1 bottle of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.")

fonte
8
Não sei se as funções assumidas são justas. Por exemplo, meu programa poderia ser b();. Supondo que haja uma função b()que imprima 99 garrafas de cerveja na parede. :)
Chris Laplante
10
O Javascript não fornece uma maneira padrão de gerar uma string, se você a estiver executando em um navegador, ela não possui uma função de impressão; se você a estiver executando no rhino, você o fará.
2
document.writelntrabalho.
precisa saber é o seguinte
4
... para navegadores
5
O JavaScript tem E / S com: alertcomo saída, promptcomo entrada variável e confirmcomo entrada booleana. Eles são péssimos na interface do usuário, mas são as funções IO de bloqueio padrão. alerte printtêm o mesmo comprimento, portanto, seu código deve ser aproximadamente igual.
ZzzzBov
6

Esquema (270)

Sem espaço em branco:

(let l((i 99))(let((b" bottle")(c" on the wall")(d"Take one down and pass it around,")(e".\n")(f", ")(g" of beer"))(if(= i 1)(map display`(1,b,g,c,f,1,b,g,e"Go to the store and buy some more, 99",b,c,e))(begin(map display`(,i,b,g,c,f,i,b,e,d,i,b,c,e"\n"))(l(-1+ i))))))

Com espaço em branco:

    (let l ((i 99))
      (let ((b" bottle")
            (c" on the wall")
            (d"Take one down and pass it around, ")
            (e".\n")
            (f", ")
            (g" of beer"))
        (if (= i 1)
            (map display`(1 ,b ,g ,c ,f ,1 ,b ,g ,e
                          "Go to the store and buy some more, 99" ,b ,c ,e))
            (begin (map display `(,i ,b ,g ,c ,f ,i ,b ,e ,d ,i ,b ,c ,e "\n"))
                   (l (-1+ i))))))
Hoa Long Tam
fonte
6

Python - muito

Amidoinitrito?

print"""99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.

97 bottles of beer on the wall, 97 bottles of beer.
Take one down and pass it around, 96 bottles of beer on the wall.

96 bottles of beer on the wall, 96 bottles of beer.
Take one down and pass it around, 95 bottles of beer on the wall.

95 bottles of beer on the wall, 95 bottles of beer.
Take one down and pass it around, 94 bottles of beer on the wall.

....

  Ok, this is stupid. First of all, what the brainfuck are the bottles doing on the wall? They're not spiders nor picture frames. And how are they sitting on the wall?

94 bottles of beer on the wall, 9.. oops, they fell down. 94 bottles of beer on the floor, 94 bottles of beer.

  Second.. who the HQ9+ wants to keep track? I think I lost count after drinking the 2nd one...

Take one ... um... up, and pass it around,  .....  er.. a lot of bottles of beer still on the floor.

  Fourthly, what's with this passing around scheme? They're not j..I mean letters, yeah, or boxes of chocolate. We all can just take one and drink it. It's healthier too.

A pile of bottles of beer on the floor, a pile of bottles of beer.
Everyone take one up and drink it, still a whole bunch of bottles of beer on the floor.

  Um.. seventhly, are we really that many in this assembly that we can finish 200 or however many bottles we had in the beginning? Without passing out?

Go to the store and buy some more

  Yeah and who's gonna pay for it? Definitely not me. And how are you going to bring 300 bottles back from the store?
  In your car? Buddy, you're so drunk, you can't even C anything. Go home dude, go home. Take a cab."""

Referência adicional (me ajudou muito com o código): http://www.youtube.com/watch?v=Y0Z0raWIHXk

aditsu
fonte
5

Python (318)

Eu encontrei essa maneira de tornar um programa Python mais curto :)

exec'eJxtjrFqwzAQQHd/xVVgLCVqSbq5RHO2TtlcgyX7Qk3luyAphP59ZA0thGzi9O7es0bUERyn5DE/+AwOMdTxi0TljLeLmyzQB4GlaaCBg/hkWDigqMb/76aZz0CHHaCPCLaWTpLSTWw2kl7MXmkBTJC+EW7Wey3U9hmzzqU42R/MNMLEt6KFi40R5gQ28JUmndO0ODIkLhdjyjWFc9dfiLxg6Vsx1ZExu36Vddn2miVD2w59R4d9/6d+f8h7Wze3Y+GrS5gpwSjbVlV3Y1BZCg=='.decode('base64').decode('zip')
marinus
fonte
esse material .decode.decode me pareceu estúpido na primeira vez em que o vi, mas agora estou usando para fins práticos (inserir código python no meu .bashrc como funções de maneira discreta), então obrigado.
Ixtmixilix 6/09/12
5
Eu conto que o código descompactado tem 300 caracteres. Por que comprimir então?
Johannes Kuhn
5

Rebmu - 167 caracteres

M N 99 Bdz[cb[n{ bottle}egN 1{s}{}{ of beer}]]loN[cb[b W{ on the wall}C{, }b P{.}lfEZ--n[Nm{Go to the store and buy some more}]{Take one down and pass it around}cBwPlf]]

Provavelmente poderia raspar alguns caracteres, essa foi apenas uma primeira tentativa. :)

Aqui está o equivalente Rebol, que tem a taquigrafia fervida. Ainda bastante competitivo, especialmente considerando a clareza:

m: n: 99

b: does [
    combine [n { bottle} either n > 1 {s} {} { of beer}]
]

loop n [
    print combine [
        b w: { on the wall} c: {, } b p: {.} newline

        either 0 == -- n [
            n: m
            {Go to the store and buy some more}
        ] [
            {Take one down, and pass it around}
        ]

        c b w p newline
    ]
]

Código fonte comentado disponível no GitHub

Dr. Rebmu
fonte
5

PHP: 285 240 233 231 caracteres

$i=99;$b=" bottles of beer";$o=" bottle of beer";$c=" on the wall";while($i>1){echo"$i$b$c, $i$b.\nTake one down and pass it around, ".--$i.(($i>1)?$b:$o).$c.".\n\n";}echo"$i$o$c, $i$o.\nGo to the store and buy some more, 99$b$c.";

Saída aqui: http://ideone.com/5fQmcd

Yahel
fonte
4

Python, 241 caracteres

s=""
i=99
b="%d bottl%s of beer"
w=" on the wall"
t="Take one down and pass it around, "
p=q="es"
while i:s+=b%(i,p)+w+", "+b%(i,p)+".\n";i-=1;p=p[:i];s+=t+b%(i,p)+w+".\n\n"
print s[:-64]+"Go to the store and buy some more, "+b%(99,q)+w+"."
Keith Randall
fonte
4

Ruby, 274 bytes

Ainda bastante novo para Ruby, realmente apenas brincando

o =" bottles of beer";w=" on the wall";t="Take one down and pass it around, ";s=" bottle of beer"
99.downto(3){|b|puts"#{b}#{o+w}, #{b}#{o}.\n#{t}#{b-1}#{o+w}.\n\n"}
puts"2 #{o+w}, 2 #{o}.\n#{t}1#{s}#{w}.\n\n1#{s+w}, 1#{s}.\nGo to the store and buy some more, 99#{o+w}."
derekerdmann
fonte
4

C # (299 caracteres)

using System;class D{static void Main(){string a="s",z="",w=" on the wall",q=", ",p=".\n",b=" bottle",c=" of beer";for(int O=99;O>=1;)Console.WriteLine(O+b+(O>1?a:z)+c+w+q+O+b+(O>1?a:z)+c+p+(--O>0?"Take one down and pass it around, "+O:"Go to the store and buy some more, 99")+b+(O==1?z:a)+c+w+p);}}
jcolebrand
fonte
11
Sua linha final exibe "99 garrafas" em vez de "99 garrafas", e você tem seu loop começando de 19 em vez de 99 (embora isso provavelmente seja apenas um descuido).
Nellius 28/01
@Nellius ~ Corrected ~ e, graças ao seu código competitivo, revisitei o meu e removi alguns blocos de inserção únicos e reduzi algumas constantes preexistentes no meu próprio código. Agora abaixo de 300 sem problemas.
precisa saber é o seguinte
Você pode baixá-lo para 293 soltando "using System"; e alterando "Console.WriteLine" para "System.Console.WriteLine"
Tester101
@ Tester101 ~ Boa chamada. Não tinha considerado isso!
Jcolebrand #
4

JavaScript (7 funções)

Não jogou golfe. Isso pretende ser uma implementação (principalmente) funcional da música.

function firstUpper(s) {
    return s.slice(0, 1).toUpperCase() + s.slice(1);
}

function bottles(x) {
    return (x || "no more") + " " + (x == 1 ? "bottle" : "bottles") + " of beer";
}

function wall(x) {
    return bottles(x) + " on the wall";
}

function line1(x) {
    return wall(x) + ", " + bottles(x) + ".";
}

function line2(x, max) {
     return (x ? "take one down and pass it around, " + wall(x - 1) : "go to the store and buy some more, " + wall(max)) + ".";
}

function verse(x, max) {
    return [line1(x), line2(x, max)].map(firstUpper).join("\n") + "\n\n";
}


function song(max) {
    var text = "";
    for(var x = max; x >= 0; x--) {
        text += verse(x, max);
    }
    return text;
}

print(song(99));
PleaseStand
fonte
4

Go (263)

package main
import "fmt"
func main(){b,i,e,r:=fmt.Println,99,"bottles","of beer on the wall"
for i>0{b(i,e,r+",",i,e,r[:7]+".")
if i--;i<2{e=e[:6]}
if i>0{b("Take one down and pass it around,",i,e,r+`.
`)}}
b("Go to the store and buy some more,",99,e+"s",r+".")}
Slitione
fonte
3

PHP - 252 bytes

$a=" bottles of beer";$b=str_replace("s","",$a);$c=" on the wall";for($i=98;$i;)echo($j=$i+1).$a.$c.", ".$j.$a.".
Take one down and pass it around, ".$i.($i-->1?$a:$b).$c.".

";echo"1".$b.$c.", 1".$b.".
Go to the store and buy some more, 99".$a.$c.".";

Espero comprimir mais amanhã.

Aurel Bílý
fonte
3

Ruby 1.9.2p136: 223

Eu não sou covarde, você pode ler o meu; p

b="%d bottle%s of beer"
w=' on the wall'
99.downto(1){|z|s=b%[z,z>1?'s':'']
puts s+w+", "+s+".
"+(z>1?"Take one down and pass it around, "+b%[z-1,z>2?'s':'']+w+".

" :'Go to the store and buy some more, '+b%[99,'s']+w+".")}

fonte
3

SQL (Oracle)

Sem contagem de caracteres, eu não joguei. Só achei isso uma maneira divertida de fazer isso.

WITH
   bottles AS (
      SELECT LEVEL - 1 AS bottle 
      FROM dual
      CONNECT BY LEVEL <= &number_of_bottles + 1
   ),
   fragments AS (
      SELECT
         'no more ' AS none,
         'bottles of beer' AS supply,
         ' on the wall' AS wall,
         'Take one down and pass it around' AS drink,
         'Go to the store and buy some more' AS refill,
         CHR(13) || CHR(10) AS newline
      FROM dual
   ),
   combined AS (
      SELECT
         b.bottle,
         DECODE(
            b.bottle, 
            1, b.bottle || ' ' || REPLACE(f.supply, 's'),
            0, f.none || f.supply,  
            b.bottle || ' ' || f.supply
         ) AS supply
      FROM bottles b
      CROSS JOIN fragments f

   ),
   two_lines AS (
      SELECT LEVEL AS line
      FROM dual
      CONNECT BY LEVEL <= 2
   )
SELECT
   CASE l.line
      WHEN 1 THEN REPLACE(c1.supply, 'n', 'N') || f.wall || ', ' || c1.supply || '.'
      WHEN 2 THEN DECODE(b.bottle, 0, f.refill, f.drink) || ', '  || c2.supply || f.wall || '.' 
   END AS song 
FROM bottles b
LEFT JOIN combined c1 ON (c1.bottle = b.bottle)
LEFT JOIN combined c2 ON (c2.bottle = DECODE(b.bottle - 1, -1, &number_of_bottles, b.bottle - 1))
CROSS JOIN two_lines l
CROSS JOIN fragments f
ORDER BY
   b.bottle DESC,
   l.line;
SQB
fonte