众所周知,奇数质数会在Pascal三角形中出现两次。但是,并非所有在Pascal三角形中正好出现两次的数字都是质数。我们称这些数字为Pascal素数。
帕斯卡素数是在帕斯卡三角形中正好出现两次的复合数。前几个Pascal素数是
4, 8, 9, 12, 14, 16, 18, ...
您的挑战是取一个正整数n作为输入,并输出true或false,这取决于n是否为Pascal素数。这是代码高尔夫球,所以最短的程序胜出!
众所周知,奇数质数会在Pascal三角形中出现两次。但是,并非所有在Pascal三角形中正好出现两次的数字都是质数。我们称这些数字为Pascal素数。
帕斯卡素数是在帕斯卡三角形中正好出现两次的复合数。前几个Pascal素数是
4, 8, 9, 12, 14, 16, 18, ...
您的挑战是取一个正整数n作为输入,并输出true或false,这取决于n是否为Pascal素数。这是代码高尔夫球,所以最短的程序胜出!
Answers:
CompositeQ@#&&Binomial~Array~{#-1,#}~FreeQ~#&
每个复合数字n在行n上恰好出现两次,以后不能出现。因此,Pascal素数的条件是它们根本不出现在前n-1行中。
据我所知,这比检查它是否在前n行中准确地出现了两次并能够!PrimeQ
代替使用要短。
def f(n):l=[1];exec"(n in l)>=any(n%k<1for k in range(2,n))>q;l=map(sum,zip([0]+l,l+[0]));"*n
这是一个命名函数f,它通过退出代码输出,对于Pascal Primes 输出0,否则输出1。
def f(n):l=[1]; # Define a function f (arg. n) and a list l = [1].
exec"..."*n # Execute n times.
(n in l) # Boolean: "n is in l?" is greater than...
>=any(n%k<1for k in range(2,n)) # the boolean: "Is n composite?"?
>q; # If the boolean comparison returns a falsy
# result, then continue on without any difference.
# Otherwise, evaluate the other part of the
# inequality, thus performing "is greater than q".
# Since we have no variable "q", this terminates
# with exit code 1, throwing a "NameError".
l=map(sum,zip([0]+l,l+[0])); # Generate the next row in Pascal's triangle,
# By zipping l prepended with a 0 with l appended
# with a 0 and mapping sum over the result.
这基本上检查了n是否出现在Pascal三角形的前n-1行中或者它是否是素数,并且如果满足这两个条件中的任何一个,则抛出错误。
由于ovs,节省了1个字节。
谢谢:
’
(+1)避免使用n2
(-2),因此整体为-1。Ḷc€ḶFċ=ÆP
另一种方法,乔纳森·艾伦(Jonathan Allan)着。(有瑕疵)
----------- Explanation -----------
Ḷ Lowered range. [0, 1, ..., n-1]
c€Ḷ `c`ombination `€`ach with `Ḷ`owered range [0...n-1]
F Flatten.
ċ Count the number of occurences of (n) in the list.
ÆP Returns 1 if (n) is a prime, 0 otherwise.
= Check equality.
最后一行的说明:
n
在Pascal三角形中出现两次”等同于“ n
不在第一n-1
行中出现”。true
如果数字不是素数(即),ÆP == 0
并且计数c
为零,我们想返回。从中我们可以推断出这一点ÆP == c
。ÆP
返回一个布尔值,只能为0或1。n
则为质数,因此它不能出现在第一n-1
行(即c == 0
)1
不是帕斯卡素数;这是事实。
Ḷc€ḶFċoÆP¬
我认为可以。
ċ=ÆP
应该管用。
Ḷcþ`Fċ=ÆP
应该工作。
p=[]:[zipWith(+)(1:x)x++[1]|x<-p]
f n=all((>0).rem n)[2..n-1]==any(elem n)(take n p)
该函数p
递归定义退化的Pascal三角形:
[]
[1]
[2,1]
[3,3,1]
[4,6,4,1]
[5,10,10,5,1]
正如我们所看到的(在这种解决方案1
中有些特殊),每个数字n
在第n+1
th行中恰好出现两次,并且随后各行的所有元素只会变大,因此我们只需要检查是否n
在n
第th行的某处即可。元素被取消资格:
any(elem n)(take(n-1)p)
现在,True
对于所有出现两次以上的元素(除外1
),我们需要的是有一个错误的isPrime
函数返回True
给1
:
all((>0).rem n)[2..n-1]
@Cowsquack节省了5个字节
(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳
怎么样?
我们确保两者都不
⍳
-范围0
.. n-1
,
⍳∘.!
-自我的笛卡尔二项式
⊢∊
-包含n
,
⍱
- 也没有
⊢|⍨
-对n
每个项目取模
2↓⍳
-范围2
..n-1
~0∊
-不包含0
(又名不可分割)
(∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)
的时间缩短了两个字节
(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳
对于另外两个,我更改了素数检查算法
~
给定(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳
少一个字节。
n=>(r=x=>[...Array(n).keys(F=n=>n>0?n*F(n-1):1)].every(x))(i=>r(j=>F(i)/F(j)/F(i-j)-n))>r(i=>i<2|n%i)
n=>(r=x=>[...Array(n).keys(F=n=>n>0?n*F(n-1):1)].every(x))(i=>r(j=>F(i)/F(j)/F(i-j)-n))>F(n-1)**2%n
threority有效,但实际上范围很小
->n{c=!r=[1,1]
(2...n).map{|i|c|=1>n%i
[n]&r=[0,*r,0].each_cons(2).map{|a,b|a+b}}&[[n]]==[]&&c}
报废了几个字节。
f=(n,a=[1])=>n<a.length||[...'0'.repeat(n)].filter((x,i)=>n%i<1).length>1&&a.indexOf(n)<0&&f(n,[...a.map((x,i)=>x+a[i-1]||1),1])
邪恶素数检查器+50个字节:(
感谢user202729 -1个字节
a=q=[1];n=input();r=n<4;p=1
for i in range(2,n):q=a+map(sum,zip(q[1:],q))+a;r+=n in q;p*=n%i
print p+r<1
p+r
似乎是多余的...