Práctica de golf: Python [cerrado]

31

Este es un desafío de practicar la optimización del golf en Python: trucos y accesos directos reutilizables para eliminar algunos caracteres. Muchos estarán familiarizados con los golfistas de Python y usarán ideas comunes de los Consejos de Python . Algunos de estos usan funciones específicas de Python que quizás no sepa que existen a menos que las haya visto, así que eche un vistazo a los consejos si está atascado.

Objetivo: hay diez problemas, cada uno de los cuales es un fragmento de referencia del código de Python para que lo optimices y una descripción del código. Su objetivo es reescribirlo para que sea más corto pero funcionalmente equivalente.

Su puntaje, que está tratando de minimizar, es la longitud total de su código en todos los fragmentos. La longitud de los fragmentos de referencia es de 150. Tiebreaker es la publicación más antigua.

Publicar respuestas: para cada problema, publique su código y su recuento de caracteres. Puede publicar el fragmento de referencia si no encontró algo más corto. Se pretende que no mire las respuestas de los demás cuando publique las suyas. Marque con spoiler cada problema individual, incluidos los recuentos de caracteres individuales. Puedes dejar el recuento total revelado. Siéntase libre de deshacer su solución o publicar nuevas soluciones no contaminadas.

Detalles sobre la legalidad: la equivalencia funcional significa que el código se puede reemplazar en un programa sin afectar su comportamiento (ignorando cosas como el uso de memoria y la precedencia del operador como parte de una expresión). Las expresiones deben producir valores equivalentes por ==. Tenga en cuenta que 1.0==1==True. Su código no debe tener efectos secundarios a menos que se indique lo contrario. No pretendo que los problemas sean específicos de la versión, pero por si acaso, puede especificar una versión de Python para cada problema.

Problema 1: siga iterando mientras la lista Ltenga al menos 7 elementos

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

Problema 2 : Verifique si dos flotadores xy yambos son positivos.

# 11 chars
x>0 and y>0

Problema 3 : si Boolean bes verdadero, elimine el primer elemento de L. De lo contrario, déjelo sin cambios.

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

Problema 4 : Verifique si todos los elementos de una lista Lde números no vacía son iguales. Para este problema, está bien modificar la lista.

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

Problema 5 : agregue un número nal final de una lista Lsolo si Lya contiene ese número.

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

Problema 6 : Exprese el signo de un flotador x: +1para positivo, 0para 0, -1para negativo.

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

Problema 7 Continúe un bucle mientras el primer elemento de L, una lista de booleanos, sea True. También pare si Lestá vacío.

# 17 chars
while L and L[0]:

Problema 8 : Continúe un ciclo siempre que nsea ​​mayor que 1. Se ngarantiza que el número sea un entero positivo.

# 10 chars
while n>1:

Problema 9 : Verifique si un número entero representado como una cadena ses negativo (es decir, comienza con '-').

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

Problema 10 : Convertir un booleano ba "Win"/ "Lose", con True-> "Win"y False-> "Lose".

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

Advertencia: Spoilers a continuación, no se desplace hacia abajo si desea resolverlos usted mismo.

Si solo quiere saber la puntuación óptima para un problema:

Problema 1:

12

Problema 2:

5 5

Problema 3:

7 7

Problema 4:

13

Problema 5:

13

Problema 6:

8

Problema 7:

12

Problema 8:

9 9

Problema 9:

5 5

Problema 10:

15

xnor
fuente
3
He votado a favor de cerrar, ya que este desafío provoca respuestas duplicadas y efectivamente hay muchas preguntas en una, ya que no existe interacción entre los desafíos individuales. Creo que si tenemos esas preguntas, solo debería haber una respuesta, que es una wiki comunitaria.
Wrzlprmft
2
@Wrzlprmft: De alguna manera es un desafío interesante. Pero después de tener 7 grandes contribuciones, ahora, sugiero que se relajen las reglas y se permitan soluciones intactas a problemas individuales, porque de lo contrario las presentaciones perfectas podrían permanecer ocultas detrás de los puntajes totales mediocres en general.
Falko
2
Creo que esta es una idea genial y que deberíamos tener prácticas de golf para más idiomas.
Robbie Wxyz
2
@Wrzlprmft ahora hay una discusión sobre esto en meta . Exprese su opinión allí, para una discusión más fácil sin contaminar los comentarios de esta pregunta.
FireFly
3
Estoy votando para cerrar esta pregunta como fuera de tema porque los desafíos de varias partes sin interacción entre las partes están prohibidos. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Respuestas:

21

Total: 104 101 99 caracteres

Problema 1

12 caracteres
while L[6:]:

Problema 2

5 caracteres
x>0<y

Problema 3

7 caracteres
L=L[b:]

Problema 4

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

Problema 5

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

Problema 6

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

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

Problema 7

12 caracteres
while[.5]<L:

Problema 8

9 caracteres
while~-n:

Problema 9

5 caracteres
s<'.'

Problema 10

15 caracteres
'LWoisne'[b::2]

grc
fuente
@FryAmTheEggman ¿Puedes explicar el efecto secundario? Tenía la intención de que fuera una solución válida.
xnor
@xnor No importa, estaba completamente equivocado. Hoy aprendí algo :)
FryAmTheEggman
Creo que estas soluciones son óptimas, dadas las múltiples soluciones 99 y el hecho de que no puedo encontrar nada mejor. Sin embargo, me alegraría ver una mejora. Como este fue el primer 99, lo estoy aceptando.
xnor
7

Tamaño total: 128 122 120 117 116 115 111 107 104

Problema 1

Siga iterando mientras la lista Ltenga al menos 7 elementos.

15 caracteres
while len(L)>6:
(Sí, podría ahorrar 3 bytes en esto, pero accidentalmente vi la respuesta de la solución Sp3000, por lo que no reclamaré esos tres bytes).

Problema 2

Compruebe si dos flotadores xy yambos son positivos.

5 caracteres
x>0<y

Problema 3

Si Boolean bes verdadero, elimine el primer elemento de L. De lo contrario, déjelo sin cambios.

7 caracteres
L=L[b:]

Problema 4

Compruebe si todos los elementos de una lista Lde números no vacía son iguales. Para este problema, está bien modificar la lista.

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

Problema 5

Agregue un número nal final de una lista Lsolo si Lya contiene ese número.

15 caracteres
L+=[n]*(n in L)
o
L+=[n][:n in L]

Problema 6

Exprese el signo de un flotador x: +1para positivo, 0para 0, -1para negativo.

8 caracteres, Python 2
cmp(x,0)
Según los documentos, esto podría devolver cualquier valor positivo / negativo, pero el consenso es que siempre devuelve -1, 0, 1.

Problema 7

Continúe un bucle mientras el primer elemento de L, una lista de booleanos, sea True. También pare si Lestá vacío.

12 caracteres
while[1]<=L:

Problema 8

Continúe un ciclo siempre que nsea ​​mayor que 1. Se ngarantiza que el número sea un entero positivo.

9 caracteres
while~-n:

Problema 9

Compruebe si un número entero representado como una cadena ses negativo (es decir, comienza con '-').

5 caracteres
s<'.'

Problema 10

Convierta un booleano ba "Win"/ "Lose", con True-> "Win"y False-> "Lose".

15 caracteres
"LWoisne"[b::2]

Martin Ender
fuente
¿Podrías estropear también las longitudes individuales?
xnor
@xnor No hay problema, hecho.
Martin Ender
7

Total: 106 104 102 caracteres

Problema 1

12 caracteres
while L[6:]:

Problema 2

5 caracteres
x>0<y
Huzzah para el encadenamiento de comparación

Problema 3

7 caracteres
L=L[b:]
Buena vieja conversión implícita

Problema 4

13
len(set(L))<2

Alternativamente:
L[1:]==L[:-1]

forma estúpida de obtener la negación de lo que queremos en Python 2:
","in`set(L)`

sin embargo, no estoy seguro de cuál es la relevancia de "está bien modificar la lista", porque lo mejor que puedo pensar es 14 caracteres (y es realmente mal):
L==[L.pop()]+L

Problema 5

13 caracteres
L+={n}&set(L)
Haciendo cosas funky con sets

Problema 6

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

Problema 7

12 caracteres
while[1]<=L:
Utiliza el orden lexicográfico de las listas

Problema 8

9 caracteres
while~-n:

Problema 9

5 caracteres
s<"."
Utiliza ordenamiento lexicográfico de cadenas

Problema 10

15 caracteres
"LWoisne"[b::2]

Alternativamente:
b*"Win"or"Lose"

Sp3000
fuente
1
No había considerado tu alternativa al # 10 antes. Significa que uno puede obtener el mismo ahorro de caracteres que el truco de intercalado habitual, independientemente de la longitud de las cadenas, salvo los problemas de precedencia en el bool. Agregaré esto a los consejos.
xnor
1
@xnor Ahaha sí, pensé que era bastante agradable. Sin embargo, no es tan bueno cuando tiene más cadenas, lo cual es una desventaja (por ejemplo, bes 0, 1 o 2, y todo lo que puede hacer es (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000
Eso en realidad no está mal para tres cuerdas. Puede eliminar los parens con ~b*"Hello".
xnor
@xnor En ese momento, ["Good Afternoon","Goodbye","Hello"][b]ganaría: P
Sp3000
6

Total: 99 bytes

Problema 1

12 bytes
while L[6:]:

Problema 2

5 bytes
x>0<y

Problema 3

7 bytes
L=L[b:]

Problema 4

13 bytes
len(set(L))<2

alternativas de 14 bytes
min(L)==max(L)
set(L)=={L[0]}

Problema 5

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

Problema 6

8 bytes
cmp(x,0)

Problema 7

12 bytes
while[1]<=L:

Problema 8

9 bytes
while~-n:

Problema 9

5 bytes
s<'.'

Problema 10

15 bytes
b*"Win"or"Lose"
- o -
"LWoisne"[b::2]

primo
fuente
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)o L+=[n][:n in L]
6: 11
Esta es la única para la cual una expresión idiomática no saltó inmediatamente a mi mente, pero creo que encontré la respuesta correcta. Editar: No, fue horrible.
(x>0)-(x<0)
7: 12
while[1]<=L:
O si el programa se completa después de eso, while L[0]es bueno.
8: 9
while~-n:
9: 5
Muchas cadenas funcionarían aquí, pero el "método ingenuo" es divertido.
s<'0'
10: 15
'LWoisne'[b::2]

Total: 106

Feersum
fuente
¿No tendría que usar su # 4 [L[0]]?
FireFly
@FireFly Whoops. No es tan malo como eso, pero cuesta un byte.
fiesta
2
¡Tu # 9 es un maravilloso juego de palabras de golf!
xnor
3

Tamaño total: 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))<2oL[1:]==L[:-1]

# 5

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

# 6

(14) x and abs(x)/xo (inspirado en la solución de Claudiu después de darse por vencido)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"

Luciérnaga
fuente
1

Total: 121

Primeros intentos:

Problema 1

15 caracteres
while len(L)>6:

Problema 2

5 caracteres
x>0<y

Problema 3

7 caracteres
L=L[b:]

Problema 4

13 caracteres
len(set(L))<2

Problema 5

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

Problema 6

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

Problema 7

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

Problema 8

10 caracteres
while n>1:

Problema 9

8 caracteres
s[0]<'0'

Problema 10

15 caracteres
"LWoisne"[b::2]

Claudiu
fuente