Agora, para algumas realmente grandes melhorias. Seu programa original tinha 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)
Com as melhorias abaixo, você pode obter até 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)))
Com um truque para eliminar os parênteses ao redor da declaração de verificação do palíndromo, você pode chegar 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)))
No entanto, tenho uma solução em 80 caracteres. Para obtê-lo, concentre-se em mudar o cenário geral, não os componentes individuais. Repense suas escolhas mais básicas para chegar a esse ponto. Por que uma lambda? Por que um minuto de um intervalo filtrado? Pode haver uma maneira melhor.
O uso int()
na comparação palíndromo tem muitos caracteres - você pode ver uma maneira mais curta de transformar
x
e
`x`[::-1]
no mesmo tipo?
Além disso, essa parte and x>l
no final é composta por muitos caracteres. Existe uma maneira de reduzi-lo? Eliminar a necessidade disso, alterando outra coisa?
A next
função correta para o trabalho é? Lembre-se, isso é código de golfe, o tempo de execução é irrelevante.
A função de verificação principal parece clara, no entanto.
Além disso, e isso é meramente estético, não gosto de funções de alias, do jeito que você está fazendo com o range, quando ele não salva nenhum caractere, como neste caso.