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
правильно вважається непростим.