숫자가 연속적인 소수의 합인 방법의 수


15

1보다 큰 정수가 주어지면 하나 이상의 연속 소수의 합으로 표현할 수있는 방법의 수를 출력하십시오.

소환의 순서는 중요하지 않습니다. 합은 단일 숫자로 구성 될 수 있습니다 (따라서 소수에 대한 출력은 1 이상임).

이것은 입니다. 표준 규칙이 적용됩니다.

시퀀스 자체 OEIS A054845를 포함한 관련 정보 및 시퀀스는 이 OEIS 위키 를 참조하십시오 .

테스트 사례

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

답변:


9

젤리 ,  6  5 바이트

Dylnan 덕분에 -1

ÆRẆ§ċ

모나 딕 링크

온라인으로 사용해보십시오! 또는 테스트 슈트를 참조하십시오(최종 테스트 사례는 TIO에서 60 초에 시간이 초과됨에 유의하십시오).

어떻게?

ÆRẆ§ċ - Link: integer, n
ÆR    - primes from 2 to n inclusive
  Ẇ   - all contiguous substrings
   §  - sum each
    ċ - count occurrences of n

2æR과 동일ÆR
dylnan

@dylnan 좋은 감사합니다!
Jonathan Allan

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}

온라인으로 사용해보십시오!

  • 기본적으로 34421을 지원하는 솔루션을 혁신 한 @Giuseppe 덕분에 -24 바이트!

1
그것이 소수까지 올라 오는 영리한 방법입니다 x!
주세페


1
@ 주세페 : 대단해! 오늘 나는 아프고 결코 생각할 수 없었을 것입니다 ... (아마도 절대 : P) 코드를 사용하는 데 기분이 좋지 않습니다 ... 새로운 답변을 게시하면 이전으로 되돌아갔습니다. ll upvote;)
digEmAll8

1
@ ngm 34421 ..의 중요성은 무엇입니까? 그리고 @digEmAll, 난 정말 상관 없어; 나는 연속 소수를 얻기 위해 cumsum처음 몇 가지 요소를 사용 하고 설정하는 것에 대한 단서가 없었습니다 0. 프라임 골프는 단지 마지막 테스트 케이스를 작동 시키려고 노력한 것입니다 outer. 나는 충분한 담당자 이상을 보유하고 있으며 (적어도 적절한 담당자 요구 사항을 얻을 때까지), 더 많은 R 골퍼가 더 많은 가시성을 확보 할 수 있도록 항상 기쁩니다!
주세페

1
@Giuseppe 34421은 정확히 6 가지 방법으로 연속 소수의 합인 가장 작은 수입니다 ( oeis.org/A054859 참조 ). 이 챌린지에 대해 게시 된 대부분의 솔루션은 해당 테스트 사례의 시간 (TIO) 또는 메모리가 부족합니다. Java 응답은 시퀀스에서 다음 정수도 얻었지만 (7의 경우) 8에는 해당되지 않습니다.
ngm


4

자바 스크립트 (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를 곱한 값 )은 소수 입력의 경우 후자 Ys( cumsum) 의 결과에 행렬의 제로 부분에서 반복되는 입력 소수 (따라서 카운트를 어지럽히 지 않음)가 없도록합니다.

설명:

                % 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 행렬, 아주 좋습니다!
Luis Mendo

4

Brachylog , 14 9 바이트

{⟦ṗˢs+?}ᶜ

온라인으로 사용해보십시오!
여러 테스트 사례

(@Kroppeb 덕분에 5 바이트 전체!)

설명:

{⟦ṗˢ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

;?=by by 를 대체 ?하고 얻을 수 있음을 {⟦ṗˢs+?}ᶜ
깨달았

@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 바이트

Mr.Xcoder 덕분에 -1 바이트 ( ¹대신에 named argument 사용 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

전체 프로그램으로 #¹ṁ∫ṫ↑İp1 바이트를 저장해야합니다.
Mr. Xcoder

3

MATL , 16 바이트

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

MATL Online에서 사용해보십시오!

설명

:"        % 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

펄 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

apt, 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

자바 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;}

@ceilingcat 덕분에 -1 바이트 . @SaraJ
덕분에 -10 바이트 .

온라인으로 사용해보십시오.

설명:

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

기본적으로 Jelly 또는 05AB1E 답변 과 비슷하며 190 바이트 만 더 있습니다. XD
여기에 각 부분에 대한 비교가 재미를 위해 추가되었으며 Java가 왜 그렇게 장황한 지, 이러한 골프 언어가 강력한 이유를 알 수 있습니다.

  1. 암시 적으로 입력 : (Jelly : 0 bytes)를 취하십시오 . 암시 적으로 (05AB1E : 0 바이트) ; (자바 10 : 5 바이트)n->{}
  2. 범위 내의 소수 목록을 작성하십시오 [2, n]. (Jelly : 2 bytes) ÆR; (05AB1E : 2 바이트)ÅP ; (자바 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. 모든 연속 하위 목록을 가져옵니다. (Jelly : 1 byte) ; (05AB1E : 1 바이트) Œ; (자바 10:55 바이트)for(x=L.size(),i=0;i<x;)for(k=i++;k<x;)(int)L.get(k++);
  4. 각 하위 목록을 합산하십시오 : (Jelly : 1 byte) §; (05AB1E : 1 바이트) O; (Java 10 : 9 바이트) ,s,s=0s+=
  5. 입력과 같은 것을 계산하십시오 : (Jelly : 1 바이트) ċ; (05AB1E : 2 바이트) QO; (자바 10:15 바이트),r=0r+=s==n?1:0
  6. 결과를 다음과 같이 출력합니다 : (Jelly : 0 bytes) 암시 적으로 ; 암시 적으로 (05AB1E : 0 바이트) ; (자바 10 : 9 바이트)return r;

1
34421에 대한 결과를 얻기위한 특별 추천.
ngm

@ngm :) Java는 여러 가지로 나쁠 수 있지만 성능면에서는 일반적으로 좋습니다.
Kevin Cruijssen

1
218918에서도 작동합니다. 3634531로 시간 초과.
ngm

1
@ngm 실제로 내부 루프 내부에서 반복을 218918수행한다는 점을 고려할 때 여전히 12.5 초 tbh에서 충분히 빠르다는 것에 놀랐습니다 . 모든 소수에 대한 반복; 모든 짝수에 대해 1 회 반복; 그리고 모든 홀수 (약 20 억 반복)에 대한 반복 사이 에 메모리의 목록에 소수를 추가합니다 . 그런 다음 두 번째 중첩 루프에서 추가 시간을 반복합니다. 총 2,223,570,640 반복이 정확 합니다. 218918-2 = 218,916n[2,p/2)19518sum([0,19518]) = 190,485,921
Kevin Cruijssen

@ceilingcat 감사합니다. @SaraJ 의 대체 프라임 체크로 12 바이트 더 골프를 %i 면서 범위 내에서 체크하고 있기 때문에 후행을 뺀 [2, n]것이므로 확인할 필요가 없습니다 i=1. :)
Kevin Cruijssen '12

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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.