Questa è una domanda di consigli per giocare a golf in Python.
Nel golf Python, è comune che una presentazione sia una funzione definita come lambda. Per esempio,
f=lambda x:0**x or x*f(x-1)
calcola il fattoriale di x.
Il formato lambda ha due grandi vantaggi :
- La piastra della caldaia
f=lambda x:...
olambda x:...
è più corta delladef f(x):...return...
ox=input()...print...
- Una chiamata ricorsiva può essere utilizzata per eseguire il loop con un sovraccarico di byte ridotto.
Tuttavia, i lambda hanno il grande svantaggio di consentire solo una singola espressione, nessuna affermazione. In particolare, ciò significa che non ci sono incarichi simili c=chr(x+65)
. Ciò è problematico quando si ha un'espressione lunga il cui valore deve essere referenziato due volte (o più).
Assegnazioni come E=enumerate
sono possibili al di fuori della funzione o come argomento facoltativo, ma solo se non dipendono dagli input della funzione. Argomenti opzionali come f=lambda n,k=min(n,0):...
fail perché l'input n
non è stato definito quando k
viene valutato al momento della definizione.
Il risultato è che a volte fai schifo ripetendo una lunga espressione in un lambda perché l'alternativa è un lungo non-lambda.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Il punto di pareggio è di circa 11 caratteri ( dettagli ), oltre il quale si passa a def
o program
. Confronta questo con il solito punto di pareggio di lunghezza 5 per un'espressione ripetuta:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Altre lingue hanno soluzioni alternative, ad esempio Octave . Esistono trucchi noti per Python, ma sono lunghi, goffi e / o di uso limitato. Un metodo breve e generico per simulare l'assegnazione in una lambda rivoluzionerebbe il golf Python.
Quali sono i modi in cui un golfista Python può superare o aggirare questa limitazione? Quali potenziali idee dovrebbero avere in mente quando vedono una lunga espressione ripetuta due volte in una lambda?
Il mio obiettivo con questa domanda è di approfondire questo problema e:
- Catalogare e analizzare le soluzioni alternative per giocare a golf per falsificare il compito all'interno di una lambda
- Esplora nuovi contatti per metodi migliori
Ogni risposta dovrebbe spiegare una soluzione alternativa o potenziale lead.
lambda s:(s+s[::-1]).lower()
. Naturalmente questo non risponde alla domanda reale.
strip
.