Kim tự tháp Sum của số nguyên tố


24

Cho một số N, thử thách là lấy tổng số kim tự tháp của số nguyên tố N. Để làm rõ mọi thứ, đây là một ví dụ:

Input: 4

Chúng tôi sẽ liệt kê các 4số nguyên tố đầu tiên , và sau đó tính tổng của chúng. Sau đó, chúng tôi sẽ tính tổng của các khoản tiền, v.v.

  2
    > 5
  3     > 13
    > 8      > 33
  5     > 20
    > 12
  7

Bạn có thể thấy rằng kết quả cuối cùng là 33 . Đây là một ví dụ khác, với N = 8:

   2
     >   5
   3       >  13
     >   8       >  33
   5       >  20       >  83
     >  12       >  50       > 205
   7       >  30       > 122       > 495
     >  18       >  72       > 290       > 1169
  11       >  42       > 168       > 674
     >  24       >  96       > 384
  13       >  54       > 216
     >  30       > 120
  17       >  66
     >  36
  19

Bạn có thể thấy rằng kết quả cuối cùng là 1169 .

Đây là một ví dụ khác với N lẻ, N = 3:

 2
   > 5
 3     > 13
   > 8
 5

Điều này cho phép chúng tôi 13 như kết quả

Nhiệm vụ của bạn là viết một chương trình hoặc một hàm, lấy một số nguyên lớn hơn 0 và đưa ra kết quả cuối cùng.

Dưới đây là một số kết quả kiểm tra:

1:  2
2:  5
3:  13
4:  33
5:  83
6:  205
7:  495
8:  1169
9:  2707
10: 6169
11: 13889
12: 30993
13: 68701
14: 151469
15: 332349
16: 725837
17: 1577751
18: 3413221
19: 7349029
20: 15751187
21: 33616925
22: 71475193
23: 151466705
24: 320072415
25: 674721797
26: 1419327223
27: 2979993519
28: 6245693407
29: 13068049163
30: 27297614797
31: 56929779663
32: 118543624847
33: 246475746269
34: 511766428817
35: 1061264813321
36: 2198298700845
37: 4548996804811
38: 9405003164065
39: 19429190057417
40: 40107799133677
41: 82736199371081
42: 170553108953473
43: 351333736092089
44: 723224546040181
45: 1487710742395387
46: 3058157261678325
47: 6282142186547177
48: 12896743408107403
49: 26460652594917673
50: 54262186256186881
51: 111224391050741687
52: 227896496141836195
53: 466805185374509003
54: 955904519939662217
55: 1956988697590280537
56: 4005572366722212927
57: 8196803221276230093
58: 16769645303734608963
59: 34300013739423719561
60: 70136585692535099353
61: 143371352962891226373
62: 292978031452308375001
63: 598482012866917021541
64: 1222083126601616763473
65: 2494459637841415902073
66: 5089478703050176444803
67: 10379794709536133386939
68: 21160351440305258275579
69: 43119914481530819445497
70: 87833066190052490228187
71: 178841897161848754603319
72: 364014682565128163812791
73: 740654046243174781813209
74: 1506496270380756958474835
75: 3063280375436290387756263
76: 6227039507615221644290617
77: 12655020557561801933128885
78: 25712267089927372837530869
79: 52230425385198423845305957
80: 106076955379202815098486497
81: 215397386589448754140867649
82: 437308717912632286770415395
83: 887706233370396897803709611
84: 1801721089699452657985592689
85: 3656329898231436156162865559
86: 7418972676822310377574227797
87: 15051599987013574096449515927
88: 30532404546282900804722616529
89: 61926565462373271494414919017
90: 125582269494835615524470915169
91: 254631689768733901573206365479
92: 516210444730946464864091626473
93: 1046330617753410129672316234861
94: 2120493010460433691014704829565
95: 4296639990460140795780826898943
96: 8704509990931940668688755806845
97: 17631229933967301681217551193565
98: 35706243541395815998303171050377
99: 72298621492552303967009812018997

Đây là , vì vậy số byte ngắn nhất sẽ thắng!


1
Được xuất ra số tiền trong một danh sách một phần tử (ví dụ như [1169]cho 8) chấp nhận được?
Mego

@Mego Có, miễn là kết quả cuối cùng
Adnan

Chúng tôi phải hỗ trợ tất cả các trường hợp thử nghiệm lên đến 99? Nhiều ngôn ngữ (ví dụ JavaScript) không thể tính cao đến mức đó mà không làm mất độ chính xác.
Sản xuất ETH

1
@ETHproductions Chỉ tối đa 27, có kết quả cao nhất thấp hơn 2 ^ 32 - 1 (giá trị int tối đa không dấu)
Adnan

Câu trả lời:




10

Chồn 0,14 , 17 byte

n[i3M$i1-i6M*+]N.

Hãy thử nó ở đâykiểm tra tất cả các trường hợp thử nghiệm ở đây .

Giải trình

n                    Take number from input (N)
 [                   Open for loop that repeats N times
  i                  Loop counter (n)
   3M                Pop n and push nth prime (where 2 is the 0th prime)
     $i1-            Max iterations - 1 (which is N-1)
         i           Loop counter (n)
          6M         Pop n,k and push kCn (binomial)
            *+       Multiply and add
              ]      Close for loop
               N.    Output as number and stop.

Về cơ bản, tôi sử dụng thuật toán tương tự như một số câu trả lời trước đó sử dụng hệ số nhị thức. Bất cứ khi nào bạn thấy một kim tự tháp số như vậy được thêm vào, tam giác của Pascal sẽ là điều đầu tiên bạn nghĩ đến. Tôi không thấy rằng bất kỳ câu trả lời nào khác đã giải thích lý do tại sao điều này hoạt động, vì vậy tôi sẽ làm điều đó.

Giải thích THÊM

2
  > [2,3]
3         > [2,3,3,5]
  > [3,5]             > [2,3,3,3,5,5,5,7]
5         > [3,5,5,7]
  > [5,7]
7

Như bạn có thể thấy, các số nguyên tố 2,3,5,7xuất hiện 1,3,3,1lần trong kết quả cuối cùng. Hãy thay đổi bố cục một chút.

_ _ _ 7
_ _ 5
_ 3
2

Số lần 3sẽ đóng góp vào kết quả cuối cùng giống như số đường dẫn từ 3góc trên bên trái, chỉ di chuyển lên và sang trái . Ở đây, có ba đường dẫn như vậy cho 3:

_    _    _ _
_    _ _    _
_ 3    3    3

Lưu ý rằng tôi có thể đảo ngược hướng mà không mất tính tổng quát. Vì vậy, tôi muốn biết có bao nhiêu con đường từ góc trên bên trái đến mỗi vị trí dọc theo cạnh lởm chởm. Tôi có thể đếm chúng như vậy ...

1 1 1 1 1 . . .
1 2 3 4
1 3 6
1 4   .
1       .
.         .
.
.

Với mỗi số trong tam giác này, nếu nó là đơn vị X từ bên trái và đơn vị Y từ đầu, thì số ở vị trí đó là

nhập mô tả hình ảnh ở đây

Mặc dù vậy, cách tôi sử dụng nó X+Y = Nlà không đổi và Xnằm trong khoảng từ 0 đến N, đi dọc theo một đường chéo. Tôi nhân mỗi hệ số với số nguyên tố tương ứng và sau đó cộng tất cả lên.

Xem bài viết Wikipedia về tam giác của Pascal để biết thêm về điều này.


8
Tôi thấy phần giải thích khá hay +1
Adnan

7

JavaScript ES7 107

Lạm dụng giới hạn cố định ở 27 - thật sự nhàm chán khi tìm các số nguyên tố.

n=>eval("t=2;for(p=[for(v of'012242424626424662642646842')t-=-v];--n;)p=p.slice(0,n).map((v,i)=>v+p[i+1])")

Kiểm tra đoạn mã (sử dụng khả năng hiểu mảng, nó sẽ chỉ hoạt động trong Firefox)

F=n=>eval("t=2;for(p=[for(v of'012242424626424662642646842')t-=-v];--n;)p=p.slice(0,n).map((v,i)=>v+p[i+1])")

// Less golfed

Q=n=>{
  t=2;
  // Note: the golfed version will return the last computed value, that is p if the loop is entered, else t=2
  p=[for(v of '012242424626424662642646842') t-=-v] // build the array of first 27 primes in p
  while(--n) p = p.slice(0,n).map((v,i)=>v+p[i+1])  
  return p
}  

//TEST
console.log=x=>O.innerHTML+=x+'\n'

for(i=1;i<28;i++)console.log(i+' : '+F(i))
<pre id=O></pre>


Có thể rút ngắn mã bằng cách sử dụng kiểm tra chính regex?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

6

Bình thường, 18 byte

husM.:G2tQ.f}ZPZQ0

Dùng thử trực tuyến: Trình diễn

Giải trình:

husM.:G2tQ.f}ZPZQ0   implicit: Q = input number
          .f    Q0   find the first Q numbers Z >= 0, which satisfy
            }ZPZ        Z appears in the prime factorization of Z
                     this gives the first Q prime numbers
 u      tQ           assign this list to G and repeat the following Q-1 times:
    .:G2               create all subarrays of length 2
  sM                   sum them up and update G
h                    take the first element (=result) and print

Cũng 18:s*V.cLtQUQ.f}ZPZQ0
Sp3000

@ Sp3000 Oh wow, điều này rất giống với câu trả lời của tôi - nhưng tôi đã không nhìn vào bình luận của bạn.
orlp


5

Bình thường, 16 byte

s*V.cLtQQ.f}ZPZQ

Thực sự rất đơn giản:

s*V          ; Dot product of
  .cLtQQ     ; the binomial coefficients for n
  .f}ZPZQ    ; and the first n prime numbers.

4

Haskell, 74 byte

import Data.Numbers.Primes
f n=([]:iterate(zipWith(+)=<<tail)primes)!!n!!0

Ví dụ sử dụng:

*Main> map f [1..12]
[2,5,13,33,83,205,495,1169,2707,6169,13889,30993]

Cách thức hoạt động: liên tục tính toán các tổng hàng xóm của tất cả các số nguyên tố. Đi đầu của nlần lặp thứ.

[2,3,5,7,11,13,17,19,23,29,...]             -- plain primes (and 1st iteration)
[5,8,12,18,24,30,36,42,52,60,...]           -- 2nd iteration of neighbor sums
[13,20,30,42,54,66,78,94,112,128,...]       -- 3rd iteration
[33,50,72,96,120,144,172,206,240,274,...]
...

Vì toán tử chỉ mục !!là không dựa trên, tôi đang chuẩn bị một danh sách trống để tránh phải sử dụng !!(n-1).


4

Matlab, 76 byte

Cảm ơn David vì đã tiết kiệm rất nhiều byte!

n=input('');x=primes(103);
for s=2:n,x=conv(x,[1 1]);end
disp(num2str(x(n)))

Phiên bản cũ, 98 byte

n=input('');m=1;x=[];while nnz(x)<n
m=m+1;x=primes(m);end
for s=2:n,x=conv(x,[1 1]);end
disp(x(n))

Việc xsử dụng x=primes(103);tiết kiệm một số byte, vì bạn chỉ cần truy cập N=27(và không thành vấn đề nếu xcó nhiều mục hơn bạn cần). convlà một ý tưởng tuyệt vời mặc dù!
David

@David Cảm ơn! Tôi chưa từng thấy thử thách chỉ lên tới 27
Luis Mendo

3

JavaScript (ES6), 121 byte

n=>eval(`for(p=[],c=0,x=1;c<n;s?p[c++]=x:0)for(s=i=++x;--i>1;)x%i?0:s=0;for(;--c;p=s)for(i=c,s=[];i;)s[c-i]=p[i]+p[--i]`)

Giải trình

Hầu hết các kích thước đến từ việc tìm các số nguyên tố.

n=>
  eval(`                   // eval used to enable for loops without {} or return

    // Get primes up to n
    for(                   // loop from range 2 to n
      p=[],                // p = primes
      c=0,                 // c = count of primes
      x=1;                 // x = current number to check for primality
      c<n;
      s?p[c++]=x:0         // add the number to the primes if it has no divisors
    )
      for(                 // loop from range 2 to x to check for divisors
        s=                 // s = true if x is a prime
          i=++x;
        --i>1;
      )
        x%i?0:s=0;         // check if x has a divisor

    // Sum primes
    for(;--c;p=s)          // while the new pyramid has pairs to sum
      for(i=c,s=[];i;)     // loop through each pair of the pyramid
        s[c-i]=p[i]+p[--i] // push the sum of the pair to the new pyramid s
  `)                       // implicit: return the final sum

Kiểm tra



2

Nghiêm túc, 23 byte

,r`P`M;lD`;pX@dXZ'Σ£M`n

Đưa ra kết quả dưới dạng danh sách có độ dài 1: 8 -> [1169]

Dùng thử trực tuyến

Giải trình:

,r`P`M    push the first n primes as a list
;lD       push 1 minus the length of the list (we'll call this k) ([2,3,5,7],3)
`...`n    call the following function k times:
    ;pX      duplicate the list, pop and discard the first element
    @dX      swap, pop and discard the last element
    Z        zip the two lists
    'Σ£      push the string "Σ" and convert to function
    M        map the function over the list

2

Toán học 73 byte

NestWhile[Plus@@@Partition[#,2,1]&,Prime@n~Table~{n,#},Length@#>1&][[1]]&

Làm thế nào nó hoạt động

Prime@n~Table~{n,#}&đưa ra một danh sách các #số nguyên tố đầu tiên .

Partition[#,2,1]&sắp xếp lại một danh sách các số, {a, b, c, d ...}như {{a,b}, {b,c}, {c,d}...}}.

Plus@@@rồi trở về {a+b, b+c, c+d...}.

NestWhilebắt đầu với danh sách các #số nguyên tố và liên tục áp dụng Plus@@@Partition...miễn là có nhiều hơn một số trong danh sách.


NestWhile[Plus@@@Partition[#,2,1]&,Prime@n~Table~{n,#},Length@#>1&][[1]]&[4]

33


NestWhile[Plus @@@ Partition[#, 2, 1] &, Prime@n~Table~{n, #}, Length@# > 1 &][[1]] &[5]

83


Mất khoảng 1/5 giây để giải quyết 1000 số nguyên tố đầu tiên.

NestWhile[Plus @@@ Partition[#, 2, 1] &, Prime@n~Table~{n, #}, 
 Length@# > 1 &][[1]] &[10^3] // AbsoluteTiming

{0.185611, 1917231113909474354152581359443368948301825453723617274940459548079399 7849439430405641625002631859205971635284844253657654843025188471660669 0868945436580032828177831204066809442374364181056590286849530757875874 9185665854180901580438781223737728559484382552514103542932932981340942 3918431043908415228663677}


1

Python 2, 159 byte

m=int(input())
q=[]
x=2
while len(q)<m:
 if not any([x%g<1 for g in q]):q+=[x]
 x+=1
for i in range(m-1):
 for p in q:q+=[q[1]+q[0]];q.pop(0)
 print(q.pop())
print q

1
Có lẽ tôi đang thiếu một cái gì đó ... nhưng tại sao printlệnh bên trong vòng lặp? Bạn không muốn in chỉ một lần, vào cuối?
mathmandan

1

Dải ngân hà 1.4.8 , 26 25 byte

Câu trả lời này không cạnh tranh. Một số thao tác được tạo sau khi câu hỏi này được đăng (nhưng không nhất thiết cho thử thách này).

'E&{~F§{G}:y1ba?{_^_}};!

Tôi đã có thể loại bỏ một byte sau khi đọc qua các bình luận. Đầu ra là một danh sách đơn yếu tố.


Giải trình

'                        #  read input from the command line
 E                       #  push a list of the first N primes
  &{~                }   #  while loop
     F                   #  push the sum of TOS elements i.e. [A, B, C] => [[A,B], [B,C]]
      §{ }               #  mapping
        G                #  sum i.e. [1, 2, 3] => 6
          :              #  duplicate the TOS
           y             #  push the length of the TOS to the stack
            1            #  push 1 to the stack
             b           #  evaluate equality of the TOS and STOS
              a          #  logical not
               ?{_ _}    #  if-else statement
                  ^      #  pop the TOS
                     ;   #  swap the TOS and STOS
                         #  dump the TOS to the stack
                      !  #  output the TOS

Sử dụng

python3 milkyway.py <path-to-code> -i <input-integer>

1

Ceylon, 169 byte

alias I=>Integer;I s(I*l)=>l.size<2then(l[0]else 0)else s(*l.paired.map((I[2]i)=>i[0]+i[1]));I p(I n)=>s(*loop(2)(1.plus).filter((c)=>!(2:c-2).any((d)=>c%d<1)).take(n));

Điều này xác định hai hàm - stính tổng kim tự tháp của một chuỗi các số nguyên, trong khi pgọi hàm này trên chuỗi các nsố nguyên tố đầu tiên .

Hình như khoảng một nửa kích thước đang tìm các nsố nguyên tố đầu tiên , nửa còn lại đang tính tổng kim tự tháp.

Đây là một phiên bản được định dạng / nhận xét:

// Sum pyramid of primes
//
// Question:  http://codegolf.stackexchange.com/q/65822/2338
// My answer: http://codegolf.stackexchange.com/a/65879/2338

alias I => Integer;

// Calculate the pyramid sum of some sequence.
I s(I* l) =>
        // If less than two elements ...
        l.size < 2
        // then use the first (only element), or 0 if no such.
        then (l[0] else 0)
        // otherwise,
        else s(*
               // take the iterable of pairs of consecutive elements,
               l.paired
               // and add each of them together.
                .map((I[2] i) => i[0] + i[1])
               // then apply s (recursively) on the result.
               );

// Calculate the pyramid sum of the first n primes.
I p(I n) => s(*
              // the infinite sequence of integers, starting with 2.
              loop(2)(1.plus)
              // filter by primality (using trial division)
              .filter((c) => !(2 : c-2)
                              .any((d) => c%d < 1))
              // then take the first n elements
              .take(n)
              // then apply s on the result.
             );

@FlagAsSpam xong ... xin lỗi, bằng cách nào đó tôi đã quên điều đó.
Paŭlo Ebermann 7/12/2015

1

Thạch , 7 byte

ÆN€+ƝƬṀ

Hãy thử trực tuyến!

Ban đầu tôi đã viết một câu trả lời Brachylog 1<|~lṗᵐ≠≜{s₂ᶠ+ᵐ}ⁱ~g, nhưng khi nó ra đến 19 byte tôi quyết định rằng có lẽ tôi nên thử một ngôn ngữ khác.

      Ṁ    The largest value from
     Ƭ     every stage of repeatedly
   +       adding
    Ɲ      adjacent values, starting with
ÆN         nth prime
  €        mapped over the input.

Rõ ràng, ánh xạ qua một số coi nó là phạm vi từ 1 đến bao gồm chính nó và các số nguyên sắp xếp lớn hơn danh sách hoặc bất cứ thứ gì ''.


1

APL (NARS), 41 ký tự, 82 byte

{1=≢⍵:↑⍵⋄∇+/¨¯1↓⍵,¨1⌽⍵}∘{⍵↑v/⍨0πv←⍳1+⍵×⍵}

Trong đầu vào nếu một người muốn sử dụng số lớn phải nhập loại number_x là 47x. Có thể có điều gì đó không ổn: tôi ở đây viết rằng n số nguyên tố nằm trong tập 1..n ^ 2 Kiểm tra:

  h←{1=≢⍵:↑⍵⋄∇+/¨¯1↓⍵,¨1⌽⍵}∘{⍵↑v/⍨0πv←⍳1+⍵×⍵}
  h 1
2
  h 2
5
  h 9
2707
  h 24
320072415
  h 47x
6282142186547177 
  h 99x
72298621492552303967009812018997 
  h 200x
433205808657246411262213593770934980590715995899633306941417373

1

Perl 6 , 52 byte

{grep(&is-prime,1..*)[^$_],{[|$_]Z+.skip}...1& &say}

Hãy thử trực tuyến!

Khối mã ẩn danh nhận một đối số và in ra một danh sách một thành phần có chứa kết quả.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.