Bir sayının ardışık asal sayıların toplamı yol sayısı


15

1'den büyük bir tam sayı verildiğinde, bir veya daha fazla ardışık primerin toplamı olarak ifade edilebileceği yolların sayısını çıktılayın.

Summandların sırası önemli değil. Toplam, tek bir sayıdan oluşabilir (bu nedenle, herhangi bir asal için çıktı en az 1 olacaktır).

Bu . Standart kurallar geçerlidir.

Bkz Bu OEIS wiki'yi sekansının kendisinin de dahil olmak üzere ilgili bilgileri ve dizileri için OEIS A054845 .

Test senaryoları

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

Yanıtlar:



8

R , 95 bayt

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}

Çevrimiçi deneyin!

  • 34421'i destekleyen çözümümde devrim yaratan @Giuseppe sayesinde -24 bayt!

1
Bu, asal sayılara ulaşmanın zekice bir yolu x!
Giuseppe


1
@Giuseppe: bu harika !! Bugün hastayım ve bunu asla düşünemezdim ... ll upvote;)
digEmAll

1
@ngm 34421'in önemi nedir?? Ve @digEmAll, umrumda değil; Art arda toplamları almak için cumsumilk birkaç öğeyi kullanma ve ayarlama konusunda hiçbir fikrim yoktu 0. Başbakan golf sadece bana son test durumda çalışma almaya çalışıyordu ve ben sadece daha kısa olduğunu lucked outer! Yeterince fazla temsilcim var (en azından uygun destek gerekliliklerini elde edene kadar) ve her zaman daha fazla R golfçüsünün daha fazla görünürlük elde etmesine yardımcı olmaktan mutluluk duyuyorum!
Giuseppe

1
@Giuseppe 34421, ardışık primerlerin tam olarak 6 şekilde toplandığı en küçük sayıdır (bkz. Oeis.org/A054859 ). Bu sınama için gönderilen çözümlerin çoğu zamanın (TIO'da) veya bu test vakası için belleğin bitmesine neden olur. Her ne kadar Java yanıtı sıradaki bir sonraki tamsayıyı da (7 için) almış olsa da, 8 için değil.
ngm


4

JavaScript (ES6), 92 bayt

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)

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

EZqPYTRYsG=z

MATL Online'da deneyin

İlk E(2 ile çarp), birincil giriş için, later Ys( cumsum) sonucunun , matrisin sıfırlanmış bölümünde (böylece sayımla karışıklık) kendini tekrarlayan giriş asalının olmamasını sağlar.

Açıklama:

                % 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
Asal ve üçgen bölümlü Toeplitz matrisi, çok güzel!
Luis Mendo

4

Brachylog , 14 9 bayt

{⟦ṗˢs+?}ᶜ

Çevrimiçi deneyin!
Çoklu test örnekleri

(@Kroppeb sayesinde -5 tam bayt!)

Açıklama:

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

Döngünün ⟦ṗˢiçinde hesaplayarak golf oynayabilirsiniz . Bu {⟦ṗˢs+;?=}ᶜTest paketini aldım : Çevrimiçi deneyin!
Kroppeb

Gerçekleştirmek Ben ;?=tarafından yerine ?ve almak {⟦ṗˢs+?}ᶜ(9 bayt)
Kroppeb

@Kroppeb Elbette! Bu da çok daha zarif bir cevap. Teşekkür ederim.
sundar - Monica'yı geri

3

Retina 0.8.2 , 68 bayt

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

Çevrimiçi deneyin! Bağlantı daha hızlı test senaryoları içerir. Açıklama:

m)

Satırlı modda nerede bütün komut dosyasını çalıştırın ^ve $her satırda maç.

.+
$*_$&$*

Önce _s'yi sonra s'yi kullanarak iki kez tekliye dönüştürün 1.

_
$`__¶

_2n+1

A`^(__+)\1+$

Aralıktaki tüm bileşik sayıları silin.

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

__1n


3

Kabuk , 9 8 bayt

Mr.Xcoder sayesinde -1 bayt ( ¹bunun yerine adlandırılmış argüman kullanın S)!

#¹ṁ∫ṫ↑İp

Çevrimiçi deneyin!

açıklama

#¹ṁ∫ṫ↑İ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

Tam bir program olarak, #¹ṁ∫ṫ↑İp1 bayt tasarruf etmelisiniz.
Bay Xcoder

3

MATL , 16 bayt

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

MATL Online'da deneyin!

açıklama

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

Temiz , 100 98 bayt

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]

Çevrimiçi deneyin!

$ :: Int -> IntAşağıda açıklandığı gibi çalışan işlevi tanımlar :

$ 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
    ]

(Açıklama daha eski ancak mantıksal olarak aynı sürüm içindir)


1
Özel 34421. için çıktıyı almak için övgü
NGM

2

Perl 6 , 53 bayt

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

Çevrimiçi deneyin!

Üçgen azaltma işlecini iki kez kullanır. Son test durumu TIO için çok yavaş.

açıklama

{                                                   } # 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 bayt

Bundan daha kısa bir yol olmalı!

Son test durumunda ortaya çıkar.

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

Deneyin veya tüm test senaryolarını çalıştırın


açıklama

                      :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 bayt

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 sayesinde -1 bayt . @SaraJ
sayesinde -10 bayt .

Çevrimiçi deneyin.

Açıklama:

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

Temel olarak Jelly veya 05AB1E cevaplarına benzer , sadece 190 bayt daha fazla .. XD
Burada, her parça için bir karşılaştırma, sadece eğlence için eklendi (ve Java'nın neden bu kadar ayrıntılı olduğunu ve bu golf dillerinin bu kadar güçlü olduğunu görmek için):

  1. Girdiyi alın: (Jelly: 0 bayt) üstü kapalı ; (05AB1E: 0 bayt) dolaylı olarak ; (Java 10: 5 bayt)n->{}
  2. Aralıkta bir primer listesi oluşturun [2, n]: (Jelly: 2 bayt) ÆR; (05AB1E: 2 bayt) ÅP; (Java 10: 95 bayt)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. Tüm sürekli alt listeleri alın: (Jelly: 1 byte) ; (05AB1E: 1 bayt) Œ; (Java 10: 55 bayt) for(x=L.size(),i=0;i<x;)for(k=i++;k<x;)ve(int)L.get(k++);
  4. Her alt listeyi toplayın: (Jöle: 1 bayt) §; (05AB1E: 1 bayt) O; (Java 10: 9 bayt) ,sve ,s=0ves+=
  5. Girdiye eşit olanları sayın: (Jelly: 1 byte) ċ; (05AB1E: 2 bayt) QO; (Java 10: 15 bayt) ,r=0ver+=s==n?1:0
  6. Sonuç çıktısı: (Jöle: 0 bayt) dolaylı olarak ; (05AB1E: 0 bayt) dolaylı olarak ; (Java 10: 9 bayt)return r;

1
Özel 34421. için çıktıyı almak için övgü
NGM

@ngm :) Java birçok şeyde kötü olabilir, ancak performans açısından genellikle oldukça iyidir.
Kevin Cruijssen

1
Hatta 3634531. ile 218918. Times çalışır
NGM

1
@ngm Aslında 21891812.5 sn tbh'da bunu yapmak için yeterince hızlı olduğuna şaşırıyorum , 218918-2 = 218,916iç döngü içinde yinelemeler yapacağını düşünüyoruz : nher asal için yinelemeler; Her çift sayı için 1 yineleme; ve [2,p/2)her bir tek sayı için yinelemeler arasında (iki milyar iterasyona yakın), daha sonra 19518hafızadaki listeye primer ekler . Ve sonra sum([0,19518]) = 190,485,921ikinci yuvalanmış döngüde ek bir kez döngü yapacak. Toplam olarak 2.223.570.640 iterasyon kesin .
Kevin Cruijssen

@ ceilingcat Teşekkürler. @SaraJ'ın alternatif prime kontrolü ile 12 bayt daha golf yapabildik %i, menzili kontrol ettiğimiz için eksi takip ediyor [2, n], bu yüzden kontrol etmem gerekmeyecek i=1. :)
Kevin Cruijssen

1

Physica , 41 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

->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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.