Bash + coreutils, 169 158 149 byte
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
Kami menghitung secara unary, menghasilkan garis dengan satu buntuk setiap prime dan berakhir apada akhir baris (sehinggaprintf memiliki token untuk bekerja dengan).
Tes primality adalah factor $n | grep -q ': \w*$' , yang menentukan apakah angka tersebut memiliki tepat satu faktor utama.
Kami membagi input secara rekursif; jika setengah kiri adalah prima, kami menyaring hasil dari setengah kanan dengan menambahkan satu ke setiap nilai. Kembalia untuk input panjang nol akan mengakhiri rekursi.
Akhirnya, kami mengambil semua hasil dan mengurutkan untuk menemukan yang terpendek (mengabaikan semua yang tidak memiliki a indikasi keberhasilan); kita harus menghapus dua (untuk yang disisipkana dan untuk baris baru), lalu hitung karakter untuk memberikan hasilnya.
Tes
$ 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
Saya menambahkan 111ke tes untuk menunjukkan yang 1benar dianggap non-prime.