是Pascal Prime吗?


18

众所周知,奇数质数会在Pascal三角形中出现两次。但是,并非所有在Pascal三角形中正好出现两次的数字都是质数。我们称这些数字为Pascal素数。

帕斯卡素数是在帕斯卡三角形中正好出现两次的复合数。前几个Pascal素数是

4, 8, 9, 12, 14, 16, 18, ...

您的挑战是取一个正整数n作为输入,并输出true或false,这取决于n是否为Pascal素数。这是代码高尔夫球,所以最短的程序胜出!



2
如果不是Pascal素数,我们可以输出True,如果不是Pascal则输出false吗?
Caird coinheringaahing


@cairdcoinheringaahing不,必须在给定的要求中。
Simply Beautiful Art

我很惊讶没有人在帕斯卡发布答案。如果有时间的话(如果可以找到旧的Pascal编译器),我会的。
manassehkatz-恢复莫妮卡

Answers:


10

Wolfram语言(Mathematica),45字节

CompositeQ@#&&Binomial~Array~{#-1,#}~FreeQ~#&

在线尝试!

每个复合数字n在行n上恰好出现两次,以后不能出现。因此,Pascal素数的条件是它们根本不出现在前n-1行中。

据我所知,这比检查它是否在前n行中准确地出现了两次并能够!PrimeQ代替使用要短。


4

Python 2,93字节

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个字节。



@ovs:o太聪明了!谢谢。
Xcoder先生18年

4

果冻11 10 9字节

谢谢:

  • 马丁·恩德-1字节!(另一种方法,使用(+1)避免使用n2(-2),因此整体为-1。
  • Jonathan Allan修复了错误。
  • 丹尼斯再加上-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.

最后一行的说明:

  • 正如马丁·恩德(Martin Ender)指出的那样,“ n在Pascal三角形中出现两次”等同于“ n不在第一n-1行中出现”。
  • true如果数字不是素数(即),ÆP == 0并且计数c为零,我们想返回。从中我们可以推断出这一点ÆP == c
    可以证明,如果它们相等,则它们等于0,因为:
    • ÆP 返回一个布尔值,只能为0或1。
    • 如果返回1,n则为质数,因此它不能出现在第一n-1行(即c == 0

1不是帕斯卡素数;这是事实。
乔纳森·艾伦

Ḷc€ḶFċoÆP¬我认为可以。
乔纳森·艾伦

ċ=ÆP应该管用。
丹尼斯,

仅供参考,我发现我的方法存在缺陷,并删除了它。
乔纳森·艾伦

BTW也Ḷcþ`Fċ=ÆP应该工作。
Xcoder先生18年

4

Haskell86 84字节

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+1th行中恰好出现两次,并且随后各行的所有元素只会变大,因此我们只需要检查是否nn第th行的某处即可。元素被取消资格:

any(elem n)(take(n-1)p)

现在,True对于所有出现两次以上的元素(除外1),我们需要的是有一个错误的isPrime函数返回True1

all((>0).rem n)[2..n-1]

4

APL(Dyalog)44 34 24 19字节

@Cowsquack节省了5个字节

(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳

在线尝试!

怎么样?

我们确保两者都不

-范围0.. n-1

⍳∘.! -自我的笛卡尔二项式

⊢∊-包含n

- 也没有

⊢|⍨-对n每个项目取模

2↓⍳-范围2..n-1

~0∊-不包含0(又名不可分割)


将其转换为火车(∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)的时间缩短了两个字节
Kritixi Lithos

@Cowsquack嗯,我没注意到它太短了以至于一列火车都可以容纳(从40柏特开始)。谢谢!
Uriel '18

(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳对于另外两个,我更改了素数检查算法
Kritixi Lithos,

@Cowsquack oo聪明。我从来没有看到素性变化之前
尤利尔

重新~给定(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳少一个字节。
Kritixi Lithos

2

JavaScript(Node.js)103101字节

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%nthreority有效,但实际上范围很小
l4m2


2

R,55个字节

function(n)sum(!n%%1:n)>2&!n%in%outer(1:n-1,1:n,choose)

在线尝试!

sum(!n%%1:n)>2是复合测试,outer(1:n-1,1:n,choose)计算0n-1Pascal三角形的行,因此我们确保其中n不出现。


2

05AB1E,10个字节

ÝDδcI¢IpÌQ

在线尝试!

说明

Ý            # push range [0 ... input]
 D           # duplicate
  δc         # double vectorized command binomial
    I¢       # count occurrences of input
      Ip     # check input for primality
        Ì    # add 2
         Q   # compare for equality

检查n在帕斯卡三角形的前n + 1行中正好发生两次,并且不是素数。
比较有效,因为在三角形中不会出现3次质数。





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.