Гольф Практика: Питон [закрыто]


31

Это задача практики оптимизации гольфа в 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 : Если логическое значение btrue, удалите первый элемент 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


3
Я проголосовал за закрытие, так как этот вызов вызывает двойные ответы и по сути состоит из множества вопросов в одном, поскольку между отдельными вызовами вообще нет взаимодействия. Я думаю, что если у нас есть такие вопросы, то должен быть только один ответ - это вики сообщества.
Wrzlprmft

2
@Wrzlprmft: Почему-то это интересный вызов. Но теперь, получив 7 отличных материалов, я бы посоветовал ослабить правила и разрешить неиспорченные решения отдельных проблем, потому что в противном случае идеальные материалы могут остаться скрытыми за общими посредственными общими баллами.
Фалько

2
Я думаю, что это крутая идея, и мы должны иметь практики игры в гольф для большего количества языков.
Робби Wxyz

2
@Wrzlprmft сейчас обсуждается это на мета . Пожалуйста, выскажите свое мнение там, чтобы облегчить обсуждение, не загрязняя комментарии этого вопроса.
FireFly

3
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что множественные задачи без взаимодействия между частями запрещены. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Ответы:


21

Всего: 104 101 99 символов

Проблема 1

12 символов
while L[6:]:

Проблема 2

5 символов
x>0<y

Проблема 3

7 символов
L=L[b:]

Проблема 4

13 символов
len(set(L))<2
L[1:]==L[:-1]

Проблема 5

13 символов
L+=set(L)&{n}

Задача 6

11 символов
(x>0)-(x<0)

8 символов (Python 2)
cmp(x,0)

Задача 7

12 символов
while[.5]<L:

Задача 8

9 символов
while~-n:

Задача 9

5 символов
s<'.'

Задача 10

15 символов
'LWoisne'[b::2]


@FryAmTheEggman Можете ли вы объяснить побочный эффект? Я предполагал, что это будет правильным решением.
xnor

@xnor Неважно, я был полностью неправ. Я кое-что узнал сегодня :)
FryAmTheEggman

Я считаю, что эти решения являются оптимальными, учитывая множество решений и тот факт, что я не могу найти ничего лучше. Я был бы рад видеть улучшение, хотя. Так как это были первые 99, я принимаю это.
xnor

7

Общий размер: 128 122 120 117 116 115 111 107 104

Проблема 1

Продолжайте итерацию до тех пор, пока список Lсодержит не менее 7 элементов.

15 символов
while len(L)>6:
(да, я мог бы сэкономить 3 байта на этом, но я случайно увидел ответ решения Sp3000, поэтому я не буду требовать эти три байта.)

Проблема 2

Проверьте, есть ли два поплавка xи yоба положительные.

5 символов
x>0<y

Проблема 3

Если логическое значение btrue, удалите первый элемент L. В противном случае, оставьте это без изменений.

7 символов
L=L[b:]

Проблема 4

Проверьте, все ли элементы непустого списка Lчисел равны. Для этой проблемы все в порядке, чтобы изменить список.

13 символов
L[1:]==L[:-1]

Проблема 5

Добавляйте число nв конец списка, Lтолько если оно Lуже содержится.

15 символов
L+=[n]*(n in L)
или
L+=[n][:n in L]

Задача 6

Выразите знак с плавающей точкой x: +1для положительного, 0для 0, -1для отрицательного.

8 символов, Python 2
cmp(x,0)
Согласно документации это может вернуть любое положительное / отрицательное значение, но единодушным является то, что оно всегда возвращает -1, 0, 1.

Задача 7

Продолжайте цикл до тех пор, пока первый элемент L, список Booleans, является True. И остановись, если Lпусто.

12 символов
while[1]<=L:

Задача 8

Продолжайте цикл до тех пор, пока nон больше 1. Число nгарантированно будет положительным целым числом.

9 символов
while~-n:

Задача 9

Проверьте, является ли целое число, представленное в виде строки s, отрицательным (т. Е. Начинается с '-').

5 символов
s<'.'

Задача 10

Преобразуйте логическое значение bв "Win"/ "Lose", с помощью True-> "Win"и False-> "Lose".

15 символов
"LWoisne"[b::2]


Не могли бы вы, пожалуйста, спойлер отдельные длины?
xnor

@xnor Нет проблем, готово.
Мартин Эндер

7

Всего: 106 104 102 символа

Проблема 1

12 символов
while L[6:]:

Проблема 2

5 символов
x>0<y
Huzzah для сравнения цепочек

Проблема 3

7 символов
L=L[b:]
Старое доброе неявное преобразование

Проблема 4

13
len(set(L))<2

Альтернативно:
L[1:]==L[:-1]

глупый способ получить отрицание того, что мы хотим в Python 2:
","in`set(L)`

я не уверен, какова актуальность «все в порядке, чтобы изменить список», потому что лучшее, что я могу придумать, это 14 символов (и это на самом деле не так)
L==[L.pop()]+L

Проблема 5

13 символов
L+={n}&set(L)
Делать прикольные вещи с сетами

Задача 6

11 символов
(x>0)-(x<0)

Задача 7

12 символов
while[1]<=L:
использует лексикографический порядок списков

Задача 8

9 символов
while~-n:

Задача 9

5 символов
s<"."
использует лексикографическое упорядочение строк

Задача 10

15 символов Как
"LWoisne"[b::2]

вариант:
b*"Win"or"Lose"


1
Я не рассматривал вашу альтернативу №10 раньше. Это означает, что можно получить ту же экономию символов, что и обычный трюк с чередованием, независимо от длины строк, за исключением проблем с приоритетом в bool. Я добавлю это к советам.
xnor

1
@xnor Ахаха, я подумала, что это очень мило. Это не так хорошо, когда у вас есть больше строк, что является недостатком (например b, 0, 1 или 2, и все, что вы можете сделать, это (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000


Это на самом деле неплохо для трех строк. Вы можете удалить Parens с ~b*"Hello".
кнор

@xnor В этот момент ["Good Afternoon","Goodbye","Hello"][b] победит: P
Sp3000

6

Всего: 99 байт

Проблема 1

12 байт
while L[6:]:

Проблема 2

5 байт
x>0<y

Проблема 3

7 байт
L=L[b:]

Проблема 4

13 байтов
len(set(L))<2

14 альтернатив байтов
min(L)==max(L)
set(L)=={L[0]}

Проблема 5

13 байт
L+=set(L)&{n}

Задача 6

8 байт
cmp(x,0)

Задача 7

12 байт
while[1]<=L:

Задача 8

9 байт
while~-n:

Задача 9

5 байт
s<'.'

Задача 10

15 байтов
b*"Win"or"Lose"
- или -
"LWoisne"[b::2]


4

1: 12
while L[6:]:
2: 5
y>0<x
3: 7
L=L[b:]
4: 15
L==L[:1]*len(L)
5: 15
L+=[n]*(n in L)или L+=[n][:n in L]
6: 11
Это единственное, для которого идиоматическое выражение не сразу бросилось мне в голову, но я думаю, что нашел правильный ответ. Редактировать: Нет, это было ужасно.
(x>0)-(x<0)
7: 12
while[1]<=L:
Или, если программа завершена после этого, while L[0]это хорошо.
8: 9
while~-n:
9: 5
Многие строки будут работать здесь, но «наивный метод» забавен.
s<'0'
10: 15
'LWoisne'[b::2]

Всего: 106


Разве ваш № 4 не должен использовать [L[0]]?
FireFly

@FireFly Упс. Это не так плохо, но стоит один байт.
feersum

2
Ваш # 9 - замечательная игра в гольф!
xnor

3

Общий размер: 123 121 120 116

# 1

(12) while L[6:]:

# 2

(10) min(x,y)>0

# 3

(7) L=L[b:]

# 4

(13) len(set(L))<2илиL[1:]==L[:-1]

# 5

(15) L+=[n]*(n in L)

# 6

(14) x and abs(x)/xили (вдохновленный решением Клавдия после отказа)x and(x>0)*2-1

# 7

(15) while[0]<L[:1]:

# 8

(9) while~-n:

# 9

(5) s<'.'

# 10

(15) b*"Win"or"Lose"


1

Всего: 121

Первые попытки:

Проблема 1

15 символов
while len(L)>6:

Проблема 2

5 символов
x>0<y

Проблема 3

7 символов
L=L[b:]

Проблема 4

13 символов
len(set(L))<2

Проблема 5

16 символов
if n in L:L+=[n]

Задача 6

16 символов
x and(1,-1)[x<0]

Задача 7

16 символов
while(L+[0])[0]:

Задача 8

10 символов
while n>1:

Задача 9

8 символов
s[0]<'0'

Задача 10

15 символов
"LWoisne"[b::2]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.