To jest wskazówka dotycząca gry w golfa w pythonie .
W wielu golfach, które zrobiłem w Pythonie, stała wartość jest przypisywana do jednej z dwóch zmiennych wybranych przez Boolean. Wybrana zmienna jest nadpisywana przez podaną wartość, a druga pozostaje niezmieniona.
17 znaków:
if b:y=z
else:x=z
Przypisywanie wartości warunkowej jest łatwe , ale przypisywanie do zmiennej warunkowej wydaje się niewygodne. Zastanawiam się, czy brakuje mi krótszej drogi.
Byłoby to łatwe, jeśli x,y
były, a nie lista L
, ale zakładamy, że kontekst wymaga odnosząc się do zmiennych tyle, że pisanie L[0]
i L[1]
są wygórowane. Konwersja trwa zbyt długo:
20 znaków:
L=[x,y];L[b]=z;x,y=L
Najszybszy sposób, jaki znam, to użycie Pythona 2 exec
, co jest dziwne:
16 znaków, Python 2:
exec"xy"[b]+"=z"
Wybór krotek wydaje się dłuższy:
18, 19, 18, 18 znaków:
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
Czy istnieje krótsza metoda lub optymalizacja oszczędzania znaków? Można założyć, b
jest 0
lub 1
nie tylko Falsey lub Truthy, a także założenia dotyczące typów danych i wartości, czy to pomaga.
x,y=C(x,y,z,b)
(14 znaków) i wcisnąć dowolną z tych implementacji do ciałaC
.Odpowiedzi:
12 znaków / przypisanie + 9 znaków kosztów ogólnych
Zauważ, że działa to tylko w zakresie globalnym, nie działa wewnątrz funkcji.
źródło
V
aktualizuje się automatycznie, bez potrzeby ponownego wywoływania tej funkcji. To zrywa nawet zexec
dwoma zastosowaniami. Poza tym po prostu robivars()["xy"[b]]=z
17 znaków, co jest najlepszym, jaki do tej pory mamy dla Pythona 3, bez którego sterowanieif/else
może powodować problemy.vars()["xy"[b]]=z
?14 znaków, Python 2
Dwie zmienne to
y
ixy
. Jeśli b = 0, ustawia sięxy=z
. Jeśli b = 1, to ustawiay=z
. Będzie to opłacalne, jeślixy
zostanie użyte nie więcej niż raz w innym miejscu w kodzie.źródło
xy
co najmniej dwa razy, do początkowego przypisania, a potem go przeczytać.15 znaków, Python 2
Wymaga wywołania zmiennych
F
iT
zamiastx
ay
, i żeb is False
albob is True
, zamiast być równe liczbie0
lub1
.To oszczędza znak,
"xy"[b]
biorąc zamiast tego pierwszą literę reprezentującą ciąg znakówb
, czyliT
lubF
.źródło
a
ir
,l
i /u
lubs
ie
, z odpowiednimi indeksami.