Abstract Syntax Tree Golfing: FizzBuzz, Python


12

Sommario

Implementa FizzBuzz in Python, con il minor numero di token possibili.

Sfida

Scrivi un programma che stampa i numeri decimali da 1 a 100 inclusi. Ma per i multipli di tre stampa "Fizz" invece del numero e per i multipli di cinque stampa "Buzz". Per i numeri multipli di tre e cinque stampare "FizzBuzz". I programmi devono essere scritti in alcune versioni di Python.

Per maggiori dettagli, vedi 1, 2, Fizz, 4, Buzz

punteggio

Il tuo punteggio sarà uguale al numero di nodi nella struttura della sintassi astratta del tuo codice, come riportato da questo programma per Python 3 o da questo programma per Python 2 . Per eseguire i programmi, fornire il nome file del codice come argomento della riga di comando al programma. Per esempio:

python simple_counter.py fizzbuzz.py

Questi programmi sono basati sul modulo ast di Python . Se hai qualche difficoltà, fammi sapere.

Per evitare soluzioni banali, come l'esecuzione di una lunga stringa con il programma reale o la codifica dell'output, ci sono alcune restrizioni aggiuntive:

  • Nessun token nel codice può contenere più di 15 caratteri. I programmi sopra verificheranno questo requisito per te. Si noti che per facilità di implementazione, i programmi sopra citano i commenti come token.

  • L'esecuzione / valutazione del codice è vietata.

Se hai domande sul fatto che sia permesso qualcosa, chiedimi.

Euristica del punteggio

Le seguenti regole sono in genere sufficienti per calcolare il punteggio del tuo programma:

  • Dichiarazioni di blocco sono 1 punti: if, for ... in ..., while, else, etc.

  • Dichiarazioni Standalone 1 punto: printin Python 2, break, pass, etc.

  • Le variabili sono 2 punti

  • Letterali single-token sono 1 punto: 2131, "Hello, world!",True

  • Le funzioni sono 3 punti (2 per l'utilizzo di una variabile, 1 extra): printin Python 3 range, ecc.

  • Gli operatori sono 2 punti: +, *, %, and, not, etc.

  • = è 1 punto

  • Assegnazione Augmented è di 2 punti: +=, |=, etc.

  • Le parentesi, il rientro, ecc. Sono 0 punti.

  • Una linea contenente un'espressione, al contrario di un compito o un'espressione, è + 1 punto.

  • Avere del codice è di 1 punto.

Sfida:

Vince il punteggio più basso. In bocca al lupo!


1
Mi piace questo stile Devi scegliere programmi semplici piuttosto che brevi.
Esolanging Fruit,

1
Per questo abbiamo davvero bisogno di code-challenge ast-golf ? Non è solo una forma specifica di golf a codice atomico ?
Martin Ender,

@MartinEnder La ragione per cui l'ho fatto in questo modo è perché il testo del tag per atomic-code-golf dice "Il golf del codice atomico è segnato dal numero di token del tuo programma", e non è lo stesso di questo, anche se forse solo un bel piccola quantità.
isaacg,

Risposte:


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))

X + 1 non può essere stringa in Python 3?
Limone distruttibile

1
@DestructibleWatermelon Python 3 non ha backtick per reprquanto ricordo.
Kade,

3
La stampa può prendere un numero intero come argomento, era il mio punto
Destructible Lemon

2

39 34

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

0

Python 2, 36

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

Penso che questo sia il più breve degli approcci che non usano grandi numeri / stringhe.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.