Praktyka golfa: Python [zamknięty]

31

To wyzwanie polegające na ćwiczeniu optymalizacji golfa w Pythonie - sztuczki i skróty wielokrotnego użytku do golenia kilku postaci. Wielu zna golfistów Python i korzysta ze wspólnych pomysłów z Python Tips . Niektóre z nich używają specyficznych dla Pythona funkcji, o których istnieniu możesz nie wiedzieć, chyba że je widziałeś, więc spójrz na wskazówki, jeśli utkniesz.

Cel: Istnieje dziesięć problemów, każdy z nich to fragment referencyjny kodu Pythona, który można zoptymalizować, a także opis kodu. Twoim celem jest przepisanie go na krótszy, ale wciąż równoważny funkcjonalnie.

Twój wynik, który próbujesz zminimalizować, to całkowita długość kodu wszystkich fragmentów. Długość fragmentów referencyjnych wynosi 150. Tiebreaker jest najwcześniejszym postem.

Publikowanie odpowiedzi: Dla każdego problemu opublikuj swój kod i liczbę jego znaków. Możesz opublikować fragment referencyjny, jeśli nie znalazłeś czegoś krótszego. Celem jest, abyś nie patrzył na odpowiedzi innych, gdy publikujesz swoje. Proszę oznaczyć spoilerem każdy problem, w tym liczbę poszczególnych znaków. Możesz pozostawić całkowitą liczbę ujawnioną. Zapraszam teraz do rozpakowywania swojego rozwiązania lub publikowania nowych nieskażonych rozwiązań.

Szczegóły dotyczące legalności: równoważność funkcjonalna oznacza, że ​​kod można zastąpić w programie bez wpływu na jego zachowanie (ignorując takie rzeczy, jak użycie pamięci i pierwszeństwo operatora jako część wyrażenia). Wyrażenia powinny dawać wartości równoważne ==. Zauważ, że 1.0==1==True. Twój kod nie powinien powodować żadnych skutków ubocznych, chyba że zaznaczono inaczej. Nie zamierzam, aby problemy były specyficzne dla wersji, ale na wszelki wypadek możesz określić wersję Pythona dla każdego problemu.

Problem 1: Powtarzaj, dopóki lista Lzawiera co najmniej 7 elementów

# 16 chars
while len(L)>=7:

Problem 2 : Sprawdź, czy dwa zmiennoprzecinkowe xi yoba są dodatnie.

# 11 chars
x>0 and y>0

Problem 3 : Jeśli wartość logiczna bjest prawdą, usuń pierwszy element L. W przeciwnym razie pozostaw to bez zmian.

# 12 chars
if b:L=L[1:]

Problem 4 : Sprawdź, czy wszystkie elementy niepustej listy Lliczb są równe. W przypadku tego problemu można zmodyfikować listę.

# 22 chars
all(x==L[0]for x in L)

Problem 5 : Dołącz numer nna końcu listy Ltylko wtedy, gdy Ljuż zawiera ten numer.

# 16 chars
if n in L:L+=[n] 

Problem 6 : Wyraź znak liczby zmiennoprzecinkowej x: +1dla wartości dodatniej, 0dla wartości 0, -1dla wartości ujemnej.

# 20 chars
abs(x)/x if x else 0

Problem 7 Kontynuuj pętlę, dopóki jest pierwszy element Llisty booleanów True. Zatrzymaj także, jeśli Ljest pusty.

# 17 chars
while L and L[0]:

Problem 8 : Kontynuuj pętlę, dopóki njest ona większa niż 1. nGwarantowana liczba jest dodatnią liczbą całkowitą.

# 10 chars
while n>1:

Problem 9 : Sprawdź, czy liczba całkowita reprezentowana przez ciąg sjest ujemna (tzn. Zaczyna się od „-”).

# 9 chars
s[0]=='-'

Problem 10 : Konwertuj wartość logiczną bna "Win"/ "Lose", używając True-> "Win"i False-> "Lose".

# 17 chars
["Lose","Win"][b]

Ostrzeżenie: spoilery poniżej, nie przewijaj w dół, jeśli chcesz je rozwiązać samodzielnie.

Jeśli chcesz poznać optymalny wynik problemu:

Problem 1:

12

Problem 2:

5

Problem 3:

7

Problem 4:

13

Problem 5:

13

Problem 6:

8

Problem 7:

12

Problem 8:

9

Problem 9:

5

Problem 10:

15

xnor
źródło
3
Głosowałem za zamknięciem, ponieważ to wyzwanie wywołuje dublowanie odpowiedzi i skutecznie składa się z wielu pytań w jednym, ponieważ nie ma interakcji między poszczególnymi wyzwaniami. Myślę, że jeśli mamy takie pytania, powinna być tylko jedna odpowiedź, która jest wiki społeczności.
Wrzlprmft
2
@Wrzlprmft: Jakoś to ciekawe wyzwanie. Ale po zebraniu 7 świetnych opinii zasugerowałem teraz rozluźnienie zasad i umożliwienie nieskażonych rozwiązań pojedynczych problemów, ponieważ w przeciwnym razie doskonałe wyniki mogłyby pozostać ukryte za ogólnymi miernymi wynikami ogółem.
Falko,
2
Myślę, że to fajny pomysł i że powinniśmy ćwiczyć golfa dla większej liczby języków.
Robbie Wxyz,
2
@Wrzlprmft jest teraz dyskusja na ten temat na temat meta . Wypowiedz tam swoją opinię, aby ułatwić dyskusję bez zanieczyszczania komentarzy do tego pytania.
FireFly,
3
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ niedopuszczalne są wyzwania złożone z wielu części bez interakcji między częściami. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Odpowiedzi:

21

Łącznie: 104 101 99 znaków

Problem 1

12 znaków
while L[6:]:

Problem 2

5 znaków
x>0<y

Problem 3

7 znaków
L=L[b:]

Problem 4

13 znaków
len(set(L))<2
L[1:]==L[:-1]

Problem 5

13 znaków
L+=set(L)&{n}

Problem 6

11 znaków
(x>0)-(x<0)

8 znaków (Python 2)
cmp(x,0)

Problem 7

12 znaków
while[.5]<L:

Problem 8

9 znaków
while~-n:

Problem 9

5 znaków
s<'.'

Problem 10

15 znaków
'LWoisne'[b::2]

grc
źródło
@FryAmTheEggman Czy możesz wyjaśnić efekt uboczny? Chciałem, żeby to było prawidłowe rozwiązanie.
xnor
@xnor Nevermind, całkowicie się myliłem. Nauczyłem się dziś czegoś :)
FryAmTheEggman,
Wierzę, że te rozwiązania są optymalne, biorąc pod uwagę wiele 99 rozwiązań i fakt, że nie mogę znaleźć nic lepszego. Byłbym szczęśliwy, widząc poprawę. Ponieważ było to pierwsze 99, akceptuję to.
xnor
7

Rozmiar całkowity: 128 122 120 117 116 115 111 107 104

Problem 1

Powtarzaj tak długo, jak długo lista Lzawiera co najmniej 7 elementów.

15 znaków
while len(L)>6:
(Tak, mogłem zaoszczędzić na tym 3 bajty, ale przypadkowo zobaczyłem odpowiedź Sp3000 rozwiązania, więc nie zażądam tych trzech bajtów.)

Problem 2

Sprawdź, czy dwa pływaki xi yoba są dodatnie.

5 znaków
x>0<y

Problem 3

Jeśli Boolean bma wartość true, usuń pierwszy element z L. W przeciwnym razie pozostaw to bez zmian.

7 znaków
L=L[b:]

Problem 4

Sprawdź, czy wszystkie elementy niepustej listy Lliczb są równe. W przypadku tego problemu można zmodyfikować listę.

13 znaków
L[1:]==L[:-1]

Problem 5

Dołącz numer nna końcu listy Ltylko wtedy, gdy Ljuż zawiera ten numer.

15 znaków
L+=[n]*(n in L)
lub
L+=[n][:n in L]

Problem 6

Wyraź znak liczby zmiennoprzecinkowej x: +1dla wartości dodatniej, 0dla 0, -1dla ujemnej.

8 znaków, Python 2
cmp(x,0)
Według docs może to zwracać dowolną wartość dodatnią / ujemną, ale zgoda jest taka, że ​​zawsze zwraca -1, 0, 1.

Problem 7

Kontynuuj pętlę, dopóki jest pierwszy element Llisty booleanów True. Zatrzymaj także, jeśli Ljest pusty.

12 znaków
while[1]<=L:

Problem 8

Kontynuuj pętlę, dopóki njest ona większa niż 1. Liczba njest gwarantowana jako dodatnia liczba całkowita.

9 znaków
while~-n:

Problem 9

Sprawdź, czy liczba całkowita reprezentowana przez ciąg sjest ujemna (tzn. Zaczyna się od „-”).

5 znaków
s<'.'

Problem 10

Konwertuj wartość logiczną bna "Win"/ "Lose", używając True-> "Win"i False-> "Lose".

15 znaków
"LWoisne"[b::2]

Martin Ender
źródło
Czy mógłby Pan również zepsuć poszczególne długości?
xnor
@ xnor Nie ma problemu, gotowe.
Martin Ender,
7

Łącznie: 106 104 102 znaków

Problem 1

12 znaków
while L[6:]:

Problem 2

5 znaków
x>0<y
Huzzah do łączenia łańcuchów

Problem 3

7 znaków
L=L[b:]
Dobra stara niejawna konwersja

Problem 4

13
len(set(L))<2

Alternatywnie:
L[1:]==L[:-1]

Głupi sposób, aby uzyskać negację tego, czego chcemy w Pythonie 2:
","in`set(L)`

Nie jestem pewien, jakie znaczenie ma „modyfikowanie listy w porządku”, ponieważ najlepsze, co mogę wymyślić, to 14 znaków (i jest faktycznie źle):
L==[L.pop()]+L

Problem 5

13 znaków
L+={n}&set(L)
Robi funky z zestawami

Problem 6

11 znaków
(x>0)-(x<0)

Problem 7

12 znaków
while[1]<=L:
Wykorzystuje porządek leksykograficzny list

Problem 8

9 znaków
while~-n:

Problem 9

5 znaków
s<"."
Używa leksykograficznego uporządkowania ciągów

Problem 10

15 znaków
"LWoisne"[b::2]

Alternatywnie:
b*"Win"or"Lose"

Sp3000
źródło
1
Wcześniej nie rozważałem twojej alternatywy dla # 10. Oznacza to, że można uzyskać takie same oszczędności postaci, jak w przypadku zwykłej sztuczki przeplatania, niezależnie od długości łańcuchów, z wyjątkiem problemów z pierwszeństwem w bool. Dodam to do wskazówek.
xnor
1
@ xnor Ahaha tak, myślałem, że to całkiem miłe. Nie jest tak dobrze, gdy masz więcej ciągów, co jest wadą (np. b0, 1 lub 2, a wszystko, co możesz zrobić, to (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000,
To naprawdę nieźle jak na trzy struny. Możesz usunąć parens za pomocą ~b*"Hello".
xnor
@xnor W tym momencie ["Good Afternoon","Goodbye","Hello"][b]wygrałby: P
Sp3000,
6

Łącznie: 99 bajtów

Problem 1

12 bajtów
while L[6:]:

Problem 2

5 bajtów
x>0<y

Problem 3

7 bajtów
L=L[b:]

Problem 4

13 bajtów
len(set(L))<2

14 bajtów alternatywnych
min(L)==max(L)
set(L)=={L[0]}

Problem 5

13 bajtów
L+=set(L)&{n}

Problem 6

8 bajtów
cmp(x,0)

Problem 7

12 bajtów
while[1]<=L:

Problem 8

9 bajtów
while~-n:

Problem 9

5 bajtów
s<'.'

Problem 10

15 bajtów
b*"Win"or"Lose"
- lub -
"LWoisne"[b::2]

primo
źródło
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)lub L+=[n][:n in L]
6: 11
To jest jedyne, na które idiomatyczne wyrażenie nie od razu wpadło mi do głowy, ale myślę, że znalazłem właściwą odpowiedź. Edycja: Nie, to było okropne.
(x>0)-(x<0)
7: 12
while[1]<=L:
Albo jeśli program zostanie ukończony później, while L[0]to fajnie.
8: 9
while~-n:
9: 5
Działałoby tu wiele strun, ale „naiwna metoda” jest zabawna.
s<'0'
10: 15
'LWoisne'[b::2]

Razem: 106

feersum
źródło
Czy twój numer 4 nie musiałby używać [L[0]]?
FireFly,
@FireFly Whoops. Nie jest tak źle, ale kosztuje jeden bajt.
feersum
2
Twój numer 9 to wspaniała gra w golfa!
xnor
3

Rozmiar całkowity: 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))<2lubL[1:]==L[:-1]

# 5

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

# 6

(14) x and abs(x)/xlub (zainspirowany rozwiązaniem Claudiu po poddaniu się)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"

Robaczek świętojański
źródło
1

Razem: 121

Pierwsze próby:

Problem 1

15 znaków
while len(L)>6:

Problem 2

5 znaków
x>0<y

Problem 3

7 znaków
L=L[b:]

Problem 4

13 znaków
len(set(L))<2

Problem 5

16 znaków
if n in L:L+=[n]

Problem 6

16 znaków
x and(1,-1)[x<0]

Problem 7

16 znaków
while(L+[0])[0]:

Problem 8

10 znaków
while n>1:

Problem 9

8 znaków
s[0]<'0'

Problem 10

15 znaków
"LWoisne"[b::2]

Claudiu
źródło