Desafio:
Você recebe uma sequência contendo apenas dígitos. Sua tarefa é gerar o número mínimo de números primos que devem ser concatenados para formar a sequência. Se isso for impossível, produza 0
.
Casos de teste:
Entrada -> Saída:
252 -> 3
235 -> 2
92 -> 0
31149 -> 2
Respostas:
JavaScript (ES6),
123121120 bytesGuardou um byte graças a @Neil!
Explicação
Toma uma única string como entrada. Devido ao método de verificação principal (divisão de teste recursivo), o maior número que pode ser verificado com segurança é
13840
. Alguns números acima disso falharão devido ao tamanho máximo da pilha de chamadas ser excedido. No entanto, termina instantaneamente para todos os casos que pode lidar.fonte
i?(a=...)&&(b=...)&&a+b:0
parai&&(a=...)&&(b=...)&&a+b
?MATL ,
2624 bytesDemora alguns segundos para alguns dos casos de teste.
Experimente online!
Explicação
fonte
Pitão, 16 bytes
Suíte de teste
Explicação a seguir.
fonte
Pitão -
191716 bytesConjunto de Teste .
fonte
Bash + coreutils,
169158149 bytesContamos em unário, produzindo uma linha com uma
b
para cada primo e uma terminaçãoa
no final da linha (para queprintf
tenha um token para trabalhar).O teste de primalidade é
factor $n | grep -q ': \w*$'
, que determina se o número tem exatamente um fator primo.Particionamos recursivamente a entrada; se a metade esquerda for prime, filtramos os resultados da metade direita adicionando um a cada valor. Retornar
a
para uma entrada de comprimento zero encerra a recursão.Por fim, pegamos todos os resultados e classificamos para encontrar os mais curtos (ignorando os que não precisam
a
indicar sucesso); devemos excluir dois (para a inseridaa
e para a nova linha) e, em seguida, contar os caracteres para fornecer o resultado.Testes
Eu adicionei
111
aos testes para mostrar que1
é considerado corretamente não primo.fonte
c
de gerar a final0
. Não é tão interessado no copioso stderr, no entanto. Você pode usar (versões de) minha resposta como base para sua própria, se quiser.Mathematica,
142135 bytesComo você pode ver, o Mathematica não foi criado para esta tarefa. Leva uma lista de dígitos.
fonte
And@@
vez deAllTrue
? Deve salvar 4-5 bytes.Flatten[#,1]
=Join@@@#