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 b
para cada primo e uma terminação a
no final da linha (para que printf
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 inserida a
e 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 111
aos testes para mostrar que 1
é considerado corretamente não primo.