Era uma vez, eu estava lendo esta pergunta / resposta no Quora
Este código é dado como a resposta óbvia
for i in range(1, 100):
if i % 3 == 0 and i % 5 == 0:
print "FizzBuzz"
elif i % 3 == 0:
print "Fizz"
elif i % 5 == 0:
print "Buzz"
else:
print i
É claro que o FizzBuzz foi jogado até a morte, mas não é disso que se trata. Nos comentários, alguém menciona que essa resposta óbvia é ótima, pois é fácil adicionar condições extras, como imprimir "Jazz" para múltiplos de 4. (Não concordo. Estender esse esquema requer O (2 ** n ) linhas de código.)
Seu desafio é escrever a versão mais bonita do FizzJazzBuzz, conforme julgado por seus colegas.
Algumas coisas a serem consideradas pelos eleitores:
- SECO
- Eficiência das operações de divisão / módulo
Muitas das respostas no Quora estavam usando Python, mas não há essa restrição de idioma aqui.
Aceito a resposta com mais votos daqui a um mês
Saída de amostra:
1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz
popularity-contest
code-challenge
word
popularity-contest
string
grid
language-design
code-golf
source-layout
math
fastest-algorithm
assembly
code-golf
json
code-golf
arithmetic
array-manipulation
code-golf
ascii-art
code-golf
crossword
code-golf
string
restricted-complexity
code-golf
ascii-art
kolmogorov-complexity
code-golf
string
decision-problem
balanced-string
syntax
code-golf
grid
puzzle-solver
hexagonal-grid
code-golf
math
number
sequence
code-golf
string
decision-problem
code-golf
cryptography
king-of-the-hill
code-challenge
fastest-code
code-golf
number
code-golf
code-golf
string
code-golf
cryptography
king-of-the-hill
java
code-golf
number-theory
base-conversion
code-golf
code-golf
array-manipulation
code-golf
array-manipulation
sorting
code-challenge
restricted-source
quine
code-golf
tips
python
king-of-the-hill
code-golf
source-layout
fractal
code-golf
tips
game
king-of-the-hill
path-finding
grid
code-golf
kolmogorov-complexity
natural-language
code-golf
tips
python
code-golf
number
arithmetic
sequence
array-manipulation
code-golf
number
combinatorics
random
integer-partitions
code-golf
string
code-golf
vim
comment
code-golf
combinatorics
counting
code-challenge
rosetta-stone
code-golf
combinatorics
sequence
subsequence
code-golf
code-challenge
restricted-source
primes
printable-ascii
popularity-contest
graphical-output
image-processing
mordedor
fonte
fonte
Respostas:
A versão mais bonita, você diz? Então, vamos tentar este em ...
Linguagem de programação de Shakespeare
Então, depois da minha luta com a SPL aqui , senti que tinha que fazer pelo menos uma finalização em qualquer desafio. E é isso.
Então, o que é tudo isso então?
Então, primeiro, declaramos as variáveis que usaremos ao longo do programa, que devem vir das peças de Shakespeare. Farto de Romeu, Julieta, Ofélia e Othello, fui com o Arcebispo de Cantuária e Lady Capulet . Suas descrições, assim como os títulos de Atos / Cenas, são desprezados pelo analisador, para que você possa colocar praticamente tudo o que quiser.
Então, vamos fazer um rei da tradução para algo um pouco menos sem sentido .
Ato I, Cena I
Begin Lady Capulet = 0;
O ato I é bem direto: inicializamos nossa variável com 0.
Ato I, Cena II
Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;
Nós aumentamos o valor de Lady Capulet e o comparamos com 100 (sim, essa frase inteira serve apenas para obter o número 100); se não for menor, pularemos para a cena VIII (final); caso contrário, continuamos na próxima cena.
Ato I, Cena III
if(Lady Capulet % (2+1) == 0) continue; else goto Scene IV; The Archbishop of Canterbury = 2*2*2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Primeiro, vemos se o módulo da divisão por 3 é 0; caso contrário, passamos para a cena IV; se for, começamos a fazer operações aritméticas e as armazenamos no Arquieperson, produzindo-as na forma de caractere assim que encontrarmos a que procuramos. Sim, no final, a ideia é entender
Fizz
.Ato I, Cena IV
if(Lady Capulet % (2*2) == 0) continue; else goto Scene V; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*1; The Archbishop of Canterbury += 2*2*1+(-1); System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+2*2*2*1; The Archbishop of Canterbury += 1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Primeiro verifica se o módulo da divisão por 4 é 0 e depois continua como a mesma cena de antes
Jazz
.Ato I, Cena V
if(Lady Capulet % (2*2+1) == 0) continue; else goto Scene VI; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; The Archbishop of Canterbury += 2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury); goto Scene VII;
Funciona como as duas anteriores, verificando se o módulo da divisão por 5 retorna 0 e, em seguida, tenta escrever
Buzz
; a única diferença é que, no final, pulamos uma cena.Ato I, Cena VI
System.out.print(Lady Capulet);
Para chegar a essa cena, o número assumido por Lady Capulet não deve ter sido nem Fizz, nem Jazz, nem Buzz; então, nós a produzimos na forma numérica.
Ato I, Cena VII
The Archbishop of Canterbury = 2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); goto Scene II;
Então, essa é a única maneira que encontrei para pular para a próxima linha: saída, primeiro, um CR, depois um LF; então, voltamos à cena II, para a qual podemos continuar com o programa.
Ato I, Cena VIII
End.
Simples o suficiente.
Ainda estou tentando ver se posso mostrar isso em execução on-line, mas não consigo encontrar um compilador on-line - aquele que eu conheço não parece combinar bem com nenhum programa, exceto o que já foi carregado, ou talvez haja algum tipo de problema com a interface entre o teclado e a cadeira ...
Atualização 1:
Após o comentário de mathmandan, editei a ordem das cenas de Jazz e Buzz. Tinha que ser feito.
fonte
z
e redefini-lo antes de cada ciclo.> <> (Peixe)
> <> é uma linguagem de programação 2D em que as instruções são caracteres simples e o ponteiro de instruções (IP) pode mover-se para cima, baixo, esquerda ou direita, dependendo das setas
^>v<
e dos espelhos/\
. Ele não possui variáveis ou strings, portanto, não se repetir é um pouco mais difícil, mas acho que isso é legal à sua maneira.Empurramos
1
e iniciamos o ciclo.:9b*)?;
verifica se o número é maior que 99 (9b* = 9*11
) e se o programa é interrompido;
. Caso contrário, coloque um 0 no registrador e desçav
para a parte ondulada.:3%?
verifica o número do módulo 3. Se não for zero, vamos descerv
uma linha e mover para a esquerda<
. Caso contrário, pulamos a seta para baixo e pressionamos"Fizz"
, imprimimos (r}oooo
) e incrementamos o registro (&1+&
) antes de saltar dos espelhos da parede direita para descer uma fileira. De qualquer maneira, acabamos movendo para a esquerda ao longo da terceira fila, até saltarmos dos espelhos da parede esquerda. Então repetimos paraJazz
eBuzz
.Isso continua até a 7ª linha, que verifica o
&
valor do registro . Se for diferente de zero, simplesmente caímos. Caso contrário, imprimimos o número em sin
antes de descer.Por fim,
ao
(lembre-se, estamos indo para a esquerda agora!) Imprime uma nova linha ASCII e1+
aumenta o número, antes de subirmos^
e fazermos o loop>
novamente.(Agora esperamos uma resposta estética Piet ...)
fonte
LOLCODE
Elegante? Não. Eficiente? Definitivamente não. Lindo? Bem, você sabe o que eles dizem: a beleza está nos olhos de quem vê.
Alguma explicação:
Os programas LOLCODE começam
HAI
e terminam comKTHXBYE
.As variáveis são digitadas dinamicamente e são atribuídas usando
I HAS A <variable> ITZ <value>
. Uma vez definidas, as variáveis também podem ser atribuídas usando<variable> R <value>
.Loops em LOLCODE são nomeados. A sintaxe é:
Isso é apenas Internet falar por "loop até i = end". No LOLCODE 1.2, a variável de indexação precisa ser inicializada antes do loop. Aqui, o loop é chamado de "casa" porque faz com que a leitura da inicialização do loop pareça engraçada.
VISIBLE
imprime em stdout. Por padrão, uma nova linha é anexada, mas a adição!
suprime a nova linha.Os condicionais são especificados da seguinte forma:
As condições devem ser expressões avaliadas como valores booleanos ou booleanos. Em LOLCODE, o tipo booleano é chamado
TROOF
e possui valoresWIN
(true) eFAIL
(false).Os comentários de linha única começam com
BTW
.Não é bem versado no idioma da Internetz? Avise-me e, com prazer, fornecerei mais explicações.
fonte
Python3
fonte
Efficiency of division/modulus operations
(3, 4, 5)
. É duplicado três vezes. Essa é a única resposta principal com apenas um operador de módulo único.DRY
. Além disso, essa resposta é composta pelo OP.Piet
Decidi tentar brincar com Piet e ver como era um código bonito. Tento não repetir nada aqui, embora, para ser sincero, precise repetir os cálculos do mod. No entanto, cada mod distinto (n% 3, n% 4 e n% 5) é executado apenas uma vez por iteração de código.
A imagem menor é a fonte apropriada e pode ser carregada e executada aqui .
Apreciar!
fonte
Mathematica
No Mathematica, você pode definir e sobrecarregar funções para parâmetros muito específicos (não apenas por tipo, mas também por condições lógicas arbitrárias). Vamos definir algumas funções:
E agora o programa atual é meramente
Agora, enquanto o acima cresce apenas linearmente com o número de divisores, ainda não é muito SECO. Mas podemos realmente usar variáveis como nomes nessas definições. Então, na verdade, podemos escrever uma função que gere essas definições de função:
Agora tudo o que você precisa fazer é adicionar outra
addFunction
chamada e adicionar sua nova**zz
à linha final.fonte
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
JMP
para a esquerda!Haskell
Vocês não estão levando o DRY a sério. Existem padrões óbvios que podem ser fatorados na sequência "Fizz Jazz Buzz".
Este código também é facilmente extensível. Para resolver o problema "Fizz Jazz Buzz Tizz", basta adicionar
Ti
apósBu
a sequência. Isso é muito menor do que o necessário em qualquer uma das outras soluções.fonte
fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"]
, ou apenas reverter parafizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
.replicate 2 z
está alongando um pouco. . .Excel VBA
Pode parecer estúpido, mas é um rifle sniper 2D!
fonte
Java
Então o Java não é realmente considerado "bonito" pela maioria, mas isso é uma loucura subjetiva, então eu segui as orientações da pergunta:
Isso não quer dizer que o algoritmo como um todo seja o mais eficiente (não é), mas acho que atinge bem os pontos com marcadores.
fonte
Informar 7
O Inform 7 é uma linguagem de programação baseada em regras projetada para ficção interativa. É notável por ser uma das linguagens de programação baseadas em linguagem natural de maior sucesso. Veja a mostra do idioma do Inform 7 para outros exemplos e algumas curiosidades.
Esse código tem a vantagem de que cada uma das regras do FizzBuzz é completamente independente: regras adicionais podem ser adicionadas a qualquer momento sem a necessidade de alterar a estrutura geral. Infelizmente, é um pouco repetitivo, especialmente com as frases de definição. Eu poderia definir um operador%, mas não seria em inglês. ;)
Este código pode ser executado online usando o Playfic .
fonte
Dyalog APL
items
pode ser alterada para uma lista arbitrária de númerosfonte
⎕ML
e⎕IO
?1
são o padrão.C #
Verifique mod, construa a string, imprima o número se estiver em branco ou se não estiver. Sem repetições. Só é necessário adicionar condição e saída para novos requisitos.
fonte
i
-%
-algumas vezes, além de acrescentars
várias vezes. (Lotes da sintaxe é repetitivo também, mas isso é provavelmente C # 's culpa.)Python 2.7
Eu tentei torná-lo poético ...
Eu não sou muito bom em poesia de amor ...
Também seria muito melhor sem as constantes iniciais: P
fonte
TypeError: 'str' object is not callable
.Java com classes
O algoritmo:
As classes:
fonte
MATLAB / Octave
É claro que escrever seus próprios loops é divertido para os programadores, mas todo mundo sabe como é realmente tedioso acompanhar a indexação (quem não escreveu
for(j=i;j<n;i++)
em um loop aninhado pelo menos uma vez na vida?)O MATLAB tem a solução. Realmente, esse código não é o mais eficiente, e certamente não é um código de golfe, mas é, de todo modo, uma boa demonstração das funções mais interessantes do MATLAB. Octave é a versão GNU do MATLAB; no entanto, não é adequado para o código-golfe, pois é um pouco mais rigoroso com os tipos de variáveis, o que é prejudicial para o código-golfe.
EDIT: até que exista a sintaxe do MATLAB no SE, estou publicando uma versão com muito poucos comentários, porque, além disso, era apenas um grande bloco assustador de texto sem formatação.
fonte
for(j=i;j<n;i++)
? A minha pergunta é: quem fez escrever este "pelo menos uma vez na vida"? Se você fez, eu tenho mau novo para você ...for
loop (por exemplo, ao aninhar loops)? Você é o cara cujo código é compilado com êxito pela primeira vez? Se você for, eu tenho notícias deus para você ...j
nome para uma variável local do loop é bom, mas oi
nome é uma prática muito ruim e essa é a fonte do seu erro. Não é puramente acidental :)Python
Claro que isso é muito longo. A solução do gnibbler é muito melhor. (embora substituir
*..., sep=''
por''.join
seria mais bonito)Mas isso é bastante eficiente em termos de operações de divisão / módulo.
fonte
sorted(lst)
, por que não apenas colocá-lo na ordem que você precisa quando o define?lst.sort()
Rubi
fonte
Haskell
Mais uma solução sem divisão ou módulo.
fjb
cria uma lista infinita de Fizzes, Jazzes, Buzzes e / ou números.take
qualquer quantia que você desejar, como visto naprint100fjb
qual imprime os 100 primeiros elementos.fonte
SQL (MySQL)
onde eu é uma tabela com uma coluna (id INT) contendo os 100 números inteiros.
Não conheço um sabor SQL que possa gerar a tabela facilmente, ou use VALUES como subconsultas, o que pode torná-la muito melhor e completa.
fonte
SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100
também funcionou. Mas se 100 for alterado para 10000, ambos serão quebrados.Rubi
fonte
Javascript
Talvez não seja a maneira mais eficiente, mas acho que é simples e bonita <3
Moar SECO e feio: C
fonte
Javascript
SECO ...;)
fonte
C # totalmente estúpido
Metade do resumo foi 'NÃO SE REPETE', então eu entendi o mais literalmente possível com o C # e que acidentalmente progrediu no golfe do código. Este é o meu primeiro golfe e eu fiz em C #, estúpido eu sei, mas aqui está o resultado:
Golfe (
240232230 caracteres):Ungolfed:
O objetivo era reduzir qualquer coisa que eu tivesse que usar mais de uma vez e, em geral, para manter o código curto enquanto produzia um programa C # completo. Para isso, você precisará usar o VisualStudio e definir o objeto StartUp como 'P'. Também será necessário procurar a saída na janela de saída da depuração.
Existem algumas limitações sérias aqui:
fonte
Python 2
Eu queria escrever uma resposta para isso em algum Python organizado que mostrasse os recursos da linguagem, cumprisse o princípio DRY e fosse bastante legível.
Este pequeno exemplo mostra o fatiamento, o
in
operador e a sintaxe ternária detalhada, mas compreensível. Ele não usa o operador módulo. Ele não foi projetado para eficiência em tempo de execução, mas esse não era o objetivo. Ele foi projetado para ser curto, compreensível e sustentável.fonte
set(group[...])
nas regras?Python 2.7, 111 bytes
Esta é a minha primeira contribuição. Tentei aplicar alguns truques de codegolfing do Python (intercalação de strings, acesso ao índice de tuplas em vez de
if
). Se você tem alguma sugestão, compartilhe-a!Saída:
Também não pude aplicar completamente o princípio DRY, pois existem dois
for
loops. Provavelmente existe uma maneira mais inteligente de fazer isso!fonte
for
declaração. Será atualizado quando eu puder!Vai
O concorrente FizzJazzBuzzer
Experimente aqui: http://play.golang.org/p/lxaZF_oOax
Ele usa apenas um módulo por número verificado e pode ser arbitrariamente estendido a qualquer número de, bem ... números.
Você só precisa fazer alterações em três locais diferentes para estender isso, no
hooks
mapa, oFizzJazzBuzzer
nome da função e, é claro, a chamada para aFizzJazzBuzzer
função.fonte
R
Isso cria uma função que permite ao usuário especificar pares de palavras e divisores (e, opcionalmente, um número máximo, com 100 como padrão). A função cria um vetor de 1 ao número máximo, substitui quaisquer números nas posições "fizzbuzz" por "" e, finalmente, cola cada palavra na posição desejada. A função ordena a lista do menor para o maior número, de modo que o número mais baixo sempre seja a primeira parte do "fizzbuzz". As posições são calculadas usando
seq
para criar um vetor começando em um determinado número e aumentando em incrementos desse número até que o número máximo desejado seja alcançado.Não acho muito bonito, mas é fácil reutilizar com parâmetros diferentes.
exemplos de uso:
A saída de
fizzbuzzer(fizz=3, buzz=5)
é:(números entre colchetes são os índices do vetor que a função gera)
fonte
Haskell
Nenhuma aritmética modular é usada, exceto na computação do múltiplo menos comum para evitar a repetição de trabalho desnecessário. As concatenações de strings precisam ser feitas apenas 60 vezes, não importa o que definimos como o limite superior.
Substituir
fjbLcm
porfjb
faz exatamente a mesma coisa, sem aritmética usada, exceto em[1..100]
etake
.fonte
Python2
Atualização: A nova versão não usa nenhuma operação de modificação ou divisão.
Se você quiser adicionar outra palavra ao teste, basta jogar o par de chave / valor no dicionário word_dict:
Se você deseja se livrar de uma palavra, exclua-a (usando
del
) ou defina-a como alternativa''
.Veja também as respostas Python de Gnibbler e Jakube , que foram postadas antes das minhas.
fonte
C #
Manutenção: Basta adicionar uma linha por elemento que
eu itere sobre cada elemento do dicionário, para verificar se é um divisor do número atual e, se for o caso, adicionar a string.
Depois de concluída, imprima a sequência, a menos que ainda seja nula (usando o operador coalescente nulo); nesse caso, imprima o número mais uma sequência vazia para torná-la uma sequência. (Eu poderia usar o toString, mas acho que é uma escolha pessoal)
fonte