Syntaxe abstraite de l'arbre de golf: FizzBuzz, Python

12

Résumé

Implémentez FizzBuzz en Python, avec le moins de jetons possible.

Défi

Écrivez un programme qui imprime les nombres décimaux de 1 à 100 inclus. Mais pour les multiples de trois imprimer "Fizz" au lieu du nombre et pour les multiples de cinq imprimer "Buzz". Pour les nombres qui sont des multiples de trois et de cinq, imprimez «FizzBuzz». Les programmes doivent être écrits dans une version de Python.

Pour plus de détails, voir 1, 2, Fizz, 4, Buzz

Notation

Votre score sera égal au nombre de nœuds dans l'arborescence de syntaxe abstraite de votre code, tel que rapporté par ce programme pour Python 3 , ou ce programme pour Python 2 . Pour exécuter les programmes, fournissez le nom de fichier de votre code comme argument de ligne de commande au programme. Par exemple:

python simple_counter.py fizzbuzz.py

Ces programmes sont basés sur le module ast de Python . Si vous avez des difficultés, faites-le moi savoir.

Pour éviter des solutions triviales, telles que l'exécution d'une longue chaîne avec le programme réel ou le codage en dur de la sortie, il existe des restrictions supplémentaires:

  • Aucun jeton de votre code ne peut dépasser 15 caractères. Les programmes ci-dessus vérifieront cette exigence pour vous. Notez que pour faciliter la mise en œuvre, les programmes ci-dessus comptent les commentaires comme des jetons.

  • L'exécution / l'évaluation du code est interdite.

Si vous avez des questions quant à savoir si quelque chose est autorisé, demandez-moi.

Heuristique de notation

Les règles suivantes sont généralement suffisantes pour calculer le score de votre programme:

  • Déclarations blocs sont 1 points: if, for ... in ..., while, else, etc.

  • Déclarations autonomes sont 1 point: printen Python 2, break, pass, etc.

  • Les variables sont à 2 points

  • Littéraux jeton unique sont 1 point: 2131, "Hello, world!",True

  • Les fonctions sont de 3 points (2 pour l'utilisation d'une variable, 1 supplémentaire): printen Python 3 range, etc.

  • Les opérateurs sont 2 points: +, *, %, and, not, etc.

  • = est 1 point

  • Affectation Augmentée est de 2 points: +=, |=, etc.

  • Les parenthèses, l'indentation, etc. sont à 0 point.

  • Une ligne contenant une expression, par opposition à une affectation ou une expression, vaut +1 point.

  • Avoir du code est un point.

Défi:

Le score le plus bas l'emporte. Bonne chance!

isaacg
la source
1
J'aime ce style. Vous devez choisir des programmes simples plutôt que des programmes courts.
Esolanging Fruit
1
Avons-nous vraiment besoin d'un ast-golf de challenge de code pour cela? N'est-ce pas juste une forme spécifique de golf à code atomique ?
Martin Ender
@MartinEnder La raison pour laquelle je l'ai fait de cette façon est que le texte de la balise pour atomic-code-golf dit "Le golf par code atomique est marqué par le nombre de jetons de votre programme", et ce n'est pas la même chose, bien que peut-être seulement une jolie petite quantité.
isaacg

Réponses:

6

33

Python 2

for i in range(1,101):print[i,'Fizz','Buzz','FizzBuzz'][int(`300102100120100`[i%15])]
Jonathan Allan
la source
2

46

for x in range(100):print('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or str(x+1))
Oliver Ni
la source
X + 1 ne peut-il pas être stratifié en python 3?
Destructible Lemon
1
@DestructibleWatermelon Python 3 n'a pas de backticks pour reprautant que je me souvienne.
Kade
3
L'impression peut prendre un entier comme argument, était mon point
Destructible Lemon
2

39 34

for i in range(1,101):print [i,'Fizz','Buzz','FizzBuzz'][19142723>>2*(i%15)&3]
Barre
la source
0

Python 2, 36

for i in range(1, 101):
    print (not i % 3) * "Fizz" + (not i % 5) * "Buzz" or i

Je pense que c'est la plus courte des approches qui n'utilisent pas de grands nombres / chaînes.

isaacg
la source