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))
Respostas:
Agora, para algumas realmente grandes melhorias. Seu programa original tinha 97 caracteres:
Com as melhorias abaixo, você pode obter até 90 caracteres:
Com um truque para eliminar os parênteses ao redor da declaração de verificação do palíndromo, você pode chegar a 87:
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 transformare
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.
fonte
x
==x
[:: - 1], próximo para o índice [0] ... ainda pensando em x> lrange
função.