抽象语法树高尔夫:FizzBu​​zz,Python


12

摘要

用最少的令牌在Python中实现FizzBu​​zz。

挑战

编写一个打印十进制数字(从1到100)的程序。但是,对于三倍打印“ Fizz”而不是数字,对于五倍打印“ Buzz”。对于三和五的倍数的数字,请打印“ FizzBu​​zz”。程序必须使用某些版本的Python编写。

有关更多详细信息,请参见1,2,Fizz,4,Buzz

计分

您的分数将等于此程序针对Python 3该程序针对Python 2报告的代码抽象语法树中的节点数。要运行程序,请提供代码的文件名作为程序的命令行参数。例如:

python simple_counter.py fizzbuzz.py

这些程序基于Python的ast模块。如果您有任何困难,请告诉我。

为避免琐碎的解决方案,例如用实际程序执行长字符串或对输出进行硬编码,还有一些其他限制:

  • 您的代码中的令牌不得超过15个字符。以上程序将为您检查此要求。注意,为了易于实施,上述程序将注释计为标记。

  • 代码执行/评估被禁止。

如果您对是否允许某些物品有疑问,请问我。

计分启发法

以下规则通常足以计算程序的分数:

  • 语句块是1分:iffor ... in ...whileelse,等。

  • 独立语句是1点:print在Python 2, breakpass等。

  • 变量是2分

  • 单令牌面值为1点:2131"Hello, world!"True

  • 函数是3点(使用变量需要2点,额外需要1点):print在Python 3中range,等等。

  • 运营商有2点:+*%andnot,等。

  • = 是1分

  • 增量赋值为二点:+=|=,等。

  • 括号,缩进等为0点。

  • 与赋值或表达式相反,包含表达式的行为+ 1点。

  • 完全有代码是1点。

挑战:

最低分获胜。祝好运!


1
我喜欢这种风格。您必须使用简单的程序,而不仅仅是简短的程序。
硕果累累

1
为此,我们真的需要代码挑战 ast-golf吗?这不就是原子代码高尔夫的一种特定形式吗?
马丁·恩德

@MartinEnder之所以这样做,是因为atomic-code-golf的标签文本显示“ Atomic code golf是由程序的令牌数来计分的”,虽然这可能只是一个漂亮的词,但与此并不相同。小数量。
isaacg

Answers:


6

33

Python 2

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

2

46

for x in range(100):print('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or str(x+1))

不能在python 3中将x + 1字符串化吗?
破坏的柠檬

1
repr据我所记得,@ DestructibleWatermelon Python 3没有反引号。
卡德

3
我的观点是,印刷品可以采用整数作为参数
Destructible Lemon

2

39 34

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

0

蟒蛇2,36

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

我认为这是不使用大量数字/字符串的方法中最短的一种。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.