Resumen Sintaxis Tree Golfing: FizzBuzz, Python

12

Resumen

Implemente FizzBuzz en Python, con la menor cantidad de tokens posibles.

Desafío

Escriba un programa que imprima los números decimales del 1 al 100 inclusive. Pero para los múltiplos de tres imprime "Fizz" en lugar del número y para los múltiplos de cinco imprime "Buzz". Para números que son múltiplos de tres y cinco, imprima "FizzBuzz". Los programas deben estar escritos en alguna versión de Python.

Para más detalles, vea 1, 2, Fizz, 4, Buzz

Puntuación

Su puntaje será igual al número de nodos en el árbol de sintaxis abstracta de su código, según lo informado por este programa para Python 3 , o este programa para Python 2 . Para ejecutar los programas, proporcione el nombre de archivo de su código como argumento de línea de comando para el programa. Por ejemplo:

python simple_counter.py fizzbuzz.py

Estos programas se basan en el módulo ast de Python . Si tiene alguna dificultad, hágamelo saber.

Para evitar soluciones triviales, como ejecutar una cadena larga con el programa real o codificar la salida, existen algunas restricciones adicionales:

  • Ningún token en su código puede tener más de 15 caracteres. Los programas anteriores verifican este requisito por usted. Tenga en cuenta que para facilitar la implementación, los programas anteriores cuentan los comentarios como tokens.

  • La ejecución / evaluación del código está prohibida.

Si tiene preguntas sobre si algo está permitido, pregúnteme.

Heurística de puntuación

Las siguientes reglas suelen ser suficientes para calcular la puntuación de su programa:

  • Instrucciones de bloque son 1 Puntos: if, for ... in ..., while, else, etc.

  • Estados independientes son 1 punto: printen Python 2, break, pass, etc.

  • Las variables son 2 puntos.

  • Literales Single-Token son 1 punto: 2131, "Hello, world!",True

  • Las funciones son 3 puntos (2 por usar una variable, 1 extra): printen Python 3 range, etc.

  • Los operadores son 2 puntos: +, *, %, and, not, etc.

  • = es 1 punto

  • Asignación aumentada es 2 puntos: +=, |=, etc.

  • Los paréntesis, sangría, etc. son 0 puntos.

  • Una línea que contiene una expresión, a diferencia de una asignación o una expresión, es + 1 punto.

  • Tener código es 1 punto.

Desafío:

El puntaje más bajo gana. ¡Buena suerte!

isaacg
fuente
1
Me gusta este estilo. Tienes que optar por programas simples en lugar de solo programas cortos.
Esolanging Fruit
1
¿Realmente necesitamos código-desafío ast-golf para esto? ¿No es esta una forma específica de código atómico-golf ?
Martin Ender
@MartinEnder La razón por la que lo hice de esta manera es porque el texto de la etiqueta para atomic-code-golf dice "Atomic code golf se puntúa por la cantidad de tokens de su programa", y eso no es lo mismo, aunque tal vez solo Pequeña cantidad.
isaacg

Respuestas:

6

33

Python 2

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

46

for x in range(100):print('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or str(x+1))
Oliver Ni
fuente
¿No puede x + 1 no ser stringified en python 3?
Destructible Lemon
1
@DestructibleWatermelon Python 3 no tiene backticks por reprlo que recuerdo.
Kade
3
La impresión puede tomar un número entero como argumento, fue mi punto
Destructible Lemon
2

39 34

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

Pitón 2, 36

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

Creo que este es el enfoque más corto que no utiliza grandes números / cadenas.

isaacg
fuente