Розкладається на праймери


14

Враховуючи ціле число n, поверніть кількість способів, з яких n можна записати як список простих чисел. Наприклад, 2323можна записати як (2,3,23), (23,23)або (2,3,2,3)або (23,2,3), щоб ви вивели 4. Якщо це неможливо записати таким чином, слід вивести 0.

Просте число, таке як 019або 00000037є дійсним простим числом для цієї проблеми.

Тестові приклади:

5 -> 1
55 -> 1 
3593 -> 4 (359 and 3, or 3 and 593, or 3 and 59 and 3, or 3593)
3079 -> 2 (3 and 079, or 3079)
119 -> 0 
5730000037 -> 7 (5,7,3,000003,7, 5,7,3,0000037, 5,73,000003,7, 5,73,0000037, 5,73000003,7, 5,7,30000037, 5730000037)
0-> undefined (you do not have to handle this case)

Це , тому найкоротша відповідь у байтах на кожній мові виграє!

Редагувати: тепер я знаю, чому я повинен використовувати пісочницю наступного разу


Відповіді:


7

Haskell , 96 89 байт

5 байт збережено завдяки тесту первинності H.PWiz

p x=[1|0<-mod x<$>[2..x]]==[1]
f[]=1
f b=sum[f$drop i b|i<-[1..length b],p$read$take i b]

Спробуйте в Інтернеті!

Пояснення

Перше, що робиться, - це створити просту функцію тесту, використовуючи теорему Вілсона, використовуючи визначення простих.

p x=[1|0<-mod x<$>[2..x]]==[1]

Потім починайте визначення f. Перше, що я подумав, побачивши цю проблему, - це використовувати динамічне програмування. Однак динамічне програмування коштує байтів, тому для цього використовується алгоритм "псуедо-динамічного програмування". Якщо в динамічному програмуванні ви зберігаєте графік спрямованого ациклічного циклу в пам'яті, ми просто використовуємо рекурсію і перераховуємо кожен вузол кожного разу, коли нам це потрібно. Він втрачає весь час переваги динамічного програмування, але це тому кому все одно. (все ж краще, ніж груба сила пошуку)

Алгоритм полягає в наступному: ми побудуємо спрямований ациклічний графік L , де кожен вузол представляє підрядку числа. Зокрема, L i являє собою останні i цифри нашого введення (давайте називати це n ).

Ми визначаємо, що L 0 має значення 1, а значення інше в L, щоб сума кожного L j була такою, що j <i і підрядок n від i до j є простим.

Або у формулі:

Формула

Потім ми повертаємо значення на найбільшому по величині індексу L . ( L k, де k - кількість цифр n )


6

Желе , 8 байт

ŒṖḌÆPẠ€S

Спробуйте в Інтернеті!

-1 байт завдяки Leaky Nun
-1 байт завдяки Dennis

Пояснення

ŒṖḌÆPẠ€S  Main Link
ŒṖ        List Partitions (automatically converts number to decimal digits)
  Ḍ       Convert back to integers (auto-vectorization)
   ÆP     Are they primes? (auto-vectorization)
     Ạ€   For each, are they all truthy (were the numbers all primes?); 1/0 for truthy/falsy
       S  Sum; gets number of truthy elements

Я помітив, що 05AB1E не може це зробити легко. Розділи здаються чудовою командою.
Чарівна восьминога урна

5

Брахілог , 10 байт

ṫ{~cịᵐṗᵐ}ᶜ

Спробуйте в Інтернеті!

Спочатку перетворює вхід у рядок. {…}ᶜПідраховує кількість можливих виходів для .

Всередині {…}вихід подається на ~c. Вихід цього предиката задовольняє, що при об'єднанні він дорівнює вхідному. Це подається в ịᵐ, який вказує, що його вихід - це введення з кожної рядки, перетвореної в ціле число. ṗᵐвказує, що його вхід складається з прайметів


1
Вам не потрібно перетворити в рядок і назад, ці 7 байт досить: {~cṗᵐ}ᶜ. Це дійсно повільно, оскільки ~cна цілих числах працює арифметика обмеження, але теоретично це працює.
Фаталізувати

@Fatalize Я думаю, що не вдається врахувати провідні нулі
H.PWiz

4

Pyth , 13 байт

lf.AmP_sdT./`

Тестовий набір.


Я так добре не знаю Pyth, але замість того, щоб фільтрувати і потім брати довжину, ви могли б зробити for_each замість фільтру, а потім суму?
HyperNeutrino

@HyperNeutrino чи це має значення?
Leaky Nun

Я не впевнений, я не тестував. Це для Jelly (можливо, через двобайтовий фільтр швидко), але я не впевнений.
HyperNeutrino

Фільтр @HyperNeutrino - це один байт ...
Leaky Nun


2

Python 2 , 161 байт

lambda n:sum(all(d>1and all(d%i>0for i in range(2,d))for d in v)for v in g(`n`))
g=lambda s:[[int(s[:i])]+t for i in range(1,len(s))for t in g(s[i:])]+[[int(s)]]

Спробуйте в Інтернеті!

Функція gстворює розділи рекурсивно (вона бере рядок як вхідний, але виводить список списків ints). Більшість коду, що залишився, саме для реалізації "є dпрем'єр?".





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.