Bash + coreutils, 169 158 149 байт
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
для каждого простого числа и заканчивая a
в конце строки (так что printf
есть токен для работы).
Тест на простоту factor $n | grep -q ': \w*$'
, который определяет, имеет ли число ровно один простой множитель.
Мы рекурсивно разбиваем входные данные; если левая половина проста, мы фильтруем результаты правой половины, добавляя по одному к каждому значению. Возврат a
для ввода нулевой длины завершает рекурсию.
Наконец, мы берем все результаты и сортируем, чтобы найти самые короткие (игнорируя любые, которые не имеют, a
чтобы указать успех); мы должны удалить два (для вставленного a
и для новой строки), затем подсчитать количество символов, чтобы получить результат.
тесты
$ 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
в тесты, чтобы показать, что 1
правильно считается не простым.