Bem-vindo ao mundo do golfe de compiladores. Sua tarefa é escrever um programa que gere outro programa para reproduzir uma variante do FizzBuzz na especificação.
Seu compilador
Escreva um compilador que gere variantes do programa FizzBuzz para especificar. A especificação desta variante é expressa na forma de uma matriz de pares de número inteiro / sequência.
- A entrada pode estar em qualquer forma que seja conveniente para o seu idioma. (Meus exemplos usam n: xxxx, mas isso é apenas para fins ilustrativos.)
- Cada entrada inteira pode ser usada apenas uma vez por chamada do seu compilador.
- O número inteiro de cada par terá um valor de pelo menos um.
- A sequência de cada par será composta apenas de exatamente quatro letras ASCII.
- A saída deve ser um único programa completo que esteja em conformidade com as regras abaixo.
- A saída pode estar em qualquer forma conveniente, desde que seja um programa textual. (Portanto, não retorne expressões lambda.)
O comportamento é indefinido para entradas que não estão em conformidade com as regras acima.
Seu programa FizzBuzz gerado
O programa gerado pelo seu compilador terá um único número inteiro, n , como entrada. Ele produzirá uma sequência de números começando de um até e incluindo n , substituindo números por sequências de caracteres do FizzBuzz, quando necessário.
- O programa gerado deve estar no mesmo idioma que o compilador.
- A entrada n pode estar de qualquer forma conveniente para o seu idioma.
- n terá um valor de pelo menos um.
- Um número que é múltiplo de pelo menos um dos números inteiros de entrada no compilador deve ser substituído por todas as seqüências de caracteres emparelhadas com os números inteiros unidos.
- Um número que não deve ser substituído por uma string do FizzBuzz deve ser emitido em ASCII decimal.
Por exemplo;
> GenFizzBuzz 3:Fizz 5:Buzz
> a.out 5
1
2
Fizz
4
Buzz
Pontuação
Sua entrada será pontuada pela duração dos programas que o seu compilador gera adicionados à duração do seu compilador. Execute seu compilador várias vezes com cada um dos seguintes parâmetros e adicione os comprimentos dos programas gerados juntamente com o comprimento do compilador para encontrar sua pontuação.
- Apenas conte. (Nenhuma entrada - o programa gerado contará de 1 a n sem substituições.)
- Apenas golfe. (1: Golf - O programa gerado produzirá "Golf" n vezes.)
- FizzBuzz clássico. (3: Fizz, 5: Buzz)
(Observe que seu compilador é necessário para gerar código para qualquer entrada válida, não apenas as listadas.)
Respostas:
Python 3 -
168162 + 230 = 392Oh, Python, você se esforça tanto, mas multiplicar
import sys;sys.argv
por 4 realmente dói!Programas de saída:
A entrada esperada para o programa principal é uma sequência evalable de tuplas Python ou
'()'
para nenhuma entrada. (Você disse "conveniente".) De entrada Exemplo:'()'
,'("Golf",1),'
,'("Fizz",3),("Buzz",5)'
Nota citando para shell e vírgula à direita para uma entrada.Corrigido o erro de 1h, mudando de dict (pedido indefinido!) Para tuplas.
A entrada esperada para os outros programas é apenas o número
fonte
perl6
37634084 + 115 = 199UPDATE: mudou de perl5 para perl6 para ficar
say
semuse feature
.UPDATE: três casos de teste em vez de cinco
Existem centenas de soluções já disputadas para o FizzBuzz, e muitos concursos terminam com o mesmo resultado, então foi aí que comecei. Meu compilador apenas produz uma versão personalizada dessa solução. Alguns caracteres extras foram inseridos para explicar a variação "apenas contar".
compilador, espera argumentos assim: "Fizz 3" "Buzz 5"
programas compilados, espere argumentos assim: 100
programas compilados para casos de teste antigos:
fonte
Pyth - 51 + (38 + 43 + 50) = 182 bytes
Provavelmente pode jogar golfe no compilador alguns bytes. Os links de todos eles são permalinks para o intérprete online.
Compilador - 51 bytes
Apenas faz a formatação de strings com uma tupla de entrada. Aceita entradas como:
Nada - 38 bytes
Just Golf - 43 bytes
Buzz clássico do Fizz - 50 bytes
fonte
C ++ 11 ~ 486 + (234 + 244 + 255) = 1219
Primeira participação aqui, esse desafio não está entre os mais difíceis, então pensei em tentar. No entanto, usando C ++, e mesmo com adições ao C ++ 11, ainda é uma linguagem bastante detalhada, mas tenho certeza de que há espaço para melhorias.
Compilador (486):
Ele assume argumentos na forma de
3Fizz 5Buzz
etc.Contagem (234):
Golfe (244):
FizzBuzz (255):
Informação adicional
Testado com o GCC 4.8.1, sem truques do compilador.
Aqui está um pequeno makefile para automatizar a geração dos casos de teste e executá-los (uso
make run
):fonte
map<int,string> f
poderia sermap<int,string>f
. Você pode inicializarj=1
ao mesmo tempo comz
.Ruby 99 + (86 + 94 + 103) = 382
Uso:
fonte
Stax , 23 + 5 + 17 + 29 = 74
Execute e depure
Resposta mais curta até agoraNão surpreendentemente derrotado por Jelly. O modelo de string fornecido no Stax é realmente elegante e fornece funções do tipo printf. Os programas gerados pelo compilador são quase sempre tão curtos quanto os melhores, codegolfing manualmente, sem usar empacotamento.O compilador em si tem 23 bytes .
O equivalente ASCII é:
Entrada fornecida
[]
, gera esta (5 bytes)Execute e depure
Entrada fornecida
[[1,"Golf"]]
, gera esta (17 bytes)Execute e depure
Entrada fornecida
[[3,"Fizz"],[5,"Buzz"]]
, gera esta (29 bytes)Execute e depure
fonte
Lisp comum,
636577Peguei minha outra resposta e envolvi-a em quasiquotes enquanto adicionava parâmetros de entrada. Imprimo o formulário resultante como uma linha única e removo caracteres desnecessários de espaço em branco. O compilador é um pouco mais longo que a versão anterior, mas a pontuação resultante é reduzida.
Ponto
Valores retornados:
Bonita
O formato de entrada é uma lista de
(number string)
casais. Por exemplo:... imprime na saída padrão:
... que, bem impresso, é:
Testando a função resultante:
fonte
Perl 5 , 77 + 93, 170 bytes
Experimente o compilador online!
Tente apenas contar online!
Tente apenas jogar golfe online!
Experimente o fizz buzz online!
fonte
Geléia ,
88848373 bytesResposta mais curta até agora (supera a "resposta mais curta" anterior por 1 byte)
Compilador:
Experimente online! (compilador)
Experimente online! (verifique o número de bytes)
Estatisticas:
fonte
C, total de 1080 bytes
Compilador [369 bytes]
Fizz Buzz [241]
Golfe [237]
Contagem [233 bytes]
fonte
dc , 434 bytes
Experimente online!
A entrada para o compilador (168 bytes) deve ser colocada na pilha como número inteiro, sequência, número inteiro, sequência e assim por diante (
3 [Fizz] 5 [Buzz]
). Deveria ser dada na ordem em que se deseja que seus efervescentes e zumbidos sejam impressos, o que pode ser um truque (tendo implementado o tipo de bolha emdc
antes, acredito que custaria cerca de 100 bytes), mas também permite ao usuário , digamos, ainda tenha 'Fizz' executado em 3 e 'Buzz' em 5, mas tenha 15 rendimentos 'BuzzFizz'.Tenho certeza de que isso pode ser jogado um pouco mais; a macro principal no programa final (
M
) depende de duas macros (F
eP
) que são bastante desnecessárias, dado que não há informações. No momento, o compilador verifica as entradas e saídas de versões diferentes (muito menores) dessas macros, se não houver nenhuma, mas não tenho certeza de que toda a instalação seja ótima.O compilador em si é bastante direto, apenas verifica se há 'regras' na pilha e, se for o caso, imprime o código que armazena a profundidade da pilha
z
, armazena a pilha em uma matriz indexada em 0a
e depois imprime o generalizado Código FizzBuzz. Se não havia nada na pilha, ele realmente imprime apenas uma versão modificada do código do FizzBuzz. Casos de teste:Nenhuma entrada (46 bytes):
3 [Fizz] 5 [Buzz] (117 bytes):
1 [Golfe] (103 bytes):
Todos esperam que o valor n na pilha seja armazenado
n
. Os que possuem 'regras' os colocam na matriza
, com as seqüências de caracteres em índices ímpares e os números inteiros em pares. A macro principal,M
, incrementa o que estiver na pilha, executa a macroF
que verifica o valor em relação à matriza
, verifica se oF
registro é definidob
como verdadeiro ou não e imprime o topo da pilha, se houver, ou uma nova linha, se não, redefineb
para falsidade e depois mantém executando-se sen
ainda não foi alcançado. A macroF
, dadas regras, percorre toda a matriz em busca de correspondências. Ele é incrementado em dois, uma vez que nossos números inteiros e seqüências de caracteres são tecidos através da matriz e, em uma correspondência, chama macroB
. MacroB
apenas recupera a string (posição atual na matriz menos uma) e a imprime. Também defineb
como verdade. Nosso compilador não se preocupa em imprimirB
sem entrada e essencialmente fazF
um nop.fonte
vim, 122 (compilador) + 73 (vazio) + 90 (golfe) + 123 (fizzbuzz) = 392 bytes
Compilador
Formato de entrada
Código gerado para o caso FizzBuzz
Código gerado, anotado
<C-V>
é 0x16.<ESC>
é 0x1b.<C-A>
é 0x01.Sessão de exemplo
fonte
SlooSarksi .Lang, 179
fonte