Resumo da Árvore de Sintaxe: FizzBuzz, Python

12

Sumário

Implemente o FizzBuzz em Python, com o menor número possível de tokens.

Desafio

Escreva um programa que imprima os números decimais de 1 a 100 inclusive. Mas, para múltiplos de três, imprima "Fizz" em vez do número e para os múltiplos de cinco, imprima "Buzz". Para números múltiplos de três e cinco, imprima “FizzBuzz”. Os programas devem ser escritos em alguma versão do Python.

Para mais detalhes, consulte 1, 2, Fizz, 4, Buzz

Pontuação

Sua pontuação será igual ao número de nós na árvore de sintaxe abstrata do seu código, conforme relatado por este programa para o Python 3 ou por este programa para o Python 2 . Para executar os programas, forneça o nome do arquivo do seu código como argumento de linha de comando para o programa. Por exemplo:

python simple_counter.py fizzbuzz.py

Esses programas são baseados no módulo ast do Python . Se você tiver alguma dificuldade, me avise.

Para evitar soluções triviais, como executar uma cadeia longa com o programa real ou codificar a saída, existem algumas restrições adicionais:

  • Nenhum token no seu código pode ter mais de 15 caracteres. Os programas acima verificarão esse requisito para você. Observe que, para facilitar a implementação, os programas acima contam comentários como tokens.

  • A execução / avaliação do código é proibida.

Se você tiver dúvidas sobre se algo é permitido, pergunte-me.

Heurísticas de pontuação

As seguintes regras geralmente são suficientes para calcular a pontuação do seu programa:

  • Instruções de bloco são 1 pontos: if, for ... in ..., while, else, etc.

  • Declarações são independentes um ponto: printem Python 2, break, pass, etc.

  • Variáveis ​​são 2 pontos

  • Literais Single-simbólicos são 1 ponto: 2131, "Hello, world!",True

  • Funções são 3 pontos (2 para usar uma variável, 1 extra): printno Python 3 range, etc.

  • Os operadores são 2 pontos: +, *, %, and, not, etc.

  • = é 1 ponto

  • Atribuição ampliada é de 2 pontos: +=, |=, etc.

  • Parênteses, recuo, etc. são 0 pontos.

  • Uma linha que contém uma expressão, em oposição a uma atribuição ou expressão, é + 1 ponto.

  • Ter código é 1 ponto.

Desafio:

A pontuação mais baixa vence. Boa sorte!

isaacg
fonte
1
Eu gosto desse estilo. Você precisa optar por programas simples, em vez de apenas curtos.
Esolanging Fruit
1
Realmente precisamos de um desafio de código ast-golf para isso? Não é apenas uma forma específica de golfe com código atômico ?
Martin Ender
@MartinEnder A razão pela qual fiz isso dessa maneira é porque o texto da tag para atomic-code-golf diz "O golf code atômico é pontuado pelo número de tokens do seu programa" e não é o mesmo, embora talvez seja apenas um Pequena quantidade.
Isaacg

Respostas:

6

33

Python 2

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

46.

for x in range(100):print('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or str(x+1))
Oliver Ni
fonte
Não é possível x + 1 não ser especificado em python 3?
Destrutível Lemon
1
@DestructibleWatermelon Python 3 não tem reticulares repraté onde eu lembro.
Kade
2
Impressão pode levar um número inteiro como argumento, foi meu ponto
Destrutível Lemon
2

39 34

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

Python 2, 36

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

Eu acho que essa é a menor das abordagens que não usam grandes números / strings.

isaacg
fonte