C'est une question de conseils pour jouer au golf en python .
Dans plusieurs golfs que j'ai effectués en Python, une valeur fixe est affectée à l'une des deux variables choisies par un booléen. La variable choisie est remplacée par la valeur donnée, et l'autre est inchangée.
17 caractères:
if b:y=z
else:x=z
L'attribution d'une valeur conditionnelle est facile , mais l'attribution à une variable conditionnelle semble maladroite. Je me demande s'il y a un moyen plus court de me manquer.
Ce serait facile s'il x,y
s'agissait plutôt d'une liste L
, mais supposons que le contexte nécessite de se référer suffisamment aux variables pour écrire L[0]
et L[1]
est prohibitif. La conversion prend trop de temps:
20 caractères:
L=[x,y];L[b]=z;x,y=L
Le moyen le plus rapide que je connaisse est avec un Python 2 exec
, ce qui est bizarre:
16 caractères, Python 2:
exec"xy"[b]+"=z"
Le choix des tuples semble être plus long:
18, 19, 18, 18 caractères:
x,y=b*(x,z)or(z,y)
x,y=[z,x,y,z][b::2]
y,x=[y,z,x][b:b+2]
y,x,*_=[y,z,x][b:] # Python 3
Existe-t-il une méthode plus courte ou une optimisation pour économiser les caractères? Vous pouvez supposer que b
c'est 0
ou 1
pas seulement Falsey ou Truthy, et aussi faire des hypothèses sur les types de données et les valeurs si cela vous aide.
x,y=C(x,y,z,b)
(14 caractères) et pousser n'importe laquelle de ces implémentations dans le corps deC
.Réponses:
12 caractères / affectation + 9 caractères de frais généraux
Notez que cela ne fonctionne qu'à portée globale, cela ne fonctionne pas à l'intérieur d'une fonction.
la source
V
jour automatiquement, sans avoir besoin d'appeler à nouveau la fonction. Donc, cela rompt avecexec
deux utilisations. En outre, il suffit devars()["xy"[b]]=z
17 caractères, ce qui est le meilleur que nous ayons jusqu'à présent pour Python 3, sans que le flux de contrôleif/else
puisse causer des problèmes.vars()["xy"[b]]=z
:?14 caractères, Python 2
Les deux variables sont
y
etxy
. Si b = 0, cela définitxy=z
. Si b = 1, cela définity=z
. Cela en vaudra la peine s'ilxy
n'est utilisé qu'une seule fois ailleurs dans le code.la source
xy
au moins deux fois, pour son affectation initiale, et le lire ensuite.15 caractères, Python 2
Nécessite que les variables soient appelées
F
etT
plutôt quex
ety
, et queb is False
oub is True
, plutôt que d'être des nombres égaux0
ou1
.Cela enregistre un caractère
"xy"[b]
en prenant à la place la première lettre de la représentation sous forme de chaîneb
, qui estT
ouF
.la source
a
etr
,l
etu
ous
ete
, avec des indices appropriés.