Bienvenue dans le monde du golf de compilation. Votre tâche consiste à écrire un programme qui génère un autre programme pour lire une variante de FizzBuzz sur spec.
Votre compilateur
Écrivez un compilateur qui génère des variantes du programme FizzBuzz à spec. La spécification de cette variante est exprimée sous la forme d'un tableau de paires entiers / chaînes.
- L'entrée peut être sous n'importe quelle forme qui convient à votre langue. (Mes exemples utilisent n: xxxx, mais ce n'est qu'à des fins d'illustration.)
- Chaque entrée entière ne peut être utilisée qu'une seule fois par appel de votre compilateur.
- L'entier de chaque paire aura une valeur d'au moins un.
- La chaîne de chaque paire sera composée uniquement de quatre lettres ASCII.
- La sortie doit être un seul programme complet conforme aux règles ci-dessous.
- La sortie peut être sous n'importe quelle forme pratique, tant qu'il s'agit d'un programme textuel. (Donc pas d'expressions lambda retournées.)
Le comportement n'est pas défini pour les entrées non conformes aux règles ci-dessus.
Votre programme FizzBuzz généré
Le programme généré par votre compilateur prendra un seul entier, n , en entrée. Il produira une séquence de nombres allant de un à n inclus , en remplaçant les nombres par des chaînes FizzBuzz si nécessaire.
- Le programme généré doit être dans la même langue que le compilateur.
- L'entrée n peut être sous n'importe quelle forme adaptée à votre langue.
- n aura une valeur d'au moins un.
- Un nombre qui est un multiple d'au moins l'un des entiers entrés dans le compilateur doit être remplacé par toutes les chaînes associées à ces entiers réunis.
- Un nombre qui ne doit pas être remplacé par une chaîne FizzBuzz doit être sorti en ASCII décimal.
Par exemple;
> GenFizzBuzz 3:Fizz 5:Buzz
> a.out 5
1
2
Fizz
4
Buzz
Notation
Votre entrée sera notée par la longueur des programmes générés par votre compilateur ajoutée à la longueur de votre compilateur. Exécutez votre compilateur plusieurs fois avec chacun des paramètres suivants et ajoutez les longueurs des programmes générés ainsi que la longueur du compilateur pour trouver votre score.
- Il suffit de compter. (Aucune entrée - Le programme généré comptera de 1 à n sans remplacements.)
- Just Golf. (1: Golf - Le programme généré affichera "Golf" n fois.)
- FizzBuzz classique. (3: Fizz, 5: Buzz)
(Notez que votre compilateur est requis pour générer du code pour toute entrée valide, pas seulement celles listées.)
Réponses:
Python 3 -
168162 + 230 = 392Oh, Python, tu essayes si fort, mais multiplier le
import sys;sys.argv
contenu par 4 fait vraiment mal!Programmes de sortie:
L'entrée attendue pour le programme principal est une séquence évaluable de tuples Python ou
'()'
pour aucune entrée. (Vous avez dit « pratique ».) Exemple d' entrée:'()'
,'("Golf",1),'
,'("Fizz",3),("Buzz",5)'
note citant shell et virgule de fin pour une entrée.Correction d'une erreur à 1 heure du matin en passant de dict (ordre non défini!) À tuples.
L'entrée attendue pour les autres programmes n'est que le nombre
la source
perl6
37634084 + 115 = 199MISE À JOUR: passé de perl5 à perl6 pour s'en
say
passeruse feature
.MISE À JOUR: trois cas de test au lieu de cinq
Il existe des centaines de solutions déjà utilisées pour FizzBuzz, et de nombreux concours se terminent avec le même résultat, c'est donc là que j'ai commencé. Mon compilateur produit juste une version personnalisée de cette solution. Quelques caractères supplémentaires ont été insérés pour tenir compte de la variation "juste compter".
compilateur, attend des arguments comme ceci: "Fizz 3" "Buzz 5"
programmes compilés, attendez-vous à un argument comme celui-ci: 100
programmes compilés pour les anciens cas de test:
la source
Pyth - 51 + (38 + 43 + 50) = 182 octets
Peut probablement jouer au compilateur quelques octets. Les liens sur chacun d'eux sont des liens permanents vers l'interprète en ligne.
Compilateur - 51 octets
Effectue simplement le formatage des chaînes avec un tuple d'entrée. Prend des informations comme:
Rien - 38 octets
Just Golf - 43 octets
Fizz Buzz classique - 50 octets
la source
C ++ 11 ~ 486 + (234 + 244 + 255) = 1219
Première participation ici, ce défi n'est pas parmi les plus difficiles donc j'ai pensé que je devrais l'essayer. Cependant, en utilisant C ++, et même avec des ajouts C ++ 11, c'est toujours un langage assez verbeux, mais je suis sûr qu'il y a place à amélioration.
Compilateur (486):
Il suppose des arguments sous la forme de
3Fizz 5Buzz
etc.Nombre (234):
Golf (244):
FizzBuzz (255):
Information additionnelle
Testé avec GCC 4.8.1, aucun compilateur ne triche.
Voici un petit makefile pour automatiser la génération des cas de test et les exécuter (utilisation
make run
):la source
map<int,string> f
pourrait êtremap<int,string>f
. Vous pouvez initialiserj=1
en même temps avecz
.Rubis 99 + (86 + 94 + 103) = 382
Usage:
la source
Stax , 23 + 5 + 17 + 29 = 74
Exécuter et déboguer
Réponse la plus courte à ce jourSans surprise battue par Jelly. Le modèle de chaîne fourni dans Stax est vraiment soigné et fournit des fonctions de type printf. Les programmes générés par le compilateur sont presque toujours aussi courts que les meilleurs peuvent être obtenus en jouant au code manuellement, sans utiliser d'emballage.Le compilateur lui-même fait 23 octets de long.
L'équivalent ASCII est:
Entrée fournie
[]
, génère celle-ci (5 octets)Exécuter et déboguer
Entrée fournie
[[1,"Golf"]]
, génère celle-ci (17 octets)Exécuter et déboguer
Entrée fournie
[[3,"Fizz"],[5,"Buzz"]]
, génère celle-ci (29 octets)Exécuter et déboguer
la source
Lisp commun,
636577J'ai pris mon autre réponse et l' ai enveloppée dans des quasiquotes tout en ajoutant des paramètres d'entrée. J'imprime le formulaire résultant en une seule ligne et supprime les caractères blancs inutiles. Le compilateur est un peu plus long que la version précédente, mais le score résultant est réduit.
But
Valeurs renvoyées:
Jolie
Le format d'entrée est une liste de
(number string)
couples. Par exemple:... imprime sur la sortie standard:
... ce qui, joliment imprimé, c'est:
Test de la fonction résultante:
la source
Perl 5 , 77 + 93, 170 octets
Essayez le compilateur en ligne!
Essayez simplement de compter en ligne!
Essayez juste le golf en ligne!
Essayez fizz buzz en ligne!
la source
Gelée ,
88848373 octetsRéponse la plus courte jusqu'à présent (bat la "réponse la plus courte" précédente de 1 octet)
Compilateur:
Essayez-le en ligne! (compilateur)
Essayez-le en ligne! (vérifier le bytecount)
Statistiques:
la source
C, 1080 octets au total
Compilateur [369 octets]
Fizz Buzz [241]
Golf [237]
Nombre [233 octets]
la source
dc , 434 octets
Essayez-le en ligne!
L'entrée du compilateur (168 octets) doit être placée sur la pile sous forme d'entier, de chaîne, d'entier, de chaîne, etc. (
3 [Fizz] 5 [Buzz]
). Il doit être donné dans l'ordre où l'on veut que leurs pétillements et bourdonnements soient imprimés, ce qui peut être un peu une triche (après avoir implémenté le tri à bullesdc
auparavant, je pense que cela me coûterait environ 100 octets), mais cela permet également à l'utilisateur de , disons, ont toujours «Fizz» exécuté sur 3 et «Buzz» exécuté sur 5, mais ont 15 rendement «BuzzFizz».Je suis sûr que cela peut être joué un peu plus; la macro principale du programme final (
M
) repose sur deux macros (F
etP
) qui sont plutôt inutiles étant donné aucune entrée. En ce moment, le compilateur vérifie les entrées et sorties de différentes versions (beaucoup plus petites) de ces macros s'il n'y en a pas, mais je ne suis pas sûr que la configuration entière soit optimale.Le compilateur lui-même est assez simple, il vérifie simplement s'il y a des «règles» sur la pile, et si c'est le cas, il imprime du code qui stocke la profondeur de la pile dans
z
, stocke la pile dans un tableau indexé 0a
, puis imprime le généralisé Code FizzBuzz. S'il n'y avait rien sur la pile, il imprime simplement une version modifiée du code FizzBuzz. Cas de test:Aucune entrée (46 octets):
3 [Fizz] 5 [Buzz] (117 octets):
1 [Golf] (103 octets):
Ils attendent tous la valeur n sur la pile, celle-ci est stockée
n
. Ceux qui ont des «règles» les placent dans le tableaua
, avec les chaînes aux indices impairs et les entiers à evens. La macro principaleM
, incrémente tout ce qui se trouve sur la pile, exécute une macroF
qui vérifie la valeur par rapport au tableaua
, vérifie si leF
registre est définib
sur true ou non et imprime le haut de la pile dans l'affirmative ou une nouvelle ligne dans le cas contraire, se réinitialiseb
sur falsy, puis conserve s'exécutant sin
n'a pas encore été atteint. La macro récupère simplement la chaîne (position actuelle dans le tableau moins un) et l'imprime. Il se met également à la vérité. Notre compilateur ne prend pas la peine d'imprimer sans aucune entrée, et fait essentiellementF
, compte tenu des règles, parcourt tout le tableau à la recherche de correspondances. Il incrémente de deux puisque nos entiers et chaînes sont tissés à travers le tableau, et sur une correspondance il appelle macroB
. MacroB
b
B
F
un nop.la source
vim, 122 (compilateur) + 73 (vide) + 90 (golf) + 123 (fizzbuzz) = 392 octets
Compilateur
Format d'entrée
Code généré pour le boîtier FizzBuzz
Code généré, annoté
<C-V>
est 0x16.<ESC>
est 0x1b.<C-A>
est 0x01.Exemple de session
la source
SlooSarksi .Lang, 179
la source