分解为素数


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)

这是,因此每种语言中以字节为单位的最短答案都胜出!

编辑:现在我知道为什么我下次应该使用沙箱


Answers:


7

Haskell96 89字节

H.PWiz的素数测试节省了5个字节

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以及nij的子串为质数。

或公式中:

式

然后,我们以L的最大最大索引返回该值。(L k,其中kn的位数)


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

Brachylog,10个字节

ṫ{~cịᵐṗᵐ}ᶜ

在线尝试!

首先将输入转换为字符串。{…}ᶜ计算可能的输出数量

{…}的输出中输入~c。该谓词的输出满足以下条件:串联时,等于输入。此被送入ịᵐ,它指定它的输出是它与每个字符串输入转换成一个整数。ṗᵐ指定其输入由质数组成


1
您无需转换为字符串再返回,这7个字节就足够了:{~cṗᵐ}ᶜ。这确实很慢,因为~c在整数上使用约束算术可以工作,但是从理论上讲它可以工作。
Fatalize

@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以递归方式创建分区(它将字符串作为输入,但输出整数列表的列表)。其余大多数代码仅用于实现“是d素数?”。



1

干净199个 141 131字节

import StdEnv
?n|n<2=0|and[gcd n i<2\\i<-[2..n-1]]=1=0
@n#s=toString n
#f=toInt o(%)s
= ?n+sum[@(f(0,i))\\i<-[0..n]| ?(f(i+1,n))>0]

在线尝试!



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.