Практика з гольфу: Python [закрито]


31

Це завдання практикувати оптимізацію гольфу в Python - трюки для багаторазового використання та ярлики для гоління кількох символів. Багато хто буде знайомий гольфістам в Python і використовуватимуть загальні ідеї з Поради Python . Деякі з них використовують специфічні для 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 : Якщо Boolean bвірно, видаліть перший елемент 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
Я думаю, що це крута ідея, і що ми повинні мати практики для гольфу для більшої кількості мов.
Роббі Уксіз

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 Nevermind, я абсолютно помилявся. Я щось сьогодні дізнався :)
FryAmTheEggman

Я вважаю, що ці рішення є оптимальними, враховуючи кілька 99 рішень і те, що я не можу знайти нічого кращого. Я би радий побачити покращення. Оскільки це було перші 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

Якщо Boolean bвірно, видаліть перший елемент 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списку булевих 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


Це насправді непогано для трьох струн. Ви можете видалити паролі за допомогою ~b*"Hello".
xnor

@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 Whoops. Це не так вже й погано, але коштує один байт.
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.