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 b
untuk setiap prime dan berakhir a
pada 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 111
ke tes untuk menunjukkan yang 1
benar dianggap non-prime.