Esta é uma pergunta de dicas para jogar golfe em python .
Em vários campos de golfe que fiz em Python, um valor fixo é atribuído a uma das duas variáveis escolhidas por um booleano. A variável escolhida é substituída pelo valor fornecido e a outra é inalterada.
17 caracteres:
if b:y=z
else:x=z
É fácil atribuir um valor condicional , mas atribuir a uma variável condicional parece desajeitado. Eu estou querendo saber se há uma maneira mais curta que eu estou perdendo.
Isso seria fácil se x,y
fosse uma lista L
, mas suponha que o contexto exija referência suficiente às variáveis que a escrita L[0]
e L[1]
é proibitiva. A conversão leva muito tempo:
20 caracteres:
L=[x,y];L[b]=z;x,y=L
A maneira mais rápida que conheço é com um Python 2 exec
, que é bizarro:
16 caracteres, Python 2:
exec"xy"[b]+"=z"
A escolha da tupla parece ser mais longa:
18, 19, 18, 18 caracteres:
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 algum método mais curto ou otimização para salvar caracteres? Você pode assumir que b
é 0
ou 1
não apenas Falsey ou Truthy, e também fazer suposições sobre os tipos e valores de dados, se isso ajudar.
x,y=C(x,y,z,b)
(14 caracteres) e inserir qualquer uma dessas implementações no corpo doC
.Respostas:
12 caracteres / atribuição + 9 caracteres de sobrecarga
Observe que isso funciona apenas no escopo global, não funciona dentro de uma função.
fonte
V
atualize automaticamente, sem a necessidade de chamar a função novamente. Portanto, isso se quebraexec
em dois usos. Além disso, apenasvars()["xy"[b]]=z
17 caracteres são o melhor que temos até agora para o Python 3, sem o fluxo de controleif/else
que pode causar problemas.vars()["xy"[b]]=z
:?14 caracteres, Python 2
As duas variáveis são
y
exy
. Se b = 0, isso definexy=z
. Se b = 1, isso definey=z
. Isso valerá a pena se não forxy
usado mais de uma vez em outra parte do código.fonte
xy
pelo menos duas vezes, para sua atribuição inicial, e para ler depois.15 caracteres, Python 2
Requer que as variáveis sejam chamadas
F
e emT
vez dex
ey
, e queb is False
oub is True
, em vez de serem os números iguais0
ou1
.Isso evita que um caractere pegue
"xy"[b]
a primeira letra da representação de sequência deb
, que éT
ouF
.fonte
a
er
,l
eu
ous
ee
, com índices apropriados.