Конкатенация простых чисел


26

Вызов:

Вам дана строка, содержащая только цифры. Ваша задача - вывести минимальное количество простых чисел, которые должны быть объединены для формирования строки. Если это невозможно, выведите 0.

Тестовые случаи:

Вход -> Выход:

252 -> 3
235 -> 2
92 -> 0
31149 -> 2


Могут ли быть ведущие нули?
Згарб

Да, могут быть ведущие нули.
poi830

Можем ли мы взять список цифр?
LegionMammal978

1
Что происходит, если есть ведущие нули?
Деннис

Ответы:


6

JavaScript (ES6), 123 121 120 байт

f=(s,v)=>(p=n=>--n-1?s%n&&p(n):1)(s)||[...s].map((_,i)=>!(n=i&&(a=f(s.slice(0,i)))&&(b=f(s.slice(i)))&&a+b)|n>v?0:v=n)|v

Сохраненный байт благодаря @Neil!

объяснение

Принимает одну строку в качестве ввода. Из-за метода первичной проверки (рекурсивное разделение проб) наибольшее число, которое можно безопасно проверить 13840. Некоторые числа выше этого не будут выполнены из-за превышения максимального размера стека вызовов. Это, однако, заканчивается мгновенно для каждого случая, с которым он может справиться.

f=(s,v)=>
  (p=n=>--n-1?s%n&&p(n):1)(s) // if s is prime, return 1
  ||[...s].map((_,i)=>        // else for each index in s, split s into 2
    !(n=i&&                   // v = return value (initialised to undefined)
      (a=f(s.slice(0,i)))&&
      (b=f(s.slice(i)))&&
      a+b
    )|n>v?0:v=n               // if i, a, b and n are all > 0 and !(n > v), v = n
  )|v                         // cast v to an integer and return it

// Test
var testCases = [ "252", "235", "92", "3149", "24747" ];
document.write("<pre>" + testCases.map(c => c + ": " + f(c)).join("\n"));


Это я или ты можешь измениться i?(a=...)&&(b=...)&&a+b:0на i&&(a=...)&&(b=...)&&a+b?
Нил

5

MATL , 26 24 байта

0in:"GUtZq@Z^V10ZA=a?x@.

Это займет несколько секунд для некоторых тестовых случаев.

Попробуйте онлайн!

объяснение

0       % Push 0
in:     % Take input. Generate array [1,2,...,N] where N is input length
"       % For each. In each iteration the number of used primes is increased
  GU    %   Push input. Convert to number
  tZq   %   Duplicate. Array of primes smaller than the input
  @     %   Push number of primes to bes tested in this iteration
  Z^    %   Cartesian power
  V     %   Convert to 2D array. Each row is a combination of primes
  10ZA  %   Convert each row to base 10, disregarding spaces
  =a    %   Do any of the results equal the input number? 
  ?     %   If so
    x   %     Remove the 0 that's at the bottom of the stack
    .   %     Break for each loop
        %   Implicitly end if
        % Implicitly end for each
        % Implicitly display


4

Pyth - 19 17 16 байт

lhf.AmP_sdTa./zY

Тестовый пакет .


В его более новой форме это считается 0 и 1 как простые числа. Однако до редактирования этого не произошло.
poi830

1
@ poi830 исправил это.
Maltysen

2

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


Я собирался предложить это . Большинство моих модификаций, вероятно, устарели, но другие все еще должны работать.
Деннис

@ Денис - мне нравится cгенерировать финал 0. Не так сильно увлекаюсь обильным stderr. Вы можете использовать (варианты) мой ответ в качестве основы для своего собственного, если хотите.
Тоби Спейт

2

Mathematica, 142 135 байт

Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&

Как видите, Mathematica не была создана для этой задачи. Принимает список цифр.


Вы можете использовать And@@вместо AllTrue? Должно сэкономить 4-5 байт.
CalculatorFeline

Flatten[#,1]=Join@@@#
CalculatorFeline

Хм ... выдает ошибку и неправильный ответ на 133 ... вы использовали все контрольные примеры, верно?
CalculatorFeline

@CatsAreFluffy Гольф и уточнил.
LegionMammal978
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.