Это задача практики оптимизации гольфа в Python - многоразовые трюки и ярлыки, чтобы сбрить несколько персонажей. Многие будут знакомы с игроками в Python и используют общие идеи из Python Tips . Некоторые из них используют специфичные для Python функции, о которых вы, возможно, даже не подозреваете, если не видели их, поэтому обязательно посмотрите советы, если вы застряли.
Цель: есть десять проблем, каждая из которых представляет собой фрагмент кода Python для оптимизации и описание кода. Ваша цель - переписать его, чтобы оно было короче, но все еще функционально эквивалентным.
Ваша оценка, которую вы пытаетесь минимизировать, равна общей длине вашего кода во всех фрагментах. Длина эталонных фрагментов - 150. Tiebreaker - самый ранний пост.
Размещение ответов: для каждой проблемы опубликуйте свой код и количество символов. Вы можете опубликовать справочный фрагмент, если вы не нашли что-то более короткое. Предполагается, что вы не смотрите на ответы других, когда публикуете свои. Пожалуйста, отметьте каждую отдельную проблему, включая количество символов. Вы можете оставить общий счет раскрытым. Не стесняйтесь сейчас отменить ваше решение или опубликовать новые неиспорченные решения.
Подробности о легальности: функциональная эквивалентность означает, что код может быть заменен в программе, не влияя на ее поведение (игнорируя такие вещи, как использование памяти и приоритет операторов как часть выражения). Выражения должны создавать значения, эквивалентные ==
. Обратите внимание, что 1.0==1==True
. Ваш код не должен иметь побочных эффектов, если не указано иное. Я не предполагаю, что проблемы будут зависеть от версии, но на всякий случай вы можете указать версию Python для каждой проблемы.
Проблема 1: Продолжайте итерацию, пока список L
содержит по крайней мере 7 элементов
# 16 chars
while len(L)>=7:
Проблема 2 : Проверьте, являются ли два поплавка x
и y
оба положительными.
# 11 chars
x>0 and y>0
Проблема 3 : Если логическое значение b
true, удалите первый элемент L
. В противном случае, оставьте это без изменений.
# 12 chars
if b:L=L[1:]
Проблема 4 : Проверьте L
, равны ли все элементы непустого списка чисел. Для этой проблемы все в порядке, чтобы изменить список.
# 22 chars
all(x==L[0]for x in L)
Проблема 5 : Добавлять номер n
в конец списка, L
только если он L
уже есть.
# 16 chars
if n in L:L+=[n]
Задача 6 : Выразить знак с плавающей точкой x
: +1
для положительного, 0
для 0, -1
для отрицательного.
# 20 chars
abs(x)/x if x else 0
Задача 7 Продолжить цикл до тех пор, пока первый элемент L
, список булевых значений, равен True
. И остановись, если L
пусто.
# 17 chars
while L and L[0]:
Проблема 8 : Продолжайте цикл до тех пор, пока n
он больше 1. Число n
гарантированно будет положительным целым числом.
# 10 chars
while n>1:
Проблема 9 : Проверьте, является ли целое число, представленное в виде строки s
, отрицательным (т. Е. Начинается с '-').
# 9 chars
s[0]=='-'
Проблема 10 : Преобразуйте логическое значение b
в "Win"
/ "Lose"
, с помощью True
-> "Win"
и False
-> "Lose"
.
# 17 chars
["Lose","Win"][b]
Внимание: спойлеры ниже, не прокручивайте вниз, если вы хотите решить их самостоятельно.
Если вы просто хотите узнать оптимальный результат для задачи:
Проблема 1:
12
Проблема 2:
5
Проблема 3:
7
Проблема 4:
13
Проблема 5:
13
Проблема 6:
8
Проблема 7:
12
Проблема 8:
9
Проблема 9:
5
Проблема 10:
15