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.

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

@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]

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)

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

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.


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])

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}]}

Às vezes, os whileloops podem ser substituídos por timeconstruções para salvar bytes
— sergiol
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.