Это вопрос подсказки для игры в гольф на питоне .
В нескольких гольфах, которые я делал в Python, фиксированное значение присваивается одной из двух переменных, выбранных логическим значением. Выбранная переменная перезаписывается заданным значением, а другая неизменна.
17 символов:
if b:y=z
else:x=z
Назначить условное значение легко , но назначение условной переменной кажется неуклюжим. Мне интересно, есть ли более короткий путь, по которому я скучаю.
Это было бы легко, если бы x,y
вместо этого был список L
, но предположим, что контекст требует ссылки на переменные достаточно, чтобы писать L[0]
и L[1]
это непозволительно. Преобразование занимает слишком много времени:
20 символов:
L=[x,y];L[b]=z;x,y=L
Самый быстрый способ, который я знаю, это Python 2 exec
, который причудлив:
16 символов, Python 2:
exec"xy"[b]+"=z"
Выбор кортежа кажется длиннее:
18, 19, 18, 18 символов:
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
Есть ли более короткий метод или оптимизация с сохранением символов? Вы можете предположить, b
является 0
или нет 1
, а не только Falsey или Truthy, а также делать предположения о типах данных и значениях, если это помогает.
x,y=C(x,y,z,b)
(14 символов) и вставить любую из этих реализаций в телоC
.Ответы:
12 знаков / назначение + 9 знаков накладных расходов
Обратите внимание, что это работает только в глобальной области, оно не работает внутри функции.
источник
V
обновляется автоматически, без необходимости повторного вызова функции. Так что это безубыточностьexec
в двух случаях. Кроме того, всего лишьvars()["xy"[b]]=z
17 символов, что является лучшим из всех, что у нас есть для Python 3, без потока управления,if/else
который может вызвать проблемы.vars()["xy"[b]]=z
:?14 символов, Python 2
Две переменные
y
иxy
. Если b = 0, это устанавливаетxy=z
. Если b = 1, это устанавливаетy=z
. Это того стоит, еслиxy
в коде используется не более одного раза.источник
xy
хотя бы дважды, хотя, для его начального назначения, а затем прочитать его.15 символов, Python 2
Требует, чтобы переменные назывались
F
и,T
а неx
иy
, и чтоb is False
илиb is True
, а не равными числами0
или1
.Это сохраняет символ от
"xy"[b]
, взяв вместо этого первую букву строкового представленияb
, которое являетсяT
илиF
.источник
a
иr
,l
иu
илиs
иe
, с соответствующими индексами.