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 range
nã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 range
e 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, r
nã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, p
nã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.