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 en unario, generando una línea con una b
para cada primo y una terminando a
al final de la línea (para que printf
tenga un token con el que trabajar).
La prueba de primalidad es factor $n | grep -q ': \w*$'
, que determina si el número tiene exactamente un factor primo.
Particionamos recursivamente la entrada; Si la mitad izquierda es primo, filtramos los resultados de la mitad derecha agregando uno a cada valor. La devolución a
de una entrada de longitud cero finaliza la recursión.
Finalmente, tomamos todos los resultados y los clasificamos para encontrar el más corto (ignorando cualquiera que no tenga el valor a
de indicar éxito); debemos eliminar dos (para el insertado a
y para la nueva línea), luego contar los caracteres para dar el resultado.
Pruebas
$ 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
Agregué 111
a las pruebas para mostrar que 1
se considera correctamente no primo.