一个数是连续质数之和的方式数


15

给定一个大于1的整数,输出将其表示为一个或多个连续素数之和的方式数。

补数的顺序无关紧要。一个和可以包含一个数字(因此任何质数的输出至少为1。)

这是。适用标准规则。

有关相关信息和序列,包括序列本身的OEIS A054845,请参阅此OEIS Wiki

测试用例

2 => 1
3 => 1
4 => 0
5 => 2
6 => 0
7 => 1
8 => 1
10 => 1
36 => 2
41 => 3
42 => 1
43 => 1
44 => 0
311 => 5
1151 => 4
34421 => 6

Answers:



8

R,95字节

function(x,P=2){for(i in 2:x)P=c(P,i[all(i%%P)])
for(i in 1:x){F=F+sum(cumsum(P)==x)
P[i]=0}
F}

在线尝试!

  • -24个字节感谢@Giuseppe,他从根本上革新了我的解决方案,同时也支持34421!

1
这是最高达素数的聪明方法x
朱塞佩


1
@Giuseppe:太好了!今天我生病了,我永远无法想到...(也许永远不会:P)我在使用您的代码时感到难受...如果您发布新答案,我将恢复为以前的状态。 ll upvote;)
digEmAll

1
@ngm 34421 ..的意义是什么?@digEmAll,我真的不介意。我真的不知道如何使用cumsum和设置前几个元素0来获取连续的素数和。一流的高尔夫只是我试图使最后一个测试用例正常工作的原因,我只是幸运地发现它比短outer!我的代表人数绰绰有余(至少在我们达到适当的代表要求之前),并且我总是很乐意帮助更多的R高尔夫球手获得更多的知名度!
朱塞佩

1
@Giuseppe 34421是最小的数字,它是正好以6种方式连续的质数之和(请参阅oeis.org/A054859)。针对该挑战发布的大多数解决方案在该测试用例上都没有时间(在TIO上)或内存不足。尽管Java答案甚至也获得了序列中的下一个整数(对于7),但对于8也没有
。– ngm


4

JavaScript(ES6),92个字节

n=>(a=[],k=1,g=s=>k>n?0:!s+g(s>0?s-(p=d=>k%--d?p(d):d<2&&a.push(k)&&k)(++k):s+a.shift()))(n)

在线尝试!

已评论

n => (                          // n = input
  a = [],                       // a[] = array holding the list of consecutive primes
  k = 1,                        // k = current number to test
  g = s =>                      // g = recursive function taking s = n - sum(a)
    k > n ?                     //   if k is greater than n:
      0                         //     stop recursion
    :                           //   else:
      !s +                      //     increment the final result if s = 0
      g(                        //     add the result of a recursive call to g():
        s > 0 ?                 //       if s is positive:
          s - (                 //         subtract from s the result of p():
            p = d => k % --d ?  //           p() = recursive helper function looking
              p(d)              //                 for the highest divisor d of k,
            :                   //                 starting with d = k - 1
              d < 2 &&          //           if d is less than 2 (i.e. k is prime):
              a.push(k) &&      //             append k to a[]
              k                 //             and return k (else: return false)
          )(++k)                //         increment k and call p(k)
        :                       //       else:
          s + a.shift()         //         remove the first entry from a[]
                                //         and add it to s
      )                         //     end of recursive call
  )(n)                          // initial call to g() with s = n

4

MATL,15 12字节

EZqPYTRYsG=z

在MATL Online上尝试

初始值E(乘以2)可确保对于素数输入,后一个Yscumsum)的结果不会使输入素数在矩阵的归零部分中重复自身(因此会弄乱计数)。

说明:

                % Implicit input, say 5
E               % Double the input
 Zq             % Get list of primes upto (and including) that
                %  Stack: [2 3 5 7]
   P            % Reverse that list
    YT          % Toeplitz matrix of that
                %  Stack: [7 5 3 2
                           5 7 5 3
                           3 5 7 5
                           2 3 5 7]
      R         % `triu` - upper triangular portion of matrix
                %  Stack: [7 5 3 2
                           0 7 5 3
                           0 0 7 5
                           0 0 0 7]
       Ys       % Cumulative sum along each column
                %  Stack: [7  5  3  2
                           7 12  8  5
                           7 12 15 10
                           7 12 15 17]


         G=     % Compare against input - 1s where equal, 0s where not
           z    % Count the number of non-zeros

1
素数和三角形部分的Toeplitz矩阵,非常好!
路易斯·门多

4

Brachylog14 9字节

{⟦ṗˢs+?}ᶜ

在线尝试!
多个测试案例

(-5个完整字节,多亏@Kroppeb!)

说明:

{⟦ṗˢs+?}ᶜ
{      }ᶜ     Count the number of ways this predicate can succeed:
 ⟦            Range from 0 to input
  ṗˢ          Select only the prime numbers
    s         The list of prime numbers has a substring (contiguous subset)
     +        Whose sum
      ?       Is the input

您可以通过⟦ṗˢ循环内进行计算来打高尔夫球。我有这个{⟦ṗˢs+;?=}ᶜ测试套件:在线试用!
Kroppeb

意识到我可以代替;?=?,并得到{⟦ṗˢs+?}ᶜ(9个字节)
Kroppeb

@Kroppeb当然!这也是一个更为优雅的答案。谢谢。
sundar-恢复莫妮卡

3

视网膜0.8.2,68字节

.+
$*_$&$*
_
$`__¶
A`^(__+)\1+$
m)&`^((_)|¶)+¶[_¶]*(?<-2>1)+$(?(2)1)

在线尝试!链接包括更快的测试用例。说明:

m)

在多行模式下运行整个脚本,^$在每行上进行匹配。

.+
$*_$&$*

两次转换为一元,首先使用_s,然后使用1s。

_
$`__¶

_2ñ+1个

A`^(__+)\1+$

删除范围内的所有复合数字。

&`^((_)|¶)+¶[_¶]*(?<-2>1)+$(?(2)1)

__1ñ


3

外壳9 8字节

-1字节感谢Mr.Xcoder(使用命名参数¹代替S)!

#¹ṁ∫ṫ↑İp

在线尝试!

说明

#¹ṁ∫ṫ↑İp  -- example input: 3
#¹        -- count the occurrences of 3 in
      İp  -- | primes: [2,3,5,7..]
     ↑    -- | take 3: [2,3,5]
    ṫ     -- | tails: [[2,3,5],[3,5],[5]]
  ṁ       -- | map and flatten
   ∫      -- | | cumulative sums
          -- | : [2,5,10,3,8,5]
          -- : 1

作为完整程序,#¹ṁ∫ṫ↑İp应保存1个字节。
Xcoder先生18年

3

MATL,16字节

:"GZq@:g2&Y+G=vs

在MATL在线上尝试一下!

说明

:"        % Input (implicit): n. For each k in [1 2 ... n]
  G       %   Push n
  Zq      %   Primes up to that
  @:g     %   Push vector of k ones
  2&Y+    %   Convolution, removing the edges
  G=      %   True for entries that equal n
  v       %   Concatenate vertically with previous results
  s       %   Sum
          % End (implicit). Display (implicit)


2

干净100 98字节

import StdEnv,StdLib
$n=sum[1\\z<-inits[i\\i<-[2..n]|all(\j=i/j*j<i)[2..i-1]],s<-tails z|sum s==n]

在线尝试!

定义功能$ :: Int -> Int,如下所述:

$ n                              // the function $ of n is
    = sum [                      // the sum of
        1                        // 1, for every 
        \\ z <- inits [          // prefix z of 
            i                    // i, for every
            \\ i <- [2..n]       // integer i between 2 and n
            | and [              // where every
                i/j*j < i        // j does not divide i
                \\ j <- [2..i-1] // for every j between 2 and i-1
            ]
        ]
        , s <- tails z           // ... and suffix s of the prefix z
        | sum s == n             // where the sum of the suffix is equal to n
    ]

(说明适用于较旧但逻辑上相同的版本)


1
获得34421输出的特别奖杯。–
ngm

2

Perl 6、53字节

{+grep $_,map {|[\+] $_},[\R,] grep *.is-prime,2..$_}

在线尝试!

两次使用三角形归约运算符。对于TIO,最后一个测试用例太慢了。

说明

{                                                   } # Anonymous block
                               grep *.is-prime,2..$_  # List of primes up to n
                         [\R,]  # All sublists (2) (3 2) (5 3 2) (7 5 3 2) ...
          map {|[\+] $_},  # Partial sums for each, flattened
 +grep $_,  # Count number of occurrences

2

Japt,17个字节

有比这更短的方法!

掌握最后一个测试用例。

õ fj x@ZãYÄ x@¶Xx

尝试运行所有测试用例


说明

                      :Implicit input of integer U
õ                     :Range [1,U]
  fj                  :Filter primes
      @               :Map each integer at 0-based index Y in array Z
         YÄ           :  Y+1
       Zã             :  Subsections of Z of that length
             @        :  Map each array X
               Xx     :    Reduce by addition
              ¶       :    Check for equality with U
            x         :  Reduce by addition
     x                :Reduce by addition

2

Java的10,195个 194 184 182字节

n->{var L=new java.util.Stack();int i=1,k,x,s,r=0;for(;i++<n;){for(k=1;i%++k>0;);if(k==i)L.add(i);}for(x=L.size(),i=0;i<x;)for(k=i++,s=0;k<x;r+=s==n?1:0)s+=(int)L.get(k++);return r;}

-1个字节感谢@ceilingcat
-10个字节感谢@SaraJ

在线尝试。

说明:

n->{                // Method with integer as both parameter and return-type
  var L=new java.util.Stack();
                    //  List of primes, starting empty
  int i=1,k,x,s,    //  Temp integers
      r=0;          //  Result-counter, starting at 0
  for(;i++<n;){     //  Loop `i` in the range [2, `n`]
    for(k=1;        //   Set `k` to 1
        i%++k>0;);  //   Inner loop which increases `k` by 1 before every iteration,
                    //   and continues as long as `i` is not divisible by `k`
    if(k==i)        //   If `k` is now still the same as `i`; a.k.a. if `i` is a prime:
      L.add(i);}    //    Add the prime to the List
  for(x=L.size(),   //  Get the amount of primes in the List
      i=0;i<x;)     //  Loop `i` in the range [0, amount_of_primes)
    for(s=0,        //   (Re)set the sum to 0
        k=i++;k<x;  //   Inner loop `k` in the range [`i`, amount_of_primes)
        r+=s==n?    //     After every iteration, if the sum is equal to the input:
            1       //      Increase the result-counter by 1
           :        //     Else:
            0)      //      Leave the result-counter the same by adding 0
      s+=(int)L.get(k++);
                    //    Add the next prime (at index `k`) to the sum
  return r;}        //  And finally return the result-counter

它基本上与Jelly05AB1E的答案类似,仅相差 190字节。
这里,每个部位的比较,增加只是为了好玩(和明白为什么Java是如此冗长,而这些高尔夫球场的语言都是那么强大):

  1. 隐式地输入:(果冻:0字节);(05AB1E:0个字节)隐式 ; (Java 10:5个字节)n->{}
  2. 创建以下范围内的素数列表[2, n]:(果冻:2个字节)ÆR;(05AB1E:2个字节)ÅP; (Java 10:95个字节)var L=new java.util.Stack();int i=1,k,x,s,r=0;for(;i++<n;){for(k=1;i%++k>0;);if(k==i)L.add(i);}
  3. 获取所有连续子列表:(果冻:1个字节);(05AB1E:1个字节)Œ; (爪哇10:55个字节)for(x=L.size(),i=0;i<x;)for(k=i++;k<x;)(int)L.get(k++);
  4. 汇总每个子列表:(果冻:1个字节)§;(05AB1E:1个字节)O; (爪哇10:9字节),s,s=0s+=
  5. 计数等于输入的那些值:(Jelly:1个字节)ċ;(05AB1E:2个字节)QO; (Java 10:15个字节),r=0r+=s==n?1:0
  6. 隐式输出结果:(果冻:0字节);(05AB1E:0个字节)隐式 ; (Java 10:9个字节)return r;

1
获得34421输出的特别奖杯。–
ngm

@ngm :) Java在很多方面可能都不尽人意,但在性能方面通常是相当不错的。
凯文·克鲁伊森

1
甚至可以在218918上使用。超时为3634531。–
ngm

1
@ngm我实际上感到惊讶,它仍然足够快,可以218918在12.5秒tbh内完成,考虑到它将218918-2 = 218,916在内部循环内进行n迭代:每个素数的迭代;每个偶数重复1次;在[2,p/2)每个奇数次迭代之间的某个位置(接近20亿次迭代),之后它将质19518数添加到内存中的列表。然后,它将sum([0,19518]) = 190,485,921在第二个嵌套循环中再循环一次。再循环一次确切地说,总共进行了2,223,570,640次迭代
凯文·克鲁伊森

@ceilingcat谢谢。使用@SaraJ的替代质校验可以再打 12个字节,%i因为我们在范围内进行校验[2, n],所以减去了拖尾,所以我不需要校验i=1。:)
Kevin Cruijssen

1

物理,41字节

->x:Count[Sum@Sublists[PrimeQ$$[…x]];x]

在线尝试!

怎么运行的

->x:Count[Sum@Sublists[PrimeQ$$[…x]];x] // Full program.
->x:            // Define an anonymous function with parameter x.
    […x]        // Range [0 ... x] (inclusive).
        $$      // Filter-keep those that...
  PrimeQ        // Are prime.
 Sublists[...]  // Get all their sublists.
Sum@            // Then sum each sublist.
Count[...;x]    // Count the number of times x occurs in the result.

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.