Golf Practice: Python [geschlossen]


31

Dies ist eine Herausforderung, um die Golfoptimierung in Python zu üben - wiederverwendbare Tricks und Shortcuts, um einige Charaktere zu rasieren. Viele sind Python-Golfern vertraut und verwenden die gängigen Ideen aus den Python-Tipps . Einige von ihnen verwenden Python-spezifische Funktionen, von denen Sie vielleicht nicht wissen, dass sie existieren, wenn Sie sie nicht gesehen haben. Schauen Sie sich also die Tipps an, wenn Sie nicht weiterkommen.

Ziel: Es gibt zehn Probleme, von denen jedes ein Referenzschnipsel von Python-Code enthält, den Sie optimieren können, und eine Beschreibung des Codes enthält. Ihr Ziel ist es, es so umzuschreiben, dass es kürzer, aber dennoch funktional äquivalent ist.

Ihre Punktzahl, die Sie zu minimieren versuchen, ist die Gesamtlänge Ihres Codes aller Schnipsel. Die Länge der Referenzschnipsel beträgt 150. Tiebreaker ist der früheste Beitrag.

Antworten veröffentlichen: Veröffentlichen Sie für jedes Problem Ihren Code und die Anzahl der Zeichen. Sie können das Referenz-Snippet posten, wenn Sie nichts Kürzeres gefunden haben. Es ist beabsichtigt, dass Sie nicht auf die Antworten anderer schauen, wenn Sie Ihre posten. Bitte markieren Sie jedes einzelne Problem mit einem Spoiler, einschließlich der Anzahl der einzelnen Zeichen. Sie können die Gesamtzahl offen lassen. Zögern Sie nicht, Ihre Lösung zu löschen oder neue unverbaute Lösungen zu veröffentlichen.

Details zur Legalität: Funktionale Äquivalenz bedeutet, dass der Code in einem Programm ersetzt werden kann, ohne dass dies Auswirkungen auf sein Verhalten hat. Ausdrücke sollten Werte erzeugen, die äquivalent zu sind ==. Beachten Sie das 1.0==1==True. Ihr Code sollte keine Nebenwirkungen haben, sofern nicht anders angegeben. Ich beabsichtige nicht, dass die Probleme versionsspezifisch sind, aber für jeden Fall können Sie eine Python-Version für jedes Problem angeben.

Problem 1: Wiederholen Sie den Vorgang, solange die Liste Lmindestens 7 Elemente enthält

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

Problem 2 : Überprüfen Sie, ob zwei Schwimmer xund ybeide positiv sind.

# 11 chars
x>0 and y>0

Problem 3 : Wenn Boolean btrue ist, entfernen Sie das erste Element von L. Ansonsten lassen Sie es unverändert.

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

Aufgabe 4 : Prüfen Sie, ob alle Elemente einer nicht leeren LZahlenliste gleich sind. Für dieses Problem ist es in Ordnung, die Liste zu ändern.

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

Problem 5 : Fügen Sie eine Nummer nur dann nan das Ende einer Liste an L, wenn Ldiese Nummer bereits enthalten ist.

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

Aufgabe 6 : Drücken Sie das Vorzeichen eines Floats aus x: +1für positiv, 0für 0, -1für negativ.

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

Aufgabe 7L Setzen Sie eine Schleife fort, solange das erste Element von , eine Liste von Booleschen Werten, ist True. Auch aufhören, wenn Lleer ist.

# 17 chars
while L and L[0]:

Aufgabe 8 : Setzen Sie eine Schleife fort, solange sie ngrößer als 1 ist. Die Zahl nist garantiert eine positive ganze Zahl.

# 10 chars
while n>1:

Problem 9 : Überprüfen Sie, ob eine als Zeichenfolge dargestellte Ganzzahl snegativ ist (dh mit '-' beginnt).

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

Aufgabe 10 : Konvertieren Sie einen Booleschen Wert mit -> und -> bnach "Win"/ ."Lose"True"Win"False"Lose"

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

Achtung: Spoiler unten, scrollen Sie nicht nach unten, wenn Sie diese selbst lösen möchten.

Wenn Sie nur die optimale Punktzahl für ein Problem wissen möchten:

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


3
Ich habe für den Abschluss gestimmt, da diese Herausforderung doppelte Antworten hervorruft und effektiv viele Fragen in einer enthält, da es keinerlei Wechselwirkung zwischen den einzelnen Herausforderungen gibt. Ich denke, wenn wir solche Fragen haben, sollte es nur eine Antwort geben, nämlich ein Community-Wiki.
Wrzlprmft

2
@Wrzlprmft: Irgendwie ist es eine interessante Herausforderung. Aber nach 7 großartigen Beiträgen würde ich jetzt vorschlagen, die Regeln zu lockern und uneingeschränkte Lösungen für einzelne Probleme zuzulassen, da sonst perfekte Einsendungen möglicherweise hinter den insgesamt mittelmäßigen Gesamtnoten verborgen bleiben.
Falko

2
Ich denke, das ist eine coole Idee und wir sollten Golfpraktiken für mehr Sprachen haben.
Robbie Wxyz

2
@Wrzlprmft es gibt jetzt eine Diskussion darüber auf Meta . Bitte äußern Sie dort Ihre Meinung, um die Diskussion zu vereinfachen, ohne die Kommentare dieser Frage zu verschmutzen.
FireFly

3
Ich stimme dafür, diese Frage als nicht thematisch zu schließen, da mehrteilige Herausforderungen ohne Wechselwirkung zwischen den Teilen nicht zulässig sind. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Antworten:


21

Gesamt: 104 101 99 Zeichen

Problem 1

12 Zeichen
while L[6:]:

Problem 2

5 Zeichen
x>0<y

Problem 3

7 Zeichen
L=L[b:]

Problem 4

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

Problem 5

13 Zeichen
L+=set(L)&{n}

Problem 6

11 Zeichen
(x>0)-(x<0)

8 Zeichen (Python 2)
cmp(x,0)

Problem 7

12 Zeichen
while[.5]<L:

Problem 8

9 Zeichen
while~-n:

Problem 9

5 Zeichen
s<'.'

Problem 10

15 Zeichen
'LWoisne'[b::2]


@FryAmTheEggman Kannst du die Nebenwirkung erklären? Ich wollte, dass das eine gültige Lösung ist.
18.

@xnor Nevermind, ich habe mich völlig geirrt. Ich habe heute etwas gelernt :)
FryAmTheEggman

Ich halte diese Lösungen für optimal, angesichts der Vielzahl von 99 Lösungen und der Tatsache, dass ich nichts Besseres finden kann. Ich würde mich über eine Verbesserung freuen. Da dies die ersten 99 waren, akzeptiere ich es.
xnor

7

Gesamtgröße: 128 122 120 117 116 115 111 107 104

Problem 1

Wiederholen Sie den Vorgang, solange die Liste Lmindestens 7 Elemente enthält.

15 Zeichen
while len(L)>6:
(Ja, ich könnte 3 Bytes einsparen, aber ich habe versehentlich die Antwort von Sp3000 gesehen, daher werde ich diese drei Bytes nicht beanspruchen.)

Problem 2

Überprüfen Sie, ob zwei Schwimmer xund ybeide positiv sind.

5 Zeichen
x>0<y

Problem 3

Wenn Boolean btrue ist, entfernen Sie das erste Element von L. Ansonsten lassen Sie es unverändert.

7 Zeichen
L=L[b:]

Problem 4

Überprüfen Sie, ob alle Elemente einer nicht leeren LZahlenliste gleich sind. Für dieses Problem ist es in Ordnung, die Liste zu ändern.

13 Zeichen
L[1:]==L[:-1]

Problem 5

Fügen Sie eine Nummer nur dann nan das Ende einer Liste an L, wenn Ldiese Nummer bereits enthalten ist.

15 Zeichen
L+=[n]*(n in L)
oder
L+=[n][:n in L]

Problem 6

Drücken Sie das Vorzeichen eines Floats aus x: +1für positiv, 0für 0, -1für negativ.

8 Zeichen, Python 2
cmp(x,0)
Laut Dokumenten kann dies jeden positiven / negativen Wert zurückgeben, aber Konsens ist, dass es immer -1, 0, 1 zurückgibt.

Problem 7

LSetzen Sie eine Schleife fort, solange das erste Element von , eine Liste von Booleschen Werten, ist True. Auch aufhören, wenn Lleer ist.

12 Zeichen
while[1]<=L:

Problem 8

Setzen Sie eine Schleife fort, solange sie ngrößer als 1 ist. Die Zahl nist garantiert eine positive ganze Zahl.

9 Zeichen
while~-n:

Problem 9

Überprüfen Sie, ob eine als Zeichenfolge dargestellte Ganzzahl snegativ ist (dh mit '-' beginnt).

5 Zeichen
s<'.'

Problem 10

Konvertieren Sie einen Booleschen Wert mit -> und -> bnach "Win"/ ."Lose"True"Win"False"Lose"

15 Zeichen
"LWoisne"[b::2]


Könnten Sie bitte auch die einzelnen Längen verderben?
xnor

@xnor Kein Problem, fertig.
Martin Ender

7

Gesamt: 106 104 102 Zeichen

Problem 1

12 Zeichen
while L[6:]:

Problem 2

5 Zeichen
x>0<y
Huzzah zum Vergleich Verkettung

Problem 3

7 Zeichen
L=L[b:]
Gute alte implizite Konvertierung

Problem 4

13
len(set(L))<2

Alternativ:
L[1:]==L[:-1]

Dummer Weg, um die Negation dessen zu bekommen, was wir in Python 2 wollen:
","in`set(L)`

Ich bin mir nicht sicher, wie wichtig "es ist, die Liste zu ändern" ist, denn das Beste, was ich mir vorstellen kann, sind 14 Zeichen (und ist eigentlich falsch):
L==[L.pop()]+L

Problem 5

13 Zeichen
L+={n}&set(L)
Funky Dinge mit Sets machen

Problem 6

11 Zeichen
(x>0)-(x<0)

Problem 7

12 Zeichen
while[1]<=L:
Verwendet die lexikografische Reihenfolge der Listen

Problem 8

9 Zeichen
while~-n:

Problem 9

5 Zeichen
s<"."
Verwendet die lexikografische Reihenfolge der Zeichenfolgen

Problem 10

15 Zeichen
"LWoisne"[b::2]

Alternativ:
b*"Win"or"Lose"


1
Ich hatte Ihre Alternative zu # 10 vorher nicht in Betracht gezogen. Dies bedeutet, dass Sie unabhängig von der Länge der Zeichenfolgen die gleichen Zeichenersparnisse wie mit dem üblichen Interleaving-Trick erzielen können, mit Ausnahme von Prioritätsproblemen beim Bool. Ich werde dies zu den Tipps hinzufügen.
Xnor

1
@xnor Ahaha ja, ich fand es ziemlich nett. Es ist jedoch nicht so gut, wenn Sie mehr Saiten haben, was nachteilig ist (z. B. b0, 1 oder 2, und alles, was Sie tun können, ist (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000 18.11.14


Das ist eigentlich nicht schlecht für drei Saiten. Sie können die Parens mit entfernen ~b*"Hello".
xnor

@xnor Zu diesem Zeitpunkt ["Good Afternoon","Goodbye","Hello"][b]würde gewinnen: P
Sp3000 18.11.14

6

Gesamt: 99 Bytes

Problem 1

12 Bytes
while L[6:]:

Problem 2

5 Bytes
x>0<y

Problem 3

7 Bytes
L=L[b:]

Problem 4

13 Byte
len(set(L))<2

14 Byte Alternativen
min(L)==max(L)
set(L)=={L[0]}

Problem 5

13 Bytes
L+=set(L)&{n}

Problem 6

8 Bytes
cmp(x,0)

Problem 7

12 Bytes
while[1]<=L:

Problem 8

9 Bytes
while~-n:

Problem 9

5 Bytes
s<'.'

Problem 10

15 Bytes
b*"Win"or"Lose"
- oder -
"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)oder L+=[n][:n in L]
6: 11
Dies ist die einzige, für die mir nicht sofort ein idiomatischer Ausdruck in den Sinn gekommen ist, aber ich glaube, ich habe die richtige Antwort gefunden. Edit: Nein, es war schrecklich.
(x>0)-(x<0)
7: 12
while[1]<=L:
Oder wenn das Programm danach fertig ist, while L[0]ist das schön.
8: 9
while~-n:
9: 5 Hier würden
viele Zeichenfolgen funktionieren, aber die "naive Methode" ist lustig.
s<'0'
10: 15
'LWoisne'[b::2]

Gesamt: 106


Müsste Ihre Nummer 4 nicht verwenden [L[0]]?
FireFly

@FireFly Hoppla. Es ist nicht so schlimm, kostet aber ein Byte.
Feersum

2
Ihre Nummer 9 ist ein wunderbares Wortspiel!
Xnor

3

Gesamtgröße: 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))<2oderL[1:]==L[:-1]

# 5

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

# 6

(14) x and abs(x)/xoder (inspiriert von Claudius Lösung nach dem Aufgeben)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

Gesamt: 121

Erste Versuche:

Problem 1

15 Zeichen
while len(L)>6:

Problem 2

5 Zeichen
x>0<y

Problem 3

7 Zeichen
L=L[b:]

Problem 4

13 Zeichen
len(set(L))<2

Problem 5

16 Zeichen
if n in L:L+=[n]

Problem 6

16 Zeichen
x and(1,-1)[x<0]

Problem 7

16 Zeichen
while(L+[0])[0]:

Problem 8

10 Zeichen
while n>1:

Problem 9

8 Zeichen
s[0]<'0'

Problem 10

15 Zeichen
"LWoisne"[b::2]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.