A melhor solução que encontrei até agora para um quebra-cabeça de código de golfe em que estou trabalhando inclui duas invocações bastante gordasrange . Sou muito novo em código de golfe, especialmente em Python, para poder usar algumas dicas.
O fragmento relevante é este
[x for x in range(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in range(2,x))]
O limite superior do primeiro rangenão é nítido. Deveria ser pelo menos 98690, e todo o resto ser igual (ou seja, em termos de golfe), quanto menor a diferença entre esse limite superior e 98690, melhor e em termos de desempenho 1 . Estou usando 7 6 (= 117649) porque 7**6é a expressão Python mais curta que eu posso apresentar que se encaixa na conta.
Por outro lado, o limite inferior no primeiro rangee os dois no segundo são firmes. IOW, o programa (em sua forma atual) produzirá resultados incorretos se esses limites forem alterados.
Existe uma maneira de encurtar uma ou ambas as expressões
range(n+1,7**6)
range(2,x)
?
Aliás, neste caso, aliasing range, digamos, rnão ganha nada:
r=range;rr
rangerange
EDIT: FWIW, o programa completo é o seguinte:
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)deve ser o menor primo palindrômico maior que n. Além disso, pnão deve ser recursivo. Aviso: já é obscenamente lento!
1 Sim, eu sei: o desempenho é irrelevante no código de golfe, mas foi por isso que escrevi "todo o resto é igual (em termos de golfe)". Por exemplo, minha escolha de 7**6, e não a alternativa mais imediatamente óbvia, mas com pior desempenho e "equivalente ao golfe" 9**9. Eu realmente gosto de executar minhas tentativas de código de golfe, o que significa não deixar o desempenho degradar a ponto de levar anos para executar o código. Se eu puder ajudar, é claro.
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(). Claro que, quando seu isso, poderia muito bem mudarxrange(2,x)paraxrange(2,int(x**.5+1))e fazer o seu teste muito rápido. Claramente, esse código é equivalente ao seu, apenas mais longo e mais rápido.