Concatenando Primes

26

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
poi830
fonte
1
Relacionados
Alex A.
Pode haver zeros à esquerda?
precisa saber é o seguinte
Sim, pode haver zeros à esquerda.
poi830
Podemos pegar uma lista de dígitos?
precisa saber é o seguinte
1
O que acontece se houver zeros à esquerda?
216 Dennis

Respostas:

6

JavaScript (ES6), 123 121 120 bytes

f=(s,v)=>(p=n=>--n-1?s%n&&p(n):1)(s)||[...s].map((_,i)=>!(n=i&&(a=f(s.slice(0,i)))&&(b=f(s.slice(i)))&&a+b)|n>v?0:v=n)|v

Guardou 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.

f=(s,v)=>
  (p=n=>--n-1?s%n&&p(n):1)(s) // if s is prime, return 1
  ||[...s].map((_,i)=>        // else for each index in s, split s into 2
    !(n=i&&                   // v = return value (initialised to undefined)
      (a=f(s.slice(0,i)))&&
      (b=f(s.slice(i)))&&
      a+b
    )|n>v?0:v=n               // if i, a, b and n are all > 0 and !(n > v), v = n
  )|v                         // cast v to an integer and return it

// Test
var testCases = [ "252", "235", "92", "3149", "24747" ];
document.write("<pre>" + testCases.map(c => c + ": " + f(c)).join("\n"));

user81655
fonte
Sou eu ou você pode mudar i?(a=...)&&(b=...)&&a+b:0para i&&(a=...)&&(b=...)&&a+b?
Neil
5

MATL , 26 24 bytes

0in:"GUtZq@Z^V10ZA=a?x@.

Demora alguns segundos para alguns dos casos de teste.

Experimente online!

Explicação

0       % Push 0
in:     % Take input. Generate array [1,2,...,N] where N is input length
"       % For each. In each iteration the number of used primes is increased
  GU    %   Push input. Convert to number
  tZq   %   Duplicate. Array of primes smaller than the input
  @     %   Push number of primes to bes tested in this iteration
  Z^    %   Cartesian power
  V     %   Convert to 2D array. Each row is a combination of primes
  10ZA  %   Convert each row to base 10, disregarding spaces
  =a    %   Do any of the results equal the input number? 
  ?     %   If so
    x   %     Remove the 0 that's at the bottom of the stack
    .   %     Break for each loop
        %   Implicitly end if
        % Implicitly end for each
        % Implicitly display
Luis Mendo
fonte
4

Pitão - 19 17 16 bytes

lhf.AmP_sdTa./zY

Conjunto de Teste .

Maltysen
fonte
Na sua forma mais recente, este conta 0 e 1 como números primos. No entanto, antes da edição, isso não aconteceu.
poi830
1
@ poi830 consertou.
Maltysen 12/04
2

Bash + coreutils, 169 158 149 bytes

c()
{
test $1||echo a
for i in `seq ${#1}`
do factor ${1::$i}|grep -q ': \w*$'&&printf b%s\\n `c ${1:$i}`
done
}
c $1|sort|sed '/a/!d;s/..//;q'|wc -c

Contamos em unário, produzindo uma linha com uma bpara cada primo e uma terminação ano final da linha (para que printftenha 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 apara 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 aindicar sucesso); devemos excluir dois (para a inserida ae para a nova linha) e, em seguida, contar os caracteres para fornecer o resultado.

Testes

$ for i in 252 235 92 31149 111; do echo "$i:"$'\t'"$(./77623.sh $i)"; done
252:    3
235:    2
92:     0
31149:  2
111:    0

Eu adicionei 111aos testes para mostrar que 1é considerado corretamente não primo.

Toby Speight
fonte
Eu ia sugerir isso . A maioria das minhas modificações provavelmente está obsoleta agora, mas outras ainda devem funcionar.
Dennis
@ Dennis - eu gosto cde gerar a final 0. 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.
Toby Speight
2

Mathematica, 142 135 bytes

Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&

Como você pode ver, o Mathematica não foi criado para esta tarefa. Leva uma lista de dígitos.

LegionMammal978
fonte
Você pode usar em And@@vez de AllTrue? Deve salvar 4-5 bytes.
CalculatorFeline
Flatten[#,1]=Join@@@#
CalculatorFeline
Hum ... dá erro e resposta errada em 133 ... você usou todos os casos de teste, certo?
CalculatorFeline
@CatsAreFluffy Golfed e esclarecido.
LegionMammal978