Dado um número inteiro n
, retorne o número de maneiras que n pode ser escrito como uma lista de números primos. Por exemplo, 2323
pode ser escrito como (2,3,23)
, (23,23)
ou (2,3,2,3)
ou (23,2,3)
, para que você produza 4
. Se não puder ser escrito dessa maneira, você deverá imprimir 0
.
Um número primo como 019
ou 00000037
é um primo válido para esse problema.
Casos de teste:
5 -> 1
55 -> 1
3593 -> 4 (359 and 3, or 3 and 593, or 3 and 59 and 3, or 3593)
3079 -> 2 (3 and 079, or 3079)
119 -> 0
5730000037 -> 7 (5,7,3,000003,7, 5,7,3,0000037, 5,73,000003,7, 5,73,0000037, 5,73000003,7, 5,7,30000037, 5730000037)
0-> undefined (you do not have to handle this case)
Isso é código-golfe , então a resposta mais curta em bytes em cada idioma vence!
Edit: agora eu sei por que devo usar a sandbox na próxima vez
code-golf
math
primes
set-partitions
fraudado
fonte
fonte
Respostas:
Haskell ,
9689 bytes5 bytes salvos graças ao teste de primalidade de H.PWiz
Experimente online!
Explicação
A primeira coisa que se faz é criar uma função de teste primo
usando o teorema de Wilsonusando a definição de primo.Então comece a definir
f
. A primeira coisa que pensei quando vi esse problema foi usar a programação dinâmica. No entanto, a programação dinâmica custa bytes, portanto, isso usa um algoritmo de "programação psuedo-dinâmica". Enquanto na programação dinâmica você armazenaria um gráfico Acyclic Directed na memória aqui, apenas usamos recursão e recalculamos cada nó sempre que necessário. Perde todos os benefícios de tempo da programação dinâmica, mas esse é o código-golfe para quem se importa. (ainda melhor do que a pesquisa por força bruta)O algoritmo é o seguinte: construímos um gráfico acíclico direcionado, L , em que cada nó representa uma substring do número. Em particular, L i representa os últimos dígitos i da nossa entrada (vamos chamá-la de n ).
Definimos L 0 para ter um valor de 1 e o outro valor em L para ter a soma de cada L j, de modo que j <i e a substring de n de i a j sejam primos.
Ou em uma fórmula:
Em seguida, retornar o valor na maior maior índice de L . ( L k onde k é o número de dígitos de n )
fonte
Geléia , 8 bytes
Experimente online!
-1 byte graças a Leaky Nun
-1 byte graças a Dennis
Explicação
fonte
Brachylog , 10 bytes
Experimente online!
Primeiro
ṫ
converte a entrada em uma string.{…}ᶜ
Conta o número de saídas possíveis para…
.Dentro
{…}
da saída deṫ
é alimentado para~c
. A saída desse predicado satisfaz que, quando concatenada, é igual à entrada. Isso é alimentadoịᵐ
, o que especifica que sua saída é a entrada com cada sequência convertida em um número inteiro.ṗᵐ
especifica que sua entrada consiste em números primosfonte
{~cṗᵐ}ᶜ
. Isso é realmente lento porque~c
em números inteiros trabalha com aritmética de restrição, mas em teoria funciona.Pitão , 13 bytes
Suíte de teste.
fonte
Python 2 ,
1059591 bytesIsso é muito lento.
Experimente online!
fonte
Python 2 , 161 bytes
Experimente online!
A função
g
cria as partições recursivamente (recebe uma string como entrada, mas gera uma lista de listas de entradas). A maior parte do código restante é apenas para implementar 'isd
a prime?'.fonte
Gaia , 12 bytes
Experimente online!
fonte
Limpo ,
199141131 bytesExperimente online!
fonte
J ,
6564 bytesExperimente online!
fonte
Pitão, 12 bytes
Recebe a entrada como um número inteiro, produz
True
ouFalse
Experimente online!
fonte