Abstraktes Syntax Tree Golfing: FizzBuzz, Python

12

Zusammenfassung

Implementieren Sie FizzBuzz in Python mit möglichst wenigen Token.

Herausforderung

Schreiben Sie ein Programm, das die Dezimalzahlen von 1 bis einschließlich 100 druckt. Aber für Vielfache von drei drucken Sie "Fizz" anstelle der Zahl und für Vielfache von fünf "Buzz". Für Zahlen, die ein Vielfaches von drei und fünf sind, drucken Sie „FizzBuzz“. Programme müssen in einer Version von Python geschrieben sein.

Weitere Informationen finden Sie unter 1, 2, Fizz, 4, Buzz

Wertung

Ihre Punktzahl entspricht der Anzahl der Knoten im abstrakten Syntaxbaum Ihres Codes, wie von diesem Programm für Python 3 oder diesem Programm für Python 2 angegeben . Geben Sie zum Ausführen der Programme den Dateinamen Ihres Codes als Befehlszeilenargument für das Programm an. Zum Beispiel:

python simple_counter.py fizzbuzz.py

Diese Programme basieren auf dem Ast-Modul von Python . Wenn Sie irgendwelche Schwierigkeiten haben, lassen Sie es mich wissen.

Um triviale Lösungen wie das Ausführen einer langen Zeichenfolge mit dem eigentlichen Programm oder das Hardcodieren der Ausgabe zu verhindern, gibt es einige zusätzliche Einschränkungen:

  • Kein Token in Ihrem Code darf länger als 15 Zeichen sein. Die oben genannten Programme überprüfen diese Anforderung für Sie. Beachten Sie, dass die oben genannten Programme zur Vereinfachung der Implementierung Kommentare als Token zählen.

  • Die Ausführung / Auswertung von Code ist verboten.

Wenn Sie Fragen haben, ob etwas erlaubt ist, fragen Sie mich.

Bewertungsheuristiken

Die folgenden Regeln reichen normalerweise aus, um die Punktzahl Ihres Programms zu berechnen:

  • Block Aussagen sind 1 Punkte: if, for ... in ..., while, else, usw.

  • Eigenständige Aussagen sind 1 Punkt: printin Python 2 break, passusw.

  • Variablen sind 2 Punkte

  • Single-Token - Literale ist 1 Punkt: 2131, "Hello, world!",True

  • Funktionen sind 3 Punkte (2 für die Verwendung einer Variablen, 1 extra): printin Python 3 rangeusw.

  • Die Betreiber sind 2 Punkte: +, *, %, and, not, usw.

  • = ist 1 Punkt

  • Augmented - Zuweisung ist 2 Punkte: +=, |=usw.

  • Klammern, Einrückungen usw. sind 0 Punkte.

  • Eine Linie, die einen Ausdruck enthält, im Gegensatz zu einer Zuweisung oder einem Ausdruck, ist + 1 Punkt.

  • Code überhaupt zu haben ist 1 Punkt.

Herausforderung:

Die niedrigste Punktzahl gewinnt. Viel Glück!

isaacg
quelle
1
Ich mag diesen Stil. Sie müssen sich für einfache Programme entscheiden und nicht nur für kurze.
Esolanging Fruit
1
Brauchen wir dafür wirklich Code-Challenge Ast-Golf ? Ist das nicht nur eine bestimmte Form von Atomic-Code-Golf ?
Martin Ender
@MartinEnder Der Grund, warum ich es so gemacht habe, ist, dass der Tag-Text für Atomic-Code-Golf lautet "Atomic-Code-Golf wird durch die Anzahl der Token Ihres Programms bewertet", und das ist nicht dasselbe, obwohl es vielleicht nur ein hübsches ist geringe Menge.
isaacg

Antworten:

6

33

Python 2

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

46

for x in range(100):print('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or str(x+1))
Oliver Ni
quelle
Kann x + 1 in Python 3 nicht nicht stringifiziert werden?
Zerstörbare Zitrone
1
@DestructibleWatermelon Python 3 hat, reprsoweit ich mich erinnere, keine Backticks .
Kade
2
Print kann eine ganze Zahl als Argument nehmen, war mein Punkt
Destructible Lemon
2

39 34

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

Python 2, 36

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

Ich denke, dies ist der kürzeste Ansatz, bei dem keine großen Zahlen / Zeichenfolgen verwendet werden.

isaacg
quelle