Golf Practice: Python [fermé]

31

C'est un défi de pratiquer l'optimisation du golf en Python - des astuces et des raccourcis réutilisables pour raser quelques personnages. Beaucoup sont familiers aux golfeurs Python et utilisent les idées communes des conseils Python . Certains d'entre eux utilisent des fonctionnalités spécifiques à Python dont vous ne connaissez peut-être pas l'existence, sauf si vous les avez vues, alors jetez un œil aux conseils si vous êtes coincé.

Objectif: Il y a dix problèmes, chacun un extrait de référence de code Python à optimiser et une description du code. Votre objectif est de le réécrire pour être plus court mais toujours fonctionnellement équivalent.

Votre score, que vous essayez de minimiser, est la longueur totale de votre code tous les extraits. La longueur des extraits de référence est de 150. Tiebreaker est le premier message.

Publication des réponses: pour chaque problème, publiez votre code et son nombre de caractères. Vous pouvez publier l'extrait de référence si vous n'avez pas trouvé quelque chose de plus court. Il est prévu que vous ne regardiez pas les réponses des autres lorsque vous postez les vôtres. Veuillez spoiler-tag chaque problème individuel, y compris le nombre de caractères individuels. Vous pouvez laisser le nombre total révélé. N'hésitez pas maintenant à dévoiler votre solution ou à publier de nouvelles solutions non corrompues.

Détails sur la légalité: l'équivalence fonctionnelle signifie que le code peut être remplacé dans un programme sans affecter son comportement (en ignorant des choses comme l'utilisation de la mémoire et la priorité de l'opérateur dans le cadre d'une expression). Les expressions doivent produire des valeurs équivalentes à ==. Notez que 1.0==1==True. Votre code ne devrait avoir aucun effet secondaire, sauf indication contraire. Je n'ai pas l'intention que les problèmes soient spécifiques à la version, mais juste au cas où, vous pouvez spécifier une version Python pour chaque problème.

Problème 1: continuez à répéter tant que la liste Lcontient au moins 7 éléments

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

Problème 2 : Vérifiez si deux flottent xet ysont tous deux positifs.

# 11 chars
x>0 and y>0

Problème 3 : si Boolean best vrai, supprimez le premier élément de L. Sinon, laissez-le inchangé.

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

Problème 4 : Vérifiez si tous les éléments d'une liste Lde nombres non vide sont égaux. Pour ce problème, vous pouvez modifier la liste.

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

Problème 5 : Ajoutez un numéro nà la fin d'une liste Luniquement s'il Lcontient déjà ce numéro.

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

Problème 6 : Exprimer le signe d'un flottant x: +1pour positif, 0pour 0, -1pour négatif.

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

Problème 7 Continuez une boucle tant que le premier élément de L, une liste de booléens, est True. Arrêtez également si Lest vide.

# 17 chars
while L and L[0]:

Problème 8 : Continuez une boucle tant qu'elle nest supérieure à 1. Le nombre nest garanti être un entier positif.

# 10 chars
while n>1:

Problème 9 : Vérifiez si un entier représenté sous forme de chaîne sest négatif (c'est-à-dire qu'il commence par «-»).

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

Problème 10 : convertir un booléen ben "Win"/ "Lose", avec True-> "Win"et False-> "Lose".

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

Avertissement: Spoilers ci-dessous, ne faites pas défiler vers le bas si vous souhaitez les résoudre vous-même.

Si vous voulez simplement connaître le score optimal pour un problème:

Problème 1:

12

Problème 2:

5

Problème 3:

7

Problème 4:

13

Problème 5:

13

Problème 6:

8

Problème 7:

12

Problème 8:

9

Problème 9:

5

Problème 10:

15

Xnor
la source
3
J'ai voté pour la clôture, car ce défi provoque des réponses en double et est effectivement de nombreuses questions en une, car il n'y a aucune interaction entre les défis individuels. Je pense que si nous avons de telles questions, il ne devrait y avoir qu'une seule réponse, qui est un wiki communautaire.
Wrzlprmft
2
@Wrzlprmft: C'est en quelque sorte un défi intéressant. Mais après avoir eu 7 contributions formidables, je suggère maintenant d'assouplir les règles et de permettre des solutions intactes à des problèmes uniques, car sinon des soumissions parfaites pourraient rester cachées derrière des scores globaux médiocres.
Falko
2
Je pense que c'est une bonne idée et que nous devrions avoir des pratiques de golf pour plus de langues.
Robbie Wxyz
2
@Wrzlprmft il y a maintenant une discussion à ce sujet sur la méta . Veuillez y exprimer votre opinion, pour une discussion plus facile sans polluer les commentaires de cette question.
FireFly
3
Je vote pour fermer cette question comme hors sujet car les défis en plusieurs parties sans interaction entre les parties sont interdits. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Réponses:

21

Total: 104 101 99 caractères

Problème 1

12 caractères
while L[6:]:

Problème 2

5 caractères
x>0<y

Problème 3

7 caractères
L=L[b:]

Problème 4

13 caractères
len(set(L))<2
L[1:]==L[:-1]

Problème 5

13 caractères
L+=set(L)&{n}

Problème 6

11 caractères
(x>0)-(x<0)

8 caractères (Python 2)
cmp(x,0)

Problème 7

12 caractères
while[.5]<L:

Problème 8

9 caractères
while~-n:

Problème 9

5 caractères
s<'.'

Problème 10

15 caractères
'LWoisne'[b::2]

grc
la source
@FryAmTheEggman Pouvez-vous expliquer l'effet secondaire? Je voulais que ce soit une solution valable.
xnor
@xnor Nevermind, j'avais tout à fait tort. J'ai appris quelque chose aujourd'hui :)
FryAmTheEggman
Je pense que ces solutions sont optimales, étant donné les multiples solutions 99 et le fait que je ne trouve rien de mieux. Je serais heureux de voir une amélioration cependant. Comme c'était le premier 99, je l'accepte.
xnor
7

Taille totale: 128 122 120 120 117 116 115 111 107 104

Problème 1

Continuez à itérer tant que la liste Lcontient au moins 7 éléments.

15 caractères
while len(L)>6:
(Oui, je pourrais économiser 3 octets à ce sujet, mais j'ai vu accidentellement la réponse de la solution Sp3000, donc je ne revendiquerai pas ces trois octets.)

Problème 2

Vérifier si deux flotteurs xet ysont tous deux positifs.

5 caractères
x>0<y

Problème 3

Si Boolean best vrai, supprimez le premier élément de L. Sinon, laissez-le inchangé.

7 caractères
L=L[b:]

Problème 4

Vérifiez si tous les éléments d'une liste Lde nombres non vide sont égaux. Pour ce problème, vous pouvez modifier la liste.

13 caractères
L[1:]==L[:-1]

Problème 5

Ajoutez un numéro nà la fin d'une liste Luniquement s'il Lcontient déjà ce numéro.

15 caractères
L+=[n]*(n in L)
ou
L+=[n][:n in L]

Problème 6

Exprimer le signe d'un flotteur x: +1pour positif, 0pour 0, -1pour négatif.

8 caractères, Python 2
cmp(x,0)
Selon les documents, cela pourrait renvoyer n'importe quelle valeur positive / négative, mais le consensus est qu'il renvoie toujours -1, 0, 1.

Problème 7

Continuez une boucle tant que le premier élément de L, une liste de booléens, l'est True. Arrêtez également si Lest vide.

12 caractères
while[1]<=L:

Problème 8

Continuez une boucle tant qu'elle nest supérieure à 1. Le nombre nest garanti être un entier positif.

9 caractères
while~-n:

Problème 9

Vérifiez si un entier représenté par une chaîne sest négatif (c'est-à-dire qu'il commence par «-»).

5 caractères
s<'.'

Problème 10

Convertissez un booléen ben "Win"/ "Lose", avec True-> "Win"et False-> "Lose".

15 caractères
"LWoisne"[b::2]

Martin Ender
la source
Pourriez-vous également spoiler les longueurs individuelles?
2014
@xnor Aucun problème, c'est fait.
Martin Ender
7

Total: 106 104 102 caractères

Problème 1

12 caractères
while L[6:]:

Problème 2

5 caractères
x>0<y
Huzzah pour le chaînage de comparaison

Problème 3

7 caractères
L=L[b:]
Bonne vieille conversion implicite

Problème 4

13
len(set(L))<2

Alternativement:
L[1:]==L[:-1]

façon stupide d'obtenir la négation de ce que nous voulons en Python 2:
","in`set(L)`

je ne suis pas sûr de la pertinence de "c'est OK pour modifier la liste", car le mieux que je puisse penser est de 14 caractères (et est réellement faux):
L==[L.pop()]+L

Problème 5

13 caractères
L+={n}&set(L)
Faire des choses géniales avec des ensembles

Problème 6

11 caractères
(x>0)-(x<0)

Problème 7

12 caractères
while[1]<=L:
Utilise l'ordre lexicographique des listes

Problème 8

9 caractères
while~-n:

Problème 9

5 caractères
s<"."
Utilise l'ordre lexicographique des cordes

Problème 10

15 caractères
"LWoisne"[b::2]

Alternativement:
b*"Win"or"Lose"

Sp3000
la source
1
Je n'avais pas considéré votre alternative au n ° 10 auparavant. Cela signifie que l'on peut obtenir les mêmes économies de caractères que l'astuce d'entrelacement habituelle quelle que soit la longueur des chaînes, sauf les problèmes de priorité dans le booléen. Je vais ajouter cela aux conseils.
xnor
1
@xnor Ahaha ouais, je pensais que c'était plutôt sympa. Ce n'est pas aussi bon quand vous avez plus de chaînes, ce qui est un inconvénient (par exemple b, 0, 1 ou 2, et tout ce que vous pouvez faire est (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000
Ce n'est pas mal en fait pour trois cordes. Vous pouvez supprimer les parens avec ~b*"Hello".
2014
@xnor À ce stade, ["Good Afternoon","Goodbye","Hello"][b]gagnerait: P
Sp3000
6

Total: 99 octets

Problème 1

12 octets
while L[6:]:

Problème 2

5 octets
x>0<y

Problème 3

7 octets
L=L[b:]

Problème 4

13 octets
len(set(L))<2

14 octets alternatifs
min(L)==max(L)
set(L)=={L[0]}

Problème 5

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

Problème 6

8 octets
cmp(x,0)

Problème 7

12 octets
while[1]<=L:

Problème 8

9 octets
while~-n:

Problème 9

5 octets
s<'.'

Problème 10

15 octets
b*"Win"or"Lose"
- ou -
"LWoisne"[b::2]

primo
la source
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)ou L+=[n][:n in L]
6: 11
C'est le seul pour lequel une expression idiomatique ne m'a pas immédiatement sauté à l'esprit, mais je pense que j'ai trouvé la bonne réponse. Edit: Non, c'était horrible.
(x>0)-(x<0)
7: 12
while[1]<=L:
Ou si le programme est terminé après cela, while L[0]c'est bien.
8: 9
while~-n:
9: 5
De nombreuses chaînes fonctionneraient ici, mais la "méthode naïve" est drôle.
s<'0'
10: 15
'LWoisne'[b::2]

Total: 106

feersum
la source
Votre numéro 4 ne devrait-il pas être utilisé [L[0]]?
FireFly
@FireFly Whoops. Ce n'est pas aussi mauvais que cela, mais coûte un octet.
feersum
2
Votre # 9 est un jeu de mots merveilleux pour le golf!
xnor
3

Taille totale: 123 121 120 116

#1

(12) while L[6:]:

# 2

(dix) min(x,y)>0

# 3

(7) L=L[b:]

# 4

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

# 5

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

# 6

(14) x and abs(x)/xou (inspiré par la solution de Claudiu après avoir abandonné)x and(x>0)*2-1

#7

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

# 8

(9) while~-n:

# 9

(5) s<'.'

#dix

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

Luciole
la source
1

Total: 121

Premières tentatives:

Problème 1

15 caractères
while len(L)>6:

Problème 2

5 caractères
x>0<y

Problème 3

7 caractères
L=L[b:]

Problème 4

13 caractères
len(set(L))<2

Problème 5

16 caractères
if n in L:L+=[n]

Problème 6

16 caractères
x and(1,-1)[x<0]

Problème 7

16 caractères
while(L+[0])[0]:

Problème 8

10 caractères
while n>1:

Problème 9

8 caractères
s[0]<'0'

Problème 10

15 caractères
"LWoisne"[b::2]

Claudiu
la source