La mejor solución que he encontrado hasta ahora para un rompecabezas de código de golf en el que estoy trabajando incluye dos invocaciones de aspecto bastante gordorange
. Soy muy nuevo en code golf, especialmente en Python, por lo que podría usar algunos consejos.
El fragmento relevante es este
[x for x in range(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in range(2,x))]
El límite superior del primero range
no es fuerte. Debe ser al menos 98690, y todo lo demás es igual (en cuanto al golf, es decir), cuanto menor sea la diferencia entre este límite superior y 98690, mejor, en cuanto al rendimiento 1 . Estoy usando 7 6 (= 117649) porque 7**6
es la expresión de Python más corta que se me ocurre que se ajusta a la factura.
En contraste, el límite inferior en el primero range
, así como ambos límites en el segundo, son firmes. IOW, el programa (en su forma actual) producirá resultados incorrectos si se cambian esos límites.
¿Hay alguna manera de acortar una o ambas expresiones?
range(n+1,7**6)
range(2,x)
?
Por cierto, en este caso, el alias range
para, por ejemplo, r
no gana nada:
r=range;rr
rangerange
EDITAR: FWIW, el programa completo es este:
p=lambda n:[x for x in range(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in range(2,x))][0]
p(n)
debe ser el primo palindrómico más pequeño mayor que n
. Además, p
no debe ser recursivo. Advertencia: ¡ya es obscenamente lento!
1 Sí, lo sé: el rendimiento es irrelevante en el golf de código, pero es por eso que escribí "todo lo demás es igual (en cuanto al golf, eso es)". Por ejemplo, mi elección de 7**6
, y no la alternativa más obvia, pero de menor rendimiento, "equivalente al golf" 9**9
. Me gusta ejecutar realmente mis intentos de golf de código, lo que significa no permitir que el rendimiento se degrade hasta el punto de que llevará años ejecutar el código. Si puedo evitarlo, por supuesto.
p=lambda n:(x for x in xrange(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in xrange(2,x))).next()
. Por supuesto, mientras que su en que, como bien podría cambiarxrange(2,x)
axrange(2,int(x**.5+1))
y hacer su prueba muy rápido. Claramente, este código es equivalente al suyo, solo que más largo y más rápido.