Érase una vez, estaba leyendo esta pregunta / respuesta en Quora
¿Hay realmente programadores con títulos en informática que no puedan aprobar el examen FizzBuzz?
Este código se da como la respuesta obvia
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
Por supuesto, FizzBuzz ha sido golpeado hasta la muerte, pero de eso no se trata esta pregunta. Verán, en los comentarios, alguien menciona que esta respuesta obvia es excelente, ya que es fácil agregar condiciones adicionales, como imprimir "Jazz" para múltiplos de 4. (No estoy de acuerdo. Ampliar este esquema requiere O (2 ** n ) líneas de código.)
Su desafío es escribir la versión más bella de FizzJazzBuzz según lo juzguen sus compañeros.
Algunas cosas que los votantes deben considerar:
- SECO
- Eficiencia de las operaciones de división / módulo
Muchas de las respuestas en Quora estaban usando Python, pero no existe tal restricción de idioma aquí.
Aceptaré la respuesta con más votos dentro de un mes
Salida de muestra:
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
fuente
Respuestas:
¿La versión más bonita, dices? Entonces, probemos este en ...
Lenguaje de programación de Shakespeare
Entonces, después de mi lucha con SPL aquí , sentí que tenía que hacer al menos una presentación con él en cualquier desafío. Y ya está.
Entonces, ¿qué es todo esto entonces?
Entonces, primero, declaramos las variables que vamos a usar en todo el programa, que deben provenir de las obras de Shakespeare. Harto de Romeo, Julieta, Ofelia y Otelo, fui con el arzobispo de Canterbury y Lady Capulet . El analizador no tiene en cuenta sus descripciones, así como los títulos de los Actos / Escenas, por lo que puede poner casi todo lo que quiera.
Entonces, hagamos un poco de traducción a algo un poco menos galimatías .
Acto I, Escena I
Begin Lady Capulet = 0;
El acto I es bastante sencillo: inicializamos nuestra variable con 0.
Acto I, Escena II
Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;
Incrementamos el valor de Lady Capulet y lo comparamos con 100 (sí, esa oración completa sirve únicamente para obtener el número 100); si no es más pequeño, saltamos a la escena VIII (el final); de lo contrario, continuamos a la siguiente escena.
Acto I, escena 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);
Primero, vemos si el módulo de la división por 3 es 0; si no es así, saltamos a la escena IV; si es así, comenzamos a realizar operaciones aritméticas y a almacenarlas en el Archieperson, emitiéndolas en forma de caracteres una vez que encontremos la que estamos buscando. Sí, al final, la idea es llegar
Fizz
.Acto I, escena 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);
Primero verifica si el módulo de la división por 4 es 0, luego continúa como la misma escena que antes, para
Jazz
.Acto I, escena 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 las dos anteriores, verificando si el módulo de la división por 5 devuelve 0, luego intenta escribir
Buzz
; la única diferencia es que, al final, nos saltamos una escena.Acto I, escena VI
System.out.print(Lady Capulet);
Para llegar a esta escena, el número asumido por Lady Capulet no debe haber sido ni Fizz ni Jazz ni Buzz; entonces, lo sacamos en forma numérica.
Acto I, escena 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;
Entonces, esta es la única forma en que encontré para saltar a la siguiente línea: salida, primero, un CR, luego un LF; luego, volvemos a la escena II, a la que podemos continuar con el programa.
Acto I, escena VIII
End.
Lo suficientemente directo.
Todavía estoy tratando de ver si puedo mostrar esto ejecutándose en línea, pero no puedo encontrar un compilador en línea: el que conozco no parece combinar bien con ningún programa, excepto el que ya está cargado, o tal vez hay algún tipo de problema con la interfaz entre el teclado y la silla ...
Actualización 1:
Después del comentario de Mathmandan, edité el orden de las escenas de Jazz y Buzz. Que se tenía que hacer.
fuente
z
y reiniciarlo antes de cada ciclo.> <> (Pescado)
> <> es un lenguaje de programación 2D en el que las instrucciones son caracteres únicos y el puntero de instrucciones (IP) puede moverse hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha, según las flechas
^>v<
y los espejos/\
. No tiene variables o cadenas, por lo que no repetirse es un poco más difícil, pero creo que esto es bueno a su manera.Empujamos
1
y comenzamos el ciclo.:9b*)?;
comprueba si el número es mayor que 99 (9b* = 9*11
), y si es así, el programa se detiene;
. De lo contrario, ponga un 0 en el registro y bajev
a la parte ondulada.:3%?
comprueba el número del módulo 3. Si no es cero, entonces bajamosv
una fila y nos movemos a la izquierda<
. De lo contrario, omitimos la flecha hacia abajo y presionamos"Fizz"
, imprimimos (r}oooo
) e incrementamos el registro (&1+&
) antes de rebotar en los espejos de pared derechos para bajar una fila. De cualquier manera, terminamos moviéndonos hacia la izquierda a lo largo de la tercera fila, hasta que rebotamos en los espejos de la pared izquierda. Luego repetimos paraJazz
yBuzz
.Esto continúa hasta la 7ma línea, que verifica el
&
valor del registro . Si no es cero, entonces bajamos. De lo contrario, imprimimos el número mismon
antes de bajar.Finalmente,
ao
(recuerde, ¡nos estamos moviendo hacia la izquierda ahora!) Imprime una nueva línea ASCII e1+
incrementa el número, antes de subir^
y hacer el ciclo>
nuevamente.(Ahora esperamos una respuesta estética de Piet ...)
fuente
LOLCODE
¿Elegante? No ¿Eficiente? Definitivamente no. ¿Hermosa? Bueno, ya sabes lo que dicen: la belleza está en el ojo del espectador.
Alguna explicación:
Los programas LOLCODE comienzan
HAI
y terminan conKTHXBYE
.Las variables se escriben dinámicamente y se asignan usando
I HAS A <variable> ITZ <value>
. Una vez definidas, las variables también se pueden asignar usando<variable> R <value>
.Se nombran bucles en LOLCODE. La sintaxis es:
Esto es solo hablar en Internet para "loop hasta i = end". En LOLCODE 1.2, la variable de indexación debe inicializarse antes del ciclo. Aquí el bucle se llama "casa" porque hace que la lectura de la inicialización del bucle suene humorística.
VISIBLE
imprime en stdout. De manera predeterminada, se agrega una nueva línea, pero la adición!
suprime la nueva línea.Los condicionales se especifican de la siguiente manera:
Las condiciones deben ser expresiones que evalúen valores booleanos o booleanos. En LOLCODE, se llama al tipo booleano
TROOF
y tiene valoresWIN
(verdadero) yFAIL
(falso).Los comentarios de una sola línea comienzan con
BTW
.¿No está bien versado en el lenguaje de Internetz? Solo avíseme y con gusto le daré más explicaciones.
fuente
Python3
fuente
Efficiency of division/modulus operations
(3, 4, 5)
. Se duplica tres veces. Esta es la única respuesta superior con un solo operador de módulo.DRY
lugar. Además, esta respuesta está compuesta por el OP.Piet
Decidí intentar jugar con Piet y ver qué bonito código podía hacer. Intento no repetir nada aquí, aunque para ser honesto, tengo que repetir los cálculos de mod. Sin embargo, cada mod distinto (n% 3, n% 4 y n% 5) solo se ejecuta una vez por iteración de código.
La imagen más pequeña es la fuente adecuada, y se puede cargar y ejecutar aquí .
¡Disfrutar!
fuente
Mathematica
En Mathematica puede definir y sobrecargar funciones para parámetros muy específicos (no solo por tipo, sino también por condiciones lógicas arbitrarias). Definamos algunas funciones:
Y ahora el programa real es simplemente
Ahora, mientras que lo anterior solo crece linealmente con el número de divisores, todavía no es muy SECO. Pero en realidad podemos usar variables como nombres en estas definiciones. Entonces podemos escribir una función que genere estas definiciones de función:
Ahora todo lo que tiene que hacer es agregar otra
addFunction
llamada y agregar la nueva**zz
a la línea final.fuente
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
JMP
a la izquierda!Haskell
Ustedes no se están tomando el SECO en serio. Hay patrones obvios que se pueden factorizar en la secuencia "Fizz Jazz Buzz".
Este código también es fácilmente extensible. Para resolver el problema "Fizz Jazz Buzz Tizz", todo lo que necesita hacer es agregar
Ti
despuésBu
de la cadena. Esto es mucho menos de lo que se necesita en cualquiera de las otras soluciones.fuente
fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"]
o simplemente volver a hacerlofizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
.replicate 2 z
Lo está estirando un poco. . .Excel VBA
Puede sonar estúpido, ¡pero es un rifle de francotirador 2D!
fuente
Java
Así que Java no es realmente considerado "hermoso" por la mayoría, pero eso es una locura subjetiva, así que seguí las pautas de la pregunta:
Eso no quiere decir que el algoritmo en su conjunto sea el más eficiente (no lo es), pero creo que alcanza bien los puntos con viñetas.
fuente
Informar 7
Inform 7 es un lenguaje de programación basado en reglas diseñado para ficción interactiva. Es notable por ser uno de los lenguajes de programación basados en lenguaje natural más exitosos. Consulte el escaparate de idiomas de Inform 7 para ver otros ejemplos y algunas curiosidades.
Este código tiene la ventaja de que cada una de las reglas de FizzBuzz es completamente independiente: se pueden agregar reglas adicionales en cualquier momento sin necesidad de cambiar el marco general. Lamentablemente es un poco repetitivo, especialmente con las frases de definición. Podría definir un operador%, pero no sería inglés. ;)
Este código se puede ejecutar en línea usando Playfic .
fuente
Dyalog APL
items
se puede cambiar a una lista arbitraria de númerosfuente
⎕ML
y⎕IO
?1
, que es el valor predeterminado.DO#
Verifique mod, cadena de compilación, imprima el número si está en blanco o la cadena si no No se repite. Solo necesita agregar condición y salida para nuevos requisitos.
fuente
i
-%
algo muchas veces, además de agregars
muchas veces. (Gran parte de la sintaxis también es repetitiva, pero probablemente sea culpa de C #).Python 2.7
Traté de hacerlo poético ...
No soy muy bueno en la poesía amorosa ...
También sería mucho mejor sin las constantes iniciales: P
fuente
TypeError: 'str' object is not callable
.Java con clases
El algoritmo:
Las clases:
fuente
MATLAB / Octave
Por supuesto, escribir sus propios bucles es divertido para los programadores, pero todos saben cuán tedioso es realmente hacer un seguimiento de la indexación (quién no ha escrito
for(j=i;j<n;i++)
en un bucle anidado al menos una vez en sus vidas?)MATLAB tiene la solución. Realmente, este código no es el más eficiente, y ciertamente no tiene código de golf, pero es un buen escaparate de las funciones más interesantes de MATLAB. Octave es la versión GNU de MATLAB; Sin embargo, no es adecuado para el golf de código, ya que es un poco más estricto con los tipos variables, lo que es perjudicial para el golf de código.
EDITAR: hasta que el resaltado de sintaxis para MATLAB exista en SE, estoy publicando una versión con muy pocos comentarios, porque de lo contrario era solo un gran bloque de texto sin formato.
fuente
for(j=i;j<n;i++)
? Mi pregunta es: ¿quién hizo escribir esta "al menos una vez en su vida"? Si lo hiciste, tengo una mala noticia para ti ...for
bucle (por ejemplo, al anidar bucles)? ¿Eres el tipo cuyo código se compila con éxito cada primera vez? Si es así, tengoj
nombre de una variable local de bucle está bien, pero eli
nombre es una práctica muy mala y esa es la fuente de su error. No es puramente accidental :)Pitón
Por supuesto, esto es demasiado largo. La solución de gnibbler es mucho mejor. (aunque la sustitución
*..., sep=''
con''.join
sería más bella)Pero esto es bastante eficiente en términos de operaciones de división / módulo.
fuente
sorted(lst)
, por qué no solo lo pones en el orden que necesitas cuando lo defines?lst.sort()
Rubí
fuente
Haskell
Otra solución más sin división ni módulo.
fjb
crea una lista infinita de Fizzes, Jazzes, Buzzes y / o números.take
cualquier cantidad que desee, como se ve en laprint100fjb
que imprime los primeros 100 elementos.fuente
SQL (MySQL)
donde I es una tabla con una columna (id INT) que contiene los 100 enteros.
No conozco un sabor SQL que pueda generar la tabla fácilmente, o puedo usar VALUES como subconsultas, lo que puede hacer que sea mucho mejor y completa.
fuente
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
también funcionó. Pero si 100 se cambia a 10000, ambos se romperán.Rubí
fuente
JavaScript
Quizás no sea la forma más eficiente, pero creo que es simple y bonita <3
Moar SECO y efin feo: C
fuente
JavaScript
SECO ...;)
fuente
Totalmente estúpido C #
La mitad del resumen era 'NO SE REPITA', así que lo tomé tan literalmente como pude con C # y eso accidentalmente progresó en el golf. Este es mi primer golf y lo hice en C #, estúpido, lo sé, pero aquí está el resultado:
Golfizado (
240232230 caracteres):Sin golf:
El objetivo era acortar cualquier cosa que tuviera que usar más de una vez y, en general, para mantener el código corto mientras producía un programa C # completo. Para esto, necesitará usar VisualStudio y establecer el objeto StartUp en 'P', también deberá buscar la salida en la ventana de salida de depuración.
Aquí hay algunas limitaciones serias:
fuente
Python 2
Quería escribir una respuesta para esto en algún Python ordenado que mostrara las características del lenguaje, cumpla con el principio DRY y sea bastante legible.
Este pequeño ejemplo muestra el corte, el
in
operador y la sintaxis ternaria detallada pero comprensible. No utiliza el operador de módulo en absoluto. No está diseñado para la eficiencia en tiempo de ejecución, pero ese no era el objetivo. Está diseñado para ser corto, comprensible y fácil de mantener.fuente
set(group[...])
en las reglas?Python 2.7, 111 bytes
Esta es mi primera contribución. Traté de aplicar algunos trucos de codegolfing de Python (entrelazado de cadenas, acceso al índice de tuplas en lugar de
if
). Si tiene alguna sugerencia, ¡compártala!Salida:
Tampoco pude aplicar completamente el principio DRY, ya que hay dos
for
bucles. ¡Probablemente haya una forma más inteligente de hacerlo!fuente
for
declaración. Se actualizará cuando pueda!Ir
El concurrente FizzJazzBuzzer
Pruébelo aquí: http://play.golang.org/p/lxaZF_oOax
Solo usa un módulo por número marcado y puede ampliarse arbitrariamente a cualquier número de, bueno ... números.
Solo tiene que hacer cambios en 3 lugares diferentes para extender esto, en el
hooks
mapa, elFizzJazzBuzzer
nombre de la función y, por supuesto, la llamada a laFizzJazzBuzzer
función.fuente
R
Esto crea una función que permite al usuario especificar pares de palabras y divisores (y, opcionalmente, un número máximo, con 100 como valor predeterminado). La función crea un vector del 1 al número máximo, luego reemplaza cualquier número en las posiciones "fizzbuzz" con "", y finalmente pega cada palabra en la posición deseada. La función ordena la lista del número más bajo al más alto para que el número más bajo siempre sea la primera parte del "fizzbuzz". Las posiciones se calculan usando
seq
para crear un vector que comienza en un número dado y aumenta en incrementos de ese número hasta alcanzar el número máximo deseado.No creo que sea muy bonito, pero es fácil de reutilizar con diferentes parámetros.
ejemplos de uso:
La salida de
fizzbuzzer(fizz=3, buzz=5)
es:(los números entre corchetes son los índices del vector que genera la función)
fuente
Haskell
No se utiliza aritmética modular, excepto en el cálculo del múltiplo menos común para evitar repetir trabajos innecesarios. Las concatenaciones de cadenas solo deben hacerse 60 veces, sin importar a qué establezcamos el límite superior.
Reemplazar
fjbLcm
confjb
hace exactamente lo mismo, sin aritmética, excepto en[1..100]
ytake
.fuente
Python2
Actualización: la nueva versión no utiliza ninguna operación de mod o división.
Si desea agregar otra palabra a la prueba, simplemente arroje el par clave / valor en el diccionario word_dict:
Si desea deshacerse de una palabra, simplemente elimínela (usando
del
) o, alternativamente, configúrela en''
.Vea también las respuestas de Python de Gnibbler y Jakube , que se publicaron antes que las mías.
fuente
DO#
Mantenibilidad: simplemente agregue una línea por elemento
que repita sobre cada elemento en el diccionario, para verificar si es un divisor del número actual, y agregue a la cadena si es así.
Una vez finalizado, imprima la cadena, a menos que siga siendo nula (utilizando el operador de fusión nula), en cuyo caso imprima el número más una cadena vacía para convertirla en una cadena. (Podría usar toString, pero supongo que es una elección personal)
fuente