Ahora, para algunas mejoras realmente grandes. Su programa original tenía 97 caracteres:
n=lambda l,r=range:next(x for x in r(10**6)if(x==int(`x`[::-1]))&all(x%d for d in r(2,x))and x>l)
Con las mejoras a continuación, puede llegar a 90 caracteres:
n=lambda l,r=range:min(x for x in r(l+1,10**6)if(`x`==`x`[::-1])&all(x%d for d in r(2,x)))
Con un truco para eliminar los paréntesis alrededor de la declaración de comprobación de palíndromo, puede llegar a 87:
n=lambda l,r=range:min(x for x in r(l+1,10**4)if`x`==`x`[::-1]*all(x%d for d in r(2,x)))
Sin embargo, tengo una solución en 80 caracteres. Para obtenerlo, concéntrese en cambiar el panorama general, no los componentes individuales. Reconsidere sus elecciones más básicas para llegar a este punto. ¿Por qué una lambda? ¿Por qué un mínimo de un rango filtrado? Puede haber una mejor manera.
El uso int()
en la comparación de palíndromo es una gran cantidad de personajes: ¿puedes ver una forma más corta de girar?
x
y
`x`[::-1]
en el mismo tipo?
Además, ese and x>l
bit al final es una gran cantidad de personajes. ¿Hay alguna manera de que podamos acortarlo? ¿Eliminar la necesidad de cambiar algo más?
¿Es next
la función correcta para el trabajo? Recuerde, este es el código de golf, el tiempo de ejecución es irrelevante.
Sin embargo, la función de comprobación principal parece perfecta.
Además, y esto es meramente estético, no me gustan las funciones de alias, la forma en que lo hace con el rango, cuando no guarda ningún carácter, como en este caso.