Cree un programa "BizzFuzz"

17

En FizzBuzz tradicional, se le pide que imprima los números del 1 al 100, pero reemplaza cada múltiplo de 3 con "Fizz", cada múltiplo de 5 con "Buzz" y cada múltiplo de 3 y 5 (es decir, 15) con " FizzBuzz ".

Sin embargo, como un mal entrevistador, inventé mi propia versión retorcida de FizzBuzz, que decidí nombrar BizzFuzz y darle en una entrevista de codificación.

Las reglas del juego son:

  • Imprima cada número del 1 al 100, excepto si el número cumple con una de las siguientes condiciones.

    • Si el número es divisible por 4, imprima "Fizz".
    • Si el número es divisible por 5, imprima "Buzz".

    • Si el número es divisible por 4, pero el número inmediatamente después de ser divisible por 5, imprima "FizzBuzz" en lugar de "Fizz" e imprima el siguiente número regularmente.

    • Si el número es divisible por 5, pero el número inmediatamente después de ser divisible por 4, imprima "BuzzFizz" en lugar de "Buzz" e imprima el siguiente número regularmente.

    • Si el número es inmediatamente anterior a un número divisible entre 4 y 5, imprima "Bizz".

    • Si el número es inmediatamente después de un número divisible entre 4 y 5, imprima "Fuzz".

    • Si el número es divisible entre 4 y 5, imprima "BizzFuzz".

El código más corto para implementar todas estas reglas en cualquier idioma gana.

Joe Z.
fuente

Respuestas:

4

GolfScript ( 83 80 caracteres)

(La sugerencia de NB Howard en los comentarios permite reducir a 78 caracteres, pero con espacios finales en algunas líneas).

Esto usa el carácter \0, así que aquí está en 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}/.

y base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Usando ^ como sustituto de\0 , es

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

Todavía no es un problema particularmente interesante.


Se solicitó una explicación:

Para valores 0a 99inclusivos:

100,{
...
}/

Incrementar el valor (queremos 1a 100) y también saber lo que el valor incrementado es mod 20:

).20%

Divide la cadena mágica alrededor de los \0personajes:

MAGIC_STRING 1,/

Tome el elemento ( x mod 20) th de esa matriz, divídalo en trozos de 2 caracteres y péguelos de nuevo zz. Nota: la cadena está vacía (en cuyo caso no hay fragmentos, por lo que terminamos con la cadena vacía) o es una secuencia de [BF][iu]prefijos seguida de una nueva línea.

=2/'zz'*

Tome la otra copia del número incrementado que guardamos en la pila y agregue una nueva línea. Ahora, cualquier cadena que mantengamos finalizará con una nueva línea.

\n+

Aplicar una operación alternativa. (Esto es similar a ||en JavaScript o COALESCEen SQL).

or
Peter Taylor
fuente
@minitech, error tipográfico introducido al no copiar y pegar porque reinventar todo es un dolor en el cuello. Fijo.
Peter Taylor
2
reindenting everything = CTRL + K
John Dvorak
¿Puede explicar esto?
Johannes Kuhn
"No es un problema muy interesante". Sí, tuve el presentimiento de que ese era el caso cuando lo publiqué. Aún así, es una variación.
Joe Z.
También se vuelve más interesante como un juego de salón con amigos, en lugar de un desafío de programación. Túrnense tratando de decir los números en orden. Básicamente es FizzBuzz Hardcore Edition si no memorizas la secuencia de antemano.
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

Solución 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
fuente
3
Un abuso realmente hermoso de eval
3

Pitón 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-
fuente
1
Puede reducir esto a 154 utilizando a) un cortocircuito lógico en la expresión para imprimir, b) invirtiendo el significado de rcalcularlo en menos caracteres, c) poniendo todo en una línea: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
Vuelva a instalar Mónica
@WolframH: ¡Gracias! Los apliqué con algunos cambios para hacer 143.
Ry-
Ok, esto me ha vencido, trabajo impresionante. ¡Me encanta print 1!=a+b!=4que sea diabólico!
1
@LegoStormtroopr: Nah. El exec/ evalcombo es diabólico;)
Ry-
Sí, será difícil de superar. Sin embargo, pude exprimir y formar algunos más al cambiar la sección de impresión aprint{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

Una implementación de referencia no protegida en Python que implementa todas las reglas 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.
fuente
3
Oye. Tienes paréntesis en mi Python.
Ry-
Creo que el IDE que estaba usando los insertó por defecto. Estaba en una máquina con Windows, y tratar de codificar usando un editor de texto en Windows es brutal.
Joe Z.
1

Pitón, 150

Esta es una derivada de la respuesta minitechs (anterior), pero he exprimido lo suficiente para hacer la mía:

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)

La versión desadaptada no es mucho más legible, pero la rque usaba el minitech solo se activa si en la próxima iteración la suma si a,bes 1,0o 0,4, lo que es equivalente a, i%4 or i%5 == 0por lo que solo aparecería en esas circunstancias. Por lo tanto, fue posible eliminar la asignación y el cálculo ry derivarlo del valor actual de iusar ay 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)

También incluye las sugerencias de @ WolframH.


fuente
Er, no es realmente diferente. De todos modos, quite los espacios alrededor [1,4](y use (1,4)o {1,4}además) y antes {.
Ry-
No es diferente, no, solo cambió lo suficiente como para pensar que valía la pena una entrada.
Está bien, pero deberías jugarlo en blanco.
Ry-
@minitech no te preocupes. Saludos por la punta en el []espacio. Me preguntaba por qué usaste {}en tu respuesta 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
fuente
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
fuente
A veces, los whilebucles se pueden reemplazar por timeconstrucciones para guardar bytes
sergiol