Primário palíndrico

8

Estou resolvendo tarefas, onde:

Entrada:

Um número como um número inteiro.

Resultado:

O primo palíndrico maior mais próximo como um número inteiro.

Gostaria muito de receber dicas de como diminuir minha solução. Ou instruções, se a mudança de abordagem for benéfica.

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)

palindrômico:

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

prime:

all(x%d for d in r(2,x))
Martin Rajnoha
fonte
3
Antes que as pessoas fechem votem, porque não é um desafio: coisas como essa estão no tópico agora . A única coisa que me pergunto é se isso não era mais adequado em duas perguntas separadas: "Como posso reduzir a verificação de números palindrômicos?" e "Como posso reduzir a verificação de números primos?" (@ Martin, não faça isso, porém, até obter mais feedback confirmando isso.)
Martin Ender
@ m.buettner, ok obrigado.
Martin Rajnoha

Respostas:

7

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>lno final é composta por muitos caracteres. Existe uma maneira de reduzi-lo? Eliminar a necessidade disso, alterando outra coisa?

A nextfunçã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.

isaacg
fonte
int for x== x[:: - 1], próximo para o índice [0] ... ainda pensando em x> l
Martin Rajnoha
@MartinRajnoha DICA: dê uma olhada mais profunda na rangefunção.
BeetDemGuise
Thx, pessoal, achei que :) Status atual -10chars. Ótimo!
Martin Rajnoha
@MartinRajnoha Como um ponto de referência rápido, eu consegui (em pouco tempo jogando seu código) remover 12 caracteres.
BeetDemGuise
@BeetDemGuise agora você está me provocando :) OK, como você conseguiu isso?
Martin Rajnoha