Bash + coreutils, 169 158 149 bayt
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
b
Her bir asıl için bir satırlık bir satır çıktısı ve satırın a
sonunda sonlanan (böylece printf
üzerinde çalışacak bir belirteç olan) birleşik olarak sayıyoruz .
Asallık testi, factor $n | grep -q ': \w*$'
sayının tam olarak bir tane asal çarpanın olup olmadığını belirler.
Girdileri yinelemeli olarak bölümlere ayırırız; sol yarının asal olması durumunda, sağ yarının sonuçlarını her bir değere bir tane ekleyerek filtreleriz. a
Sıfır uzunluklu bir giriş için geri dönme özyinelemeyi sonlandırır.
Son olarak, tüm sonuçları alırız ve en kısa olanı bulmak için sıralarız ( a
başarıyı gösterecek hiçbir şeyi göz ardı ederek ); ikisini a
silmemiz gerekir (eklenen ve yeni satır için), ardından sonucu vermek için karakterleri sayın.
Testler
$ 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
111
Testlerin, 1
asal olmayan bir şekilde doğru olarak kabul edildiğini göstermek için ekledim .