Il était une fois, je lisais cette question / réponse sur Quora
Ce code est donné comme la réponse évidente
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
Bien sûr, FizzBuzz a été joué au golf à mort, mais ce n'est pas de cela qu'il s'agit. Vous voyez, dans les commentaires, quelqu'un mentionne que cette réponse évidente est excellente car il est facile d'ajouter des conditions supplémentaires telles que l'impression "Jazz" pour des multiples de 4. (Je ne suis pas d'accord. L'extension de ce schéma nécessite O (2 ** n ) lignes de code.)
Votre défi est d'écrire la plus belle version de FizzJazzBuzz jugée par vos pairs.
Éléments à considérer par les électeurs:
- SEC
- Efficacité des opérations de division / module
Beaucoup de réponses sur Quora utilisaient Python, mais il n'y a aucune restriction de langue ici.
J'accepterai la réponse avec le plus de votes dans un mois
Exemple de sortie:
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
la source
Réponses:
La plus belle version, dites-vous? Ensuite, essayons celui-ci dans ...
Langage de programmation Shakespeare
Donc, après ma lutte avec SPL ici , j'ai senti que je devais faire au moins une soumission avec elle sur n'importe quel défi. Et c'est tout.
Alors, c'est quoi tout ça alors?
Donc, tout d'abord, nous déclarons les variables que nous allons utiliser tout au long du programme, qui doivent provenir des pièces de Shakespeare. Marre de Roméo, Juliette, Ophélie et Othello, je suis monté avec l'archevêque de Canterbury et Lady Capulet . Leurs descriptions, ainsi que les titres des Actes / Scènes, sont ignorés par l'analyseur, vous pouvez donc y mettre à peu près tout ce que vous aimez.
Alors, faisons un roi de la traduction pour quelque chose d'un peu moins charabia .
Acte I, scène I
Begin Lady Capulet = 0;
L'acte I est assez simple: nous initialisons notre variable avec 0.
Acte I, scène II
Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;
Nous augmentons la valeur de Lady Capulet et la comparons à 100 (oui, cette phrase entière sert uniquement à obtenir le nombre 100); si elle n'est pas plus petite, nous sautons à la scène VIII (la fin); sinon, nous passons à la scène suivante.
Acte I, scène 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);
Tout d'abord, nous voyons si le module de la division par 3 est 0; sinon, on passe à la scène IV; si tel est le cas, nous commençons à effectuer des opérations arithmétiques et à les stocker sur l'Archieperson, en les affichant sous forme de caractères une fois que nous avons trouvé celui que nous recherchons. Oui, au final, l'idée est de se faire
Fizz
.Acte I, scène 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);
Vérifie d'abord si le module de la division par 4 est 0, puis continue comme la même scène que précédemment, pour
Jazz
.Acte I, scène 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;
Fonctions comme les deux précédentes, vérifiant si le module de la division par 5 renvoie 0, puis tente d'écrire
Buzz
; la seule différence est que, finalement, nous sautons une scène.Acte I, scène VI
System.out.print(Lady Capulet);
Pour accéder à cette Scène, le nombre supposé par Lady Capulet ne doit pas être ni Fizz, ni Jazz, ni Buzz; donc, nous le sortons sous forme numérique.
Acte I, scène 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;
Donc, c'est le seul moyen que j'ai trouvé pour passer à la ligne suivante: sortie, d'abord, un CR, puis un LF; ensuite, nous revenons à la scène II, à laquelle nous pouvons continuer le programme.
Acte I, scène VIII
End.
Assez simple.
J'essaie toujours de voir si je pourrais montrer cela en ligne, mais je ne trouve pas de compilateur en ligne - celui que je connais ne semble pas bien se combiner avec n'importe quel programme sauf celui déjà chargé, ou peut-être qu'il y a une sorte de problème avec l'interface entre le clavier et la chaise ...
Mise à jour 1:
Après le commentaire de mathmandan, j'ai édité l'ordre des scènes de Jazz et Buzz. Il devait être fait.
la source
z
et le réinitialiser avant chaque boucle.> <> (Poisson)
> <> est un langage de programmation 2D où les instructions sont des caractères uniques et le pointeur d'instruction (IP) peut se déplacer vers le haut, le bas, la gauche ou la droite, selon les flèches
^>v<
et les miroirs/\
. Il n'a pas de variables ou de chaînes, donc ne pas se répéter est un peu plus difficile, mais je pense que c'est bien à sa manière.Nous poussons
1
et commençons la boucle.:9b*)?;
vérifie si le nombre est supérieur à 99 (9b* = 9*11
), et si c'est le cas, le programme s'arrête;
. Sinon, mettez un 0 dans le registre et descendezv
dans la partie ondulée.:3%?
vérifie le nombre modulo 3. S'il est différent de zéro, nous descendonsv
une rangée et nous nous déplaçons à gauche<
. Sinon, nous sautons la flèche vers le bas et poussons"Fizz"
, l'imprimons (r}oooo
) et incrémentons le registre (&1+&
) avant de rebondir sur les miroirs muraux de droite pour descendre d'une rangée. Quoi qu'il en soit, nous finissons par nous déplacer vers la gauche le long de la troisième rangée, jusqu'à ce que nous rebondissions sur les miroirs du mur gauche. Ensuite, nous répétons pourJazz
etBuzz
.Cela continue jusqu'à la 7e ligne, qui vérifie la
&
valeur du registre . Si ce n'est pas nul, alors nous descendons. Sinon, nous imprimons le numéro lui-mêmen
avant de descendre.Enfin,
ao
(rappelez-vous, nous allons maintenant vers la gauche!) Imprime une nouvelle ligne ASCII et1+
incrémente le nombre, avant de remonter^
et de refaire la boucle>
.(Maintenant, nous attendons une réponse esthétique Piet ...)
la source
LOLCODE
Élégant? Nan. Efficace? Définitivement pas. Beau? Eh bien, vous savez ce qu'ils disent: la beauté est dans l'œil du spectateur.
Quelques explications:
Les programmes LOLCODE commencent
HAI
et se terminent parKTHXBYE
.Les variables sont typées dynamiquement et attribuées à l'aide de
I HAS A <variable> ITZ <value>
. Une fois définies, les variables peuvent également être affectées à l'aide de<variable> R <value>
.Les boucles dans LOLCODE sont nommées. La syntaxe est:
Il s'agit simplement d'Internet pour "boucle jusqu'à i = fin". Dans LOLCODE 1.2, la variable d'indexation doit être initialisée avant la boucle. Ici, la boucle est nommée "maison" car elle rend la lecture de l'initialisation de la boucle amusante.
VISIBLE
imprime sur stdout. Par défaut, une nouvelle ligne est ajoutée, mais l'ajout!
supprime la nouvelle ligne.Les conditions sont spécifiées comme suit:
Les conditions doivent être des expressions évaluées en valeurs booléennes ou booléennes. Dans LOLCODE, le type booléen est appelé
TROOF
et il a des valeursWIN
(true) etFAIL
(false).Les commentaires sur une seule ligne commencent par
BTW
.Vous ne connaissez pas bien la langue d'Internetz? Faites-le moi savoir et je vous fournirai volontiers des explications supplémentaires.
la source
Python3
la source
Efficiency of division/modulus operations
(3, 4, 5)
. Il est dupliqué trois fois. Il s'agit de la seule meilleure réponse avec un seul opérateur de module.DRY
place. De plus, cette réponse est composée par le PO.Piet
J'ai décidé d'essayer de jouer avec Piet et de voir à quel point je pouvais créer un code. J'essaie de ne rien répéter ici, mais pour être honnête, je dois répéter les calculs du mod. Cependant, chaque mod distinct (n% 3, n% 4 et n% 5) n'est exécuté qu'une seule fois par itération de code.
La plus petite image est la source appropriée et peut être téléchargée et exécutée ici .
Prendre plaisir!
la source
Mathematica
Dans Mathematica, vous pouvez définir et surcharger des fonctions pour des paramètres très spécifiques (non seulement par type, mais également par des conditions logiques arbitraires). Définissons quelques fonctions:
Et maintenant, le programme réel est simplement
Maintenant, alors que ce qui précède ne croît que linéairement avec le nombre de diviseurs, ce n'est toujours pas très SEC. Mais nous pouvons réellement utiliser des variables comme noms dans ces définitions. Nous pouvons donc réellement écrire une fonction qui génère ces définitions de fonction:
Il ne vous reste plus qu'à ajouter un autre
addFunction
appel et ajoutez votre nouveau**zz
à la ligne finale.la source
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
JMP
à gauche!Haskell
Vous ne prenez pas le DRY au sérieux. Il existe des motifs évidents qui peuvent être pris en compte dans la séquence "Fizz Jazz Buzz".
Ce code est également facilement extensible. Pour résoudre le problème "Fizz Jazz Buzz Tizz", il vous suffit d'ajouter
Ti
après leBu
dans la chaîne. C'est beaucoup moins que ce qui est nécessaire dans toutes les autres solutions.la source
fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"]
, ou simplement revenir àfizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
.replicate 2 z
l'étire un peu. . .Excel VBA
Cela peut sembler stupide, mais c'est un fusil de sniper 2D!
la source
Java
Donc Java n'est pas vraiment considéré comme "beau" par la plupart, mais c'est fou subjectif alors j'ai suivi les directives de la question:
Cela ne veut pas dire que l'algorithme dans son ensemble est le plus efficace (ce n'est pas le cas), mais je pense qu'il frappe bien les points à puces.
la source
Informer 7
Inform 7 est un langage de programmation basé sur des règles conçu pour la fiction interactive. Il est remarquable pour être l'un des langages de programmation basés sur le langage naturel les plus réussis. Voir la vitrine du langage Inform 7 pour d'autres exemples et quelques informations.
Ce code a l'avantage que chacune des règles FizzBuzz est complètement indépendante: des règles supplémentaires peuvent être ajoutées à tout moment sans avoir besoin de changer le cadre général. Malheureusement, c'est un peu répétitif, surtout avec les phrases de définition. Je pourrais définir un opérateur%, mais ce ne serait pas l'anglais. ;)
Ce code peut être exécuté en ligne à l'aide de Playfic .
la source
Dyalog APL
items
peut être modifiée en une liste arbitraire de nombresla source
⎕ML
et⎕IO
?1
, ce qui est la valeur par défaut.C #
Vérifiez le mod, créez la chaîne, imprimez le numéro si vide ou la chaîne sinon. Pas de répétitions. Il suffit d'ajouter une condition et une sortie pour les nouvelles exigences.
la source
i
-%
-quelque chose plusieurs fois, ainsi que l'ajout des
nombreuses fois. (Une grande partie de la syntaxe est également répétitive, mais c'est probablement la faute de C #.)Python 2.7
J'ai essayé de le rendre poétique ...
Je ne suis pas très douée en poésie amoureuse ...
Ce serait aussi beaucoup mieux sans les constantes initiales: P
la source
TypeError: 'str' object is not callable
.Java avec classes
L'algorithme:
Les classes:
la source
MATLAB / Octave
Bien sûr, écrire vos propres boucles est amusant pour les programmeurs, mais tout le monde sait à quel point le suivi de l'indexation est vraiment fastidieux (qui n'a pas écrit
for(j=i;j<n;i++)
dans une boucle imbriquée au moins une fois dans sa vie?)MATLAB a la solution. Vraiment, ce code n'est pas le plus efficace, et certainement pas le golf de code, mais c'est certainement une bonne vitrine des fonctions les plus intéressantes de MATLAB. Octave est la version GNU de MATLAB; il n'est cependant pas adapté au code-golf car il est légèrement plus strict avec des types variables, ce qui est préjudiciable au code-golf.
EDIT: jusqu'à ce que la coloration syntaxique pour MATLAB existe sur SE, je poste une version avec très peu de commentaires, car sinon c'était juste un gros bloc effrayant de texte brut.
la source
for(j=i;j<n;i++)
? Ma question est: qui a écrit ceci "au moins une fois dans leur vie"? Si vous l'avez fait, j'ai une mauvaise nouvelle pour vous ...for
boucle (par exemple lors de l'imbrication de boucles)? Êtes-vous le gars dont le code compile avec succès chaque première fois? Si vous l'êtes, j'ai des nouvelles de Dieu pour vous ...j
nom d'une variable locale de boucle est correct, mais lei
nom est une très mauvaise pratique et c'est la source de votre erreur. Ce n'est pas purement accidentel :)Python
C'est bien sûr trop long. La solution de gnibbler est bien meilleure. (bien que remplaçant
*..., sep=''
par''.join
serait plus beau)Mais c'est assez efficace en termes d'opérations de division / module.
la source
sorted(lst)
, pourquoi ne pas simplement le mettre dans l'ordre dont vous avez besoin lorsque vous le définissez?lst.sort()
Rubis
la source
Haskell
Encore une autre solution sans division ni module.
fjb
crée une liste infinie de Fizzes, Jazzes, Buzzes et / ou nombres.take
tout montant que vous voulez, comme on le voit dansprint100fjb
qui imprime les 100 premiers éléments.la source
SQL (MySQL)
où I est une table avec une colonne (id INT) contenant les 100 entiers.
Je ne connais pas de saveur SQL qui puisse générer facilement la table I, ou peut utiliser VALUES comme sous-requêtes, ce qui peut la rendre bien meilleure et complète.
la source
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
également fonctionné. Mais si 100 est changé en 10000, les deux seront cassés.Rubis
la source
Javascript
Peut-être pas le moyen le plus efficace, mais je pense que c'est simple et joli <3
Moar SEC et effin laid: C
la source
Javascript
SEC ...;)
la source
C # absolument stupide
La moitié du mémoire était «NE PAS RÉPÉTER VOUS-MÊME», alors j'ai pris cela aussi littéralement que possible avec C # et cela a accidentellement progressé en jouant au code. C'est mon premier golf et je l'ai fait en C #, stupide je sais mais voici le résultat:
Golfé (
240232230 caractères):Non golfé:
Le but était de raccourcir tout ce que je devais utiliser plus d'une fois et en général de garder le code court tout en produisant un programme C # complet. Pour cela, vous devrez utiliser VisualStudio et définir l'objet StartUp sur «P», vous devrez également rechercher la sortie dans la fenêtre de sortie de débogage.
Il y a de sérieuses limitations ici:
la source
Python 2
Je voulais écrire une réponse à cela dans un Python bien rangé qui montrerait les caractéristiques du langage, se conformerait au principe DRY et serait assez lisible.
Ce petit exemple montre le découpage, l'
in
opérateur et la syntaxe ternaire détaillée mais compréhensible. Il n'utilise pas du tout l'opérateur modulo. Il n'est pas conçu pour une efficacité d'exécution, mais ce n'était pas le but. Il est conçu pour être court, compréhensible et maintenable.la source
set(group[...])
dans les règles?Python 2.7, 111 octets
Ceci est ma première contribution. J'ai essayé d'appliquer quelques astuces de golf Python (entrelacement de chaînes, accès à l'index de tuple au lieu de
if
). Si vous avez des suggestions, partagez-les!Sortie:
Je n'ai pas non plus pu appliquer pleinement le principe DRY, car il y a deux
for
boucles. Il y a probablement une façon plus intelligente de le faire!la source
for
déclaration. Mettra à jour quand je peux!Aller
Le FizzJazzBuzzer simultané
Essayez-le ici: http://play.golang.org/p/lxaZF_oOax
Il n'utilise qu'un seul module par nombre vérifié et peut être étendu arbitrairement à n'importe quel nombre de, eh bien ... nombres.
Il suffit de modifier 3 endroits différents pour étendre cela, dans la
hooks
carte, leFizzJazzBuzzer
nom de la fonction et, bien sûr, l'appel à laFizzJazzBuzzer
fonction.la source
R
Cela crée une fonction qui permet à un utilisateur de spécifier des paires de mots et de diviseurs (et éventuellement un nombre maximum, avec 100 par défaut). La fonction crée un vecteur de 1 au nombre maximum, puis remplace tous les nombres aux positions "fizzbuzz" par "", et colle enfin chaque mot à sa position souhaitée. La fonction ordonne la liste du plus petit au plus grand afin que le plus petit nombre soit toujours la première partie du "fizzbuzz". Les positions sont calculées en utilisant
seq
pour créer un vecteur commençant à un nombre donné et augmentant par incréments de ce nombre jusqu'à ce que le nombre maximum souhaité soit atteint.Je ne pense pas que ce soit très beau, mais il est facile de le réutiliser avec différents paramètres.
exemples d'utilisation:
La sortie de
fizzbuzzer(fizz=3, buzz=5)
est:(les nombres entre crochets sont les indices du vecteur émis par la fonction)
la source
Haskell
Aucune arithmétique modulaire n'est utilisée, sauf dans le calcul du multiple le moins commun pour éviter de répéter des travaux inutiles. Les concaténations de chaînes ne doivent être effectuées que 60 fois, quel que soit le paramètre que nous fixons à la limite supérieure.
Remplacer
fjbLcm
parfjb
fait exactement la même chose, sans arithmétique utilisée sauf dans[1..100]
ettake
.la source
Python2
Mise à jour: la nouvelle version n'utilise aucune opération de mod ou de division.
Si vous souhaitez ajouter un autre mot au test, jetez simplement la paire clé / valeur dans le dictionnaire word_dict:
Si vous voulez vous débarrasser d'un mot, supprimez-le simplement (à l'aide de
del
) ou définissez-le sur''
.Voir aussi les réponses Python de Gnibbler et Jakube , qui ont été postées avant les miennes.
la source
C #
Maintenabilité: il suffit d'ajouter une ligne par élément
que j'itère sur chaque élément du dictionnaire, pour vérifier s'il s'agit d'un diviseur du nombre actuel, et l'ajouter à la chaîne s'il l'est.
Une fois terminé, imprimez la chaîne, sauf si elle est toujours nulle (en utilisant l'opérateur de coalescence nul), auquel cas imprimez le nombre plus une chaîne vide pour en faire une chaîne. (Je pourrais utiliser toString, mais je suppose que c'est un choix personnel)
la source