99 erros no código
A adaptação de "99 garrafas de cerveja na parede" para a ciência da computação, onde os bugs aumentam em vez de diminuir as garrafas, é frequentemente publicada na Internet. Exemplo de camiseta aqui .
Eu acho que será interessante ver uma possível recursão e geração aleatória de números em uma enorme variedade de idiomas e encontrar as maneiras mais eficientes de fazer isso.
Existem alguns outros desafios a serem enfrentados com 99 garrafas de cerveja, mas nenhuma parece ter um número crescente e decrescente!
Desafio
Seu programa ou função não deve receber nenhuma entrada e depois imprimir
99 erros no código
99 erros no código
Pegue um e remova-o
X erros no código
(linha em branco)
Onde X é o número inteiro anterior menos 1 mais um número inteiro aleatório no intervalo [-15,5].
Você pode mesclar o menos 1 no número inteiro aleatório, permitindo o intervalo [-16,4].
As faixas podem ser exclusivas, portanto menos um mais (-16,6) ou (-17,5).
Os números inteiros aleatórios não precisam ser distribuídos uniformemente, apenas precisam ser possíveis.
O programa sempre começa com 99 bugs.
Você pode ignorar o erro gramatical de "1 erro".
O programa deve parar quando o número de bugs for 0 ou negativo e imprimir
0 erros no código
Nunca deve haver um número negativo de bugs. O final deve parecer
Y erros no código
Y erros no código
Pegue um e remova-o
0 erros no código
(linha em branco)
0 erros no código
Uma nova linha à direita é aceitável.
- Seu código pode ser um programa completo ou uma função.
- Não há entrada.
- A saída deve ser stdout ou retornada.
- Avisos / erros nos logs / STDERR são válidos desde que STDOUT possua o texto necessário. Veja aqui para mais informações.
Isso é código-golfe, portanto o código mais curto em bytes vence.
Saída de exemplo
Saída de exemplo de caixa de colagem criada para -11 erros cada vez
Respostas:
R ,
182140138135 bytesExperimente online!
embora seja razoavelmente bom na geração aleatória de números, R é péssimo em strings e impressão.JayCe encontrou cerca de um bilhão de bytes e continua a encontrar novas maneiras de jogar isso!fonte
+5
custando mais 2 bytes? por que não apenassample(26,6))
?sample
Java 8,
161160 bytes-1 byte graças a @ JonathanAllan .
Experimente online.
Explicação:
fonte
r
nada?,r
parece ainda funcionar: Experimente online!PowerShell ,
137135133131 bytesExperimente online!
A seção "bugs no código" é salva
$b
para uso posterior. Define$a
como99
, entra em umfor
loop$a
. Primeiro, criamos uma matriz de duas cadeias," "*2
, com a cadeia sendo a"X bugs in the code"
.Em seguida é apenas a corda
"Take one down and patch it around"
. Em seguida, incrementamos$a
selecionando umRandom
número inteiro no intervalo[-16,4]
. Depois disso, fixamos$a
para estar no mínimo zero usando um ifif($a-lt0){$a=0}
. Então a corda"Y bugs in the code"
.Finalmente, depois que o loop termina, colocamos a corda
"0 bugs in the code"
no pipeline. Todas essas strings são coletadas do pipeline, e um implícitoWrite-Output
nos fornece novas linhas entre elas de graça.Salva dois bytes usando um
for
loop em vez de umwhile
loop.Salva dois bytes movendo
$b
- se para sua própria seção.Economizou dois bytes graças a Adrian Blackburn.
fonte
JavaScript (Node.js) , 127 bytes
Experimente online!
Explicação:
Obrigado a @tsh pela idéia de recursão e implementação (salvou alguns bytes)
Todas as sugestões de golfe ainda são bem-vindas.
fonte
0+
removido? Parece ser uma saída necessária.05AB1E , 59 bytes
Experimente online!
fonte
Python 2 , 151 bytes
Bom truque
j=i+max(-i,randint(-16,4))
de Jo King, explorando a distribuição desigual permitidaSalvou alguns bytes graças ao Mnemonic
Experimente online!
fonte
j=max(0,i+randint(-16,4))
.Carvão vegetal , 81 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Comece com 99 erros no código.
Salve a sequência compactada "% d erros no código \ n".
Repita enquanto houver um número positivo de erros restantes.
Imprima o número de bugs no código duas vezes.
Imprima "Pegue uma e remova-a".
Adicione um número aleatório de bugs entre -17 (exclusivo) e 4 (inclusive).
Imprima o número de bugs restantes ou 0 se negativo.
Deixe uma linha em branco entre os versículos.
Após o último verso, imprima 0 erros no código novamente.
fonte
JavaScript,
189176168162 bytesExperimente online!
Obrigado por Muhammad Salman pela falta de
console.log
substituição e por Oliver pela melhoria do teste xObrigado por l4m2 por jogar este por 8 bytes
fonte
x<=0?console.log("\n"+0+a):f(x)
no final.f
declaração. Votado até atualizado para corrigir isso. (Também o meu link precisa de uma atualização também)f
, o que você não pode assumir.Python 3 ,
156138 bytesGraças à resposta de Jonathan Python 2 para o
id
truqueExperimente online!
Explicação:
fonte
Oitava ,
149148 bytesSalvou um byte alterando
randi(21)
e%i
para21*rand
e%.f
.%.f
garante que a saída seja flutuante com zero decimal (ou seja, inteiro).Inserido um monte de quebras de linha em vez de vírgulas e ponto e vírgula para facilitar a legibilidade. Parece errado, mas não é mais do que o one-liner.
Experimente online!
Explicação:
Usar em
p((x+=21*rand-17)*(x>0)
vez demax
salva um byte, mas a última linha é exibida em-0 bugs ...
vez de0 bugs
. Funciona comrandi(21)-17
, mas tem o mesmo comprimento que o acima. Experimente online!fonte
COBOL (GnuCOBOL),
317294279270 bytesExperimente online!
Ungolfed
Nota: a última frase ainda é impressa, porque o COBOL executa todo o programa e após o
perform until
loop, "passa" pelo rótulo a , executando suas instruções. Esse comportamento é semelhante a umswitch case
sembreak
.PS: Os números não são exatamente exibidos conforme necessário, mas o COBOL não é tão bom na conversão automática de números em uma representação bastante textual.
fonte
-=
ini-=Math.random()*21-4
), que implica parênteses em torno de todo o operando do lado direito. Eu esqueci de explicitar, mas agora está corrigido, eu acho.VBA:
212163 bytesEsta solução é baseada na que Chronocidal postou ontem. Este é o meu primeiro post e não tenho reputação suficiente para comentar sobre o post dele.
Esta revisão contém dois aprimoramentos.
While/Wend
vez deFor/Next
salva alguns caracteres.GoSub
e as linhasExit Sub
eReturn
necessárias para suportá-lo.Edit:
3. Removido o espaço em branco e os caracteres que o editor do VBA adicionará automaticamente de volta. Consulte Dicas para jogar golfe no VBA
. espaço em branco. Uma alteração de chave era anexada
vbLF
à sequência de saída, portantoDebug.Print
, não precisava ser chamada com tanta frequência. Muitos elogios para EricF .Este foi um desafio divertido. Se você conhece um intérprete on-line como o TIO for VB6 / VBScript / VBA, deixe um comentário.
Se você deseja testar esse código e ter o Microsoft Excel, Word, Access ou Outlook instalado (apenas Windows), pressione Alt + F11 para abrir o IDE do VBA. Insira um novo módulo de código (Alt + I, M) e limpe
Option Explicit
. Em seguida, cole o código e pressione F5 para executá-lo. Os resultados devem aparecer na janela Imediata (pressione Ctrl + G se você não a vir).fonte
c
em vez dec>0
como sua condição Enquanto, e usarc=Iif(c<0,0,c)
, em vez deIf c<0 [...]
: pastebin.com/nFGtGqdELaTeX ,
368304293287245240 bytesEmbora não seja realmente competitivo comparado aos outros programas em termos de bytes, eu só queria ver como fazer isso no LaTeX.
Mais legível:
Melhorias (por edição):
\if
cláusula para o\repeat
as\else
\value{b}=x
funciona para inicialização, mas não no loop (em vez de\setcounter{b}{x}
)\relax
deve ser usado para o ponto 3, mas isso também pode ser alcançado através da inserção de um espaço. Removidos os\else
comandos TeX usados em vez do LaTeX, pois são mais curtos e substituídos\'
por~
.fonte
\ifnum\value{b}<1
, em vez de<0
?C,
169165 bytesObrigado a @ceilingcat por salvar quatro bytes!
Experimente online!
fonte
SAS, 210 bytes
Ungolfed:
Pode economizar alguns bytes, se são permitidos avisos no log (coloque o
&a
na&b
variável de macro, mas que gera um aviso inicial).fonte
PHP, 126 bytes
Execute na linha de comando, usando
php -r 'code here'
:fonte
ABAP , 295 bytes
... porque por que diabos não!
Certamente não é competitivo em comparação com outros idiomas, mas eu consegui reduzi-lo dos 330 bytes que escrevi inicialmente, então conto como uma vitória pessoal.
Como o ABAP não permite linhas com mais de 255 caracteres, tive que substituir um espaço por uma quebra de linha. No Windows, isso inicialmente aumentou o tamanho para 296 bytes devido ao CRLF, mas funciona bem apenas com o LF existente. A ABAP com certeza exige muitos espaços, portanto, isso não é grande coisa.
WRITE simplesmente despeja o texto da GUI, então acho que é como stdout? Provavelmente eu poderia salvar alguns bytes aqui usando uma estrutura ou tabela, mas devido à maneira como o SAP lida com estruturas mistas (contendo caracteres e números), a abordagem que imaginei funcionaria apenas em sistemas não Unicode ... Que eu pessoalmente considero um vá, apesar de ter acesso a ambos.
O módulo de função para números aleatórios é o único que eu poderia encontrar em nosso sistema, suponho que poderia haver um com um nome ou parâmetros mais curtos. Nenhuma idéia!
Código mais ou menos legível, comentários incluídos:
Obrigado pelo desafio!
Para o meu chefe: Por favor, não me demitir, estou apenas me educando!
fonte
Limpo ,
245234 bytesExperimente online!
fonte
C #,
184181 bytesMinha primeira resposta do Code Golf!
(Baseado na resposta Java de @Kevin Cruijssen)
Experimente online!
fonte
C (gcc) ,
141137 bytesUsei macros de pré-processador para obter grande justiça (aviso: TV Tropes)
Experimente online!
fonte
T-SQL, 188 bytes
O SQL permite retornos dentro de literais de string, o que ajuda.
CONCAT()
faz uma conversão implícita em texto para que eu não precise me preocupar comCAST
ouCONVERT
.fonte
JavaScript, 138 bytes
Mostrar snippet de código
fonte
QB64 , 134 bytes
Do meu irmão.
fonte
Pitão ,
9492 bytesExperimente online
Versão anterior: 94 bytes
fonte
Geléia , 61 bytes
Um link niládico que também funciona como um programa completo.
Experimente online!(a saída é liberada após a conclusão da execução, mas imprime parágrafo por parágrafo)
Quão?
fonte
Perl, 132 bytes
fonte
VBA:
225233 bytes{EDIT} adicionada a falta
rnd()*
Notas:
Usada
GoSub
para imprimir a linha em triplicado, porque é um pouco menor do que atribuir a linha a uma variável eDebug.Print
inseri-la.Debug.Print
sem nenhum argumento, imprime uma linha vazia (sem necessidade de uma cadeia nula ou vazia). UmaWorksheetFunction.Max
linha seria muito longa; portanto, usei um "se menor que" para evitar negativos.Com recuo e comentários
fonte
rnd() *
- acho que estava ocupado fazendo uma contagem se houvesse menos caracteresDim c%
(ou seja, "c é um número inteiro") e solte oInt()
Python 2 ,
138 134 133 131127 bytes-1 Obrigado a Jo King (reorganize para usar a lógica em
bugs-=min(bugs,randomNumber)
vez debugs=max(0,bugs-randomNumber)
). Isso permitiu a saída forçada usando um erro de divisão por zero, economizando mais 6 bytes!Experimente online!
fonte
Ruby: 149 bytes
Deve funcionar em praticamente qualquer versão do Ruby> = 1.8
Eu acho que pode ser possível otimizar um pouco mais as strings, mas em geral estou bastante satisfeito com isso - em particular a atribuição de combinação / comparação / declaração de interrupção e o abuso de colchetes opcionais.
Nota: a saída tecnicamente possui duas novas linhas finais; se isso precisar ser contabilizado, ele aumentará 4 caracteres.
fonte
\n
(não\r
).Zsh , 133 bytes
Experimente online!
Isso tira proveito de alguns recursos do zsh.
while list; do list; done
pode ser escrita comowhile list {list}
printf
for numérico, o argumento correspondente será avaliado como uma expressão aritmética. Assim:n
graça sem usar um$
n -= RANDOM % 21 - 4, n = n > 0 ? n : 0
é novamente avaliada sem a necessidade de utilização$((...))
,$[...]
ou semelhante. O>
e?
teve que ser escapado.printf $b
no final avalia um argumento vazio como 0 para%d
.$b
nenhum lugar.$b$b"Take..."
vez de"$b${b}Take..."
.\n
e emfor((n=99;n;))
vez den=99;while ((n))
.fonte