O objetivo deste código golf é criar um intérprete para a linguagem de programação HQ9 +.
Existem 4 comandos nessa linguagem de programação:
- H - imprime "Olá, mundo!"
- Q - imprime o código fonte do programa
- 9 - imprime a letra da música "99 garrafas de cerveja"
- + - incrementa o acumulador
As regras:
- Porque o acumulador não está definido, você pode ignorar o comando +
- Seu programa deve solicitar entrada (essa entrada será o código-fonte) ou o código-fonte é lido de um arquivo
- Você não tem permissão para colocar a letra de "99 garrafas de cerveja" em um arquivo e ler o texto do arquivo
- Você não tem permissão para usar um algoritmo de compactação, como GZip ou BZip, para compactar o texto da música: você deve criar seu próprio algoritmo de compactação. Isso não precisa ser um algoritmo complexo, mas tente compactar o texto o máximo possível (lembre-se: este é um código de golfe, o código com o menor número de bytes ganha)
- Se o código-fonte contiver um caractere que não seja H , Q , 9 ou + , emita a saída "O código-fonte contém caracteres inválidos" antes de executar qualquer comando! Isso significa que, se o código-fonte for,
H1
por exemplo, não saiaHello, world!
antes de sairSource code contains invalid characters
. Não, saída imediataSource code contains invalid characters
- Se o seu intérprete aceita caracteres maiúsculos e minúsculos, você recebe -8 na contagem de caracteres
Boa sorte!
code-golf
interpreter
hq9+
ProgramFOX
fonte
fonte
Respostas:
APL (Diálogo) (326 - 8 = 318)
Cole-o em uma janela do editor e ligue
H
. A entrada é retirada do teclado.fonte
Mathematica,
349 346341 caracteresfonte
If[StringMatchQ[3, "a"], x, y]
C,
599587487481467 caracteresTenho certeza que isso pode ser derrotado. Eu estou usando C depois de tudo. Há uma razão pela qual você não vê muitas entradas vencedoras de golfe escritas em C. Agora, são 467 caracteres graças ao abuso criminal de
#define
.Especifique o arquivo de origem HQ9 + como um argumento da linha de comandos.EDIT: Agora aceita a fonte de stdin, não um arquivo. Inicie o programa, comece a digitar o código, CTRL- Cquando terminar de executá-lo.
Compila pelo menos em MinGW / GCC com:
gcc -o hq9+.exe hq9+.c
Deveria funcionar no MSVC, mas não queria criar uma solução completa apenas para isso. :)
Ou:
fonte
C
e alguns antesR;
. Também pode cortar 8 caracteres comp[s++]=0;
o loop de entrada para simplificar a impressãop
.Python 2 -
452453443 bytesBleh. Já estava sangrando, mas descobri um bug que me custou um byte para corrigir. Bleh.
(Eu não costumava incluir
+
na saída paraQ
. Uma entrada deQ+++
deu a saídaQ
, por exemplo.)Salvei alguns caracteres por não sair com entrada inválida, como eu pensava.
Versão explicada em breve.Eu desisto. Eu mal entendo como essa monstruosidade funciona mais. Se houver demanda, darei outra chance, mas até então não está acontecendo.fonte
exit
usa o caractere inválido, apenas exibe a mensagem, para que você possa salvar 7 caracteres.99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *99* bottles of beer on the wall.
Deve-se dizer:99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *98* bottles of beer on the wall.
+
. Você deveria ignorar+
, não para cometer um erro #HQHH
, deveria dizerHello World!HQHHHelloWorld!Hello World!
Perl, 325 - 8 = 317
Expandido:
fonte
Ruby,
364360 - 8 = 352Ainda tem muito espaço para melhorias. Código de 99 garrafas roubado daqui .
fonte
No more bottles of beer on the wall
depois da1 bottle
seção. então éGo to the store...
1 bottle of beer on the wall, 1 bottle of beer on the wall, take one down, pass it around, no more bottles of beer on the wall. No more bottles of beer on the wall, no more bottles of beer, go to the store, buy some more, 99 bottles of beer on the wall.
Haskell, 298
isso é bem direto.
%
retorna a saída de um comando (dado o código-fonte para usoQ
).d
retorna a música de 99 garrafas com uma linha de sucata no início por razões de golfe. tudo está envolvido em uma interação (você pode usar emg
vez demain
testar)fonte
<interactive>:8:5: parse error on input ‘=’
.let
para inserir definições (isso é interrompido ao inserir várias definições não separadas por;
) ou executar o código de um arquivo.main
, ele diz que o código fonte contém caracteres inválidos quando tento executarH
. Quando tento executar emg
vez demain
, ele imediatamente dá um erro.main
não funciona porque a nova linha anexada não é um comando legal. É por isso que eu recomendo usarg
. Quanto ag
,putStrLn $ g "H"
não funciona corretamente?J - 444 bytes
Eu gostei do número, então parei de jogar golfe. Aqui está, função de expressão única!
Exemplos:
fonte
Fortran 528
470481Requer a compilação com o-fpp
sinalizador (+3 para pontuar) 1 para usar diretivas de pré-processamento (que economizam muito mais do que 3 caracteres, por isso estou totalmente de acordo com isso). Também não diferencia maiúsculas de minúsculas, então há -8: D. Salvou 5 caracteres ao não pré-processar oendif
que é usado uma vez de qualquer maneira .Requer que o arquivo tenha uma
.F90
extensão (faz sentido chamá-lohq9+.F90
) para que o compilador force o pré-processamento. O código faz distinção entre maiúsculas e minúsculas; torná-lo sem distinção entre maiúsculas e minúsculas adiciona algo como 16 caracteres; portanto, não vale a pena salvar 8 caracteres. A minha resposta anterior não conta para a mudança plurais embottles
para9
; esta versão corrige (e infelizmente adiciona muito mais caracteres).Parece muito melhor não-processado e não-processado (provavelmente porque você pode ver o que está acontecendo):
fonte
.cc
para evitar a necessidade do-lstdc++
sinalizador.Python 2, 340 - 8 = 332
fonte
Lua 443 - 8 = 435
464 - 8 = 456Consegui salvar 21 caracteres usando vários
if-end
s em vez deif-elseif-end
. Eu também tinha alguns espaços em branco extras flutuando depois de alguns)
.Estou bastante feliz com este, mesmo que não seja muito menor do que minha resposta do Fortran . O código das 99 garrafas de cerveja foi modificado a partir desta resposta por Alessandro . Ungolfed, temos
fonte
if s in'Hh'
in
é para iteradores de loop for e não para comparações; você receberá um erro se colocar isso lá. Existem três opções aqui: (1) usematch
em cada linha, (2) usuários=='h'or s=='H'
em cada linha, (3) faça da maneira que eu fiz. Claramente (3) é menor que (1) e (2).Julia, 362
fonte
Tcl, 515
Apenas um pouco de golfe, ainda menor que C e as 99 garrafas de cerveja corretas no verso.
fonte
regexp
. Você pode obter meu golfe de 99 cervejas em codegolf.stackexchange.com/a/109818/29325JavaScript (ES6), 385
Não optar por não diferenciar maiúsculas de minúsculas, teria custado muitos caracteres. Nem mesmo perto de algumas das outras entradas, mas foi divertido!
JavaScript, 344
Eu fiz uma versão com uma versão menos completa da música:
mas depois de ver as outras entradas (e olhando as letras reais, quem sabia!), pensei que era um pouco de polícia!
fonte
Go to the store, buy some more, *99* bottles of beer on the wall
, não*No more* bottles of beer on the wall
Q
não funciona para mim.Q
era para fazer isso da vez e forneci o código fonte da função em vez da entrada ... Essa foi originalmente a minha razão para fazê-lo em JS, essa parte seria fácil, mas agora eu sei que não é isso que é necessário!C, 562 bytes
Como um programa completo. O primeiro argumento é o programa HQ9 +. Com um acumulador real. Eu me desafiei a não usar declarações de definição.
Versão não destruída:
fonte
Java, 546 bytes
Este é o meu primeiro envio de código de golfe. Estou certo de que poderíamos fazer mais com isso. Ele lê a entrada como o argumento da linha de comandos. Código da cerveja "emprestado" da resposta java "99 garrafas de cerveja" (creative commons)
Deixe-me saber se os argumentos da linha de comando não são aceitáveis. Isso foi muito divertido!
fonte
Excel VBA, 489 bytes
Sem indentação:
(recuado para facilitar a leitura)
Renomear a chamada padrão do Módulo1 para M
com
h "+++++++++Your Code"
Isso também funcionará em outros aplicativos de escritório, alterando o ActiveWorkbook para o tipo de documento apropriado
fonte
For n=1 To
aFor n=1To
(removendo espaços em branco antesTo
) e 4 bytes através da conversão de todas as instâncias deDebug.? 2;
aDebug.?2;
(removendo espaços em branco após a?
palavra-chave)