Prime palindrómico

8

Estoy resolviendo la tarea, donde:

Entrada:

Un número como un entero.

Salida:

El primo palindrómico mayor más cercano como un entero.

Le agradecería sugerencias sobre cómo acortar mi solución. O instrucciones si el cambio de enfoque sería beneficioso.

golf=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)

palíndromo:

x==int(`x`[::-1])

principal:

all(x%d for d in r(2,x))
Martin Rajnoha
fuente
3
Antes de que la gente cierre este voto, porque no es un desafío: cosas como esta están en el tema ahora . Lo único que me pregunto es si esto no era más adecuado como dos preguntas separadas "¿Cómo puedo hacer que la comprobación de números palindrómicos sea más corta?" y "¿Cómo puedo hacer que la comprobación de números primos sea más corta?" (@ Martin, sin embargo, no hagas eso, hasta que recibas más comentarios que confirmen esto.)
Martin Ender
@ m.buettner, ok gracias.
Martin Rajnoha

Respuestas:

7

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>lbit al final es una gran cantidad de personajes. ¿Hay alguna manera de que podamos acortarlo? ¿Eliminar la necesidad de cambiar algo más?

¿Es nextla 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.

isaacg
fuente
int for x== x[:: - 1], next for index [0] ... sigo pensando y x> l
Martin Rajnoha
@MartinRajnoha SUGERENCIA: profundice en la rangefunción.
BeetDemGuise
Gracias, chicos, encontré eso :) Estado actual -10 caracteres. ¡Excelente!
Martin Rajnoha
@MartinRajnoha Como un punto de referencia rápido, pude (en mi poco tiempo jugando a tu código) eliminar 12 caracteres.
BeetDemGuise
@BeetDemGuise ahora me estás tomando el pelo :) Bien, ¿cómo lo lograste?
Martin Rajnoha