Crie um programa "BizzFuzz"

17

No FizzBuzz tradicional, você é solicitado a imprimir os números de 1 a 100, mas substituindo cada múltiplo de 3 por "Fizz", cada múltiplo de 5 por "Buzz" e todos os múltiplos de 3 e 5 (ou seja, 15) por " FizzBuzz ".

No entanto, como um entrevistador malvado, inventei minha própria versão distorcida do FizzBuzz, que decidi nomear o BizzFuzz e dar a você em uma entrevista de codificação.

As regras do jogo são:

  • Imprima cada número de 1 a 100, exceto se o número atender a uma das condições abaixo.

    • Se o número é divisível por 4, imprima "Fizz".
    • Se o número for divisível por 5, imprima "Buzz".

    • Se o número é divisível por 4, mas o número imediatamente após ser divisível por 5, imprima "FizzBuzz" em vez de "Fizz" e imprima o próximo número regularmente.

    • Se o número é divisível por 5, mas o número imediatamente após ser divisível por 4, imprima "BuzzFizz" em vez de "Buzz" e imprima o próximo número regularmente.

    • Se o número estiver imediatamente antes de um número divisível por 4 e 5, imprima "Bizz".

    • Se o número for imediatamente após um número divisível por 4 e 5, imprima "Fuzz".

    • Se o número é divisível por 4 e 5, imprima "BizzFuzz".

O código mais curto para implementar todas essas regras em qualquer idioma vence.

Joe Z.
fonte

Respostas:

4

GolfScript ( 83 80 caracteres)

(A sugestão de Howard nos comentários permite reduzir para 78 caracteres, mas com espaços à direita em algumas linhas).

Isso usa o caractere \0, então aqui está no formato xxd:

0000000: 3130 302c 7b29 2e32 3025 2742 6946 750a  100,{).20%'BiFu.
0000010: 0046 750a 0000 0046 6942 750a 0000 0000  .Fu....FiBu.....
0000020: 4669 0a00 0042 750a 0000 4669 0a00 0000  Fi...Bu...Fi....
0000030: 4275 4669 0a00 0000 0042 690a 2731 2c2f  BuFi.....Bi.'1,/
0000040: 3d32 2f27 7a7a 272a 5c6e 2b6f 727d 2f0a  =2/'zz'*\n+or}/.

e base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Usando ^ como substituto \0, é

100, {). 20% 'BiFu
 ^ Fu
 ^ ^ ^ FiBu
 ^ ^ ^ ^ Fi
 ^ ^ Bu
 ^ ^ Fi
 ^ ^ ^ BuFi
 ^ ^ ^ ^ Bi
'1, / = 2 /' zz '* \ n + ou} /

Ainda não é um problema particularmente interessante.


Foi solicitada uma explicação:

Para valores 0para 99Inclusiva:

100,{
...
}/

Incrementar o valor (queremos 1a 100) e também descobrir qual é o valor incrementado é mod 20:

).20%

Divida a seqüência mágica em torno dos \0caracteres:

MAGIC_STRING 1,/

Leve o ( x mod 20) th elemento dessa matriz, divida-o em pedaços de 2 caracteres e cole-os novamente zz. Nota: a sequência está vazia (nesse caso, não há partes, então terminamos com a sequência vazia) ou é uma sequência de [BF][iu]prefixos seguida por uma nova linha.

=2/'zz'*

Pegue a outra cópia do número incrementado que mantemos na pilha e acrescente uma nova linha. Agora, a sequência que mantivermos terminará com uma nova linha.

\n+

Aplique uma operação de fallback. (Isso é semelhante ao ||JavaScript ou COALESCESQL).

or
Peter Taylor
fonte
@minitech, erro de digitação introduzido por não copiar e colar, porque reindentar tudo é uma dor no pescoço. Fixo.
Peter Taylor
2
reindenting everything = CTRL + K
John Dvorak
Você pode explicar isso?
Johannes Kuhn
"Não é um problema muito interessante." Sim, tive um palpite quando foi publicado. Ainda assim, é uma variação.
Joe Z.
Também fica mais interessante como um jogo de salão com os amigos do que como um desafio de programação. Se revezam tentando dizer os números em ordem. É basicamente o FizzBuzz Hardcore Edition, se você não memorizar a sequência antes.
Joe Z.
13

Python, 114

a='Fizz'
b='Buzz'
c='Bizz'
d='Fuzz'
e=c+d
f=a+b
g=b+a
i=1
exec"print eval('ediifiiiaibiaiigiiic'[i%20]);i+=1;"*100

Solução original ( 131 ):

f='Fizz'
for i in range(1,101):x=i%20;print('Bizz'*(x%19<1)+'Fuzz'*(x<2)or(i%4<1)*f+'Buzz'*(i%5<1or x==4)+f*(x==15)or i,i)[x%11==5]
grc
fonte
3
Um abuso verdadeiramente bonito de eval
3

Python 2, 131

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):print{5:Z,19:I,i%4:B,i%5*4:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(i%4+i%5*4,i)
Ry-
fonte
11
Você pode golfe este para baixo a 154 usando a) lógica curto-circuito na expressão para imprimir, b) invertendo o sentido de rcalculá-lo em menos caracteres, c) colocar tudo em uma linha:r,F,B,Z,I=1,'Fizz','Buzz','Fuzz','Bizz'\nfor i in range(1,101):a,b=i%4,i%5*4;print~-r and i or{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i);r=3!=a+b!=16
Reintegrar Monica
@WolframH: Obrigado! Eu apliquei aqueles com algumas alterações para tornar 143.
Ry-
Ok, isso me fez bater, um trabalho impressionante. Eu amo print 1!=a+b!=4isso é diabólico!
11
@LegoStormtroopr: Nah. O exec/ evalcombo é diabólico;)
Ry-
Sim, vai ser difícil de vencer. Eu era capaz de apertar e extra alguns formulários seu entanto, alterando a secção de impressão paraprint{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(a+b,i)
1

Uma implementação de referência ungolfed em Python que implementa todas as regras literalmente (420 caracteres):

n = 1
while(n <= 100):
    if(n % 20 == 0):
        print "BizzFuzz"
    elif((n - 1) % 20 == 0):
        print "Fuzz"
    elif((n + 1) % 20 == 0):
        print "Bizz"
    elif(n % 5 == 0 and (n + 1) % 4 == 0):
        print "BuzzFizz"
        print n + 1
        n += 1
    elif(n % 4 == 0 and (n + 1) % 5 == 0):
        print "FizzBuzz"
        print n + 1
        n += 1
    elif(n % 4 == 0):
        print "Fizz"
    elif(n % 5 == 0):
        print "Buzz"
    else:
        print n
    n += 1
Joe Z.
fonte
3
Ei. Você tem parênteses no meu Python.
Ry-
Eu acho que o IDE que eu estava usando os inseriu por padrão. Eu estava em uma máquina Windows, e tentar codificar usando um editor de texto no Windows é brutal.
Joe Z.
1

Python, 150

Isso é derivado da resposta minitechs (anterior), mas eu o extraí o suficiente para criar a minha:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):a,b=i%4,i%5*4;print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

A versão degolfada não é muito mais legível, mas a rminitech que estava usando é acionada apenas se, na próxima iteração, a soma se a,bfosse 1,0ou 0,4, ou seja , o que é equivalente a i%4 or i%5 == 0isso, apenas apareceria nessas circunstâncias. Portanto, foi possível remover a atribuição e o cálculo de re derivá-lo do valor atual de iusar ae b:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):
 a,b=i%4,i%5*4;
 print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

Também inclui as sugestões de @ WolframH.


fonte
Er, não é realmente diferente. De qualquer forma, retire os espaços ao redor [1,4](e use (1,4)ou {1,4}além) e antes {.
Ry-
Não é diferente, não, apenas mudei o suficiente para que eu pensasse que valia a pena uma entrada.
Ok, mas você deve jogar no branco.
Ry-
@minitech não se preocupe. Felicidades pela dica sobre o []espaçamento. Fiquei me perguntando por que você usou {}sua resposta original.
1

R: 170 caracteres

a=b=1:100
o=!a%%4
i=!a%%5
w=o&i
a[o]="Fizz"
a[i]="Buzz"
a[c(i,F)&c(F,o)]="FizzBuzz"
a[c(F,i)&c(o,F)]="BuzzFizz"
a[w[-1]]="Bizz"
a[c(F,w)]="Fuzz"
a[w]="BizzFuzz"
cat(a[b])
plannapus
fonte
0

Tcl, 185 caracteres

while {[incr i]<101} {puts [expr {$i%4?$i%5?($i-1)%4|($i-1)%5?($i+1)%4|($i+1)%5?$i:"Fuzz":"Bizz":($i-1)%4?($i+1)%4?"Buzz":"BuzzFizz":$i:($i-1)%5?($i+1)%5?$i%5?"Fizz":"FizzBuzz":$i:$i}]}
Johannes Kuhn
fonte
Às vezes, os whileloops podem ser substituídos por timeconstruções para salvar bytes
sergiol