Tổng của (nhiều nhất) 5 số nguyên tố


16

Terence Tao gần đây đã chứng minh một dạng phỏng đoán yếu của Goldbach! Hãy khai thác nó!

Cho một số nguyên lẻ n > 1, viết ndưới dạng tổng của tối đa 5 số nguyên tố. Lấy đầu vào theo cách bạn thích và đưa ra đầu ra theo cách bạn thích. Ví dụ,

def g(o):
    for l in prime_range(o+1):
        if l == o:
            return l,
        for d in prime_range(l+1):
            for b in prime_range(d+1):
                if l+d+b == o:
                    return l,d,b
                for c in prime_range(b+1):
                    for h in prime_range(c+1):
                        if l+d+b+c+h == o:
                            return l,d,b,c,h

là mã Sage lấy một số nguyên làm đầu vào và trả về danh sách các số nguyên làm đầu ra có tổng n. Theo định lý của Tao, điều này sẽ luôn chấm dứt!

Đầu vào

Một số nguyên lẻ n. Bạn quyết định làm thế nào để lấy đầu vào, nhưng nếu nó lạ, hãy giải thích nó.

Đầu ra

Khá cởi mở. Trả về một danh sách. In một chuỗi. Đưa tôi một, một vài, hoặc tất cả. Để crap nằm xung quanh trên ngăn xếp (GS, Piet, v.v.) hoặc trong một khối bộ nhớ liên tiếp (có thể tiếp cận) (BF, v.v.) theo cách có thể dự đoán được. Đối với những trường hợp sau này, giải thích đầu ra. Trong mọi trường hợp, những gì bạn trả về / in / whathaveyou phải là một biểu diễn đơn giản của một phân vùng nthành các số nguyên tố có ít hơn 6 phần.

Chấm điểm

Đây là mã golf, số byte nhỏ nhất sẽ thắng.

Tặng kem! nếu từ 'goldbach' xuất hiện như một phần tiếp theo (không nhất thiết phải liên tiếp; chỉ theo thứ tự. Trường hợp không quan trọng) của chương trình của bạn trừ 8 điểm. Mã ở trên là một ví dụ về điều này.


Số đầu tiên cần kiểm tra, số nguyên lẻ> 1, là 3. Tổng các số nguyên tố nào tạo ra 3? Tôi không thấy rõ ràng?
người dùng không xác định

"Rõ ràng" là ngôn ngữ. Vì 3 là số nguyên tố, nên tổng của 1 số nguyên tố. Phản hồi thông minh: Conway sẽ nói rằng 3 là tổng 7 + (-1) + (-1) + (-1) + (-1).
gian hàng

Một giá trị không phải là một tổng. Tôi sẽ đề nghị chỉ bắt đầu với các giá trị> 3 thay vì giới thiệu các giá trị âm.
người dùng không xác định

1
Một giá trị duy nhất là một tổng. Nhận xét về các giá trị tiêu cực là một nhận xét thông minh, như đã lưu ý rõ ràng.
gian hàng

2
"chuỗi con (không nhất thiết phải liên tiếp; chỉ theo thứ tự ...)" Đây được gọi là chuỗi con .
Joey Adams

Câu trả lời:


3

J , 29

(#~y=+/@>),{5$<0,p:i._1 p:>:y

Giả sử đầu vào là trong y. Giá trị của biểu thức là danh sách các hộp danh sách gồm 5 số nguyên tố hoặc 0 tổng y.

   y =. 16
   (# ~ y = + / @>), {5 $ <0, p: i._1 p:>: y
+ ---------- + ---------- + ---------- + ---------- + ----- ----- + --------- + ---------- + ---------- + ---------- + - --------- + ---------- + ---------- + ---------- + ------- - + --------- + ---------- + ---------- + ---------- + ---- ------ + ---------- + ---------- + ---------- + --------- + ------...
| 0 0 0 3 13 | 0 0 0 5 11 | 0 0 0 11 5 | 0 0 0 13 3 | 0 0 2 3 11 | 0 0 2 7 7 | 0 0 2 11 3 | 0 0 3 0 13 | 0 0 3 2 11 | 0 0 3 11 2 | 0 0 3 13 0 | 0 0 5 0 11 | 0 0 5 11 0 | 0 0 7 2 7 | 0 0 7 7 2 | 0 0 11 0 5 | 0 0 11 2 3 | 0 0 11 3 2 | 0 0 11 5 0 | 0 0 13 0 3 | 0 0 13 3 0 | 0 2 0 3 11 | 0 2 0 7 7 | 0 2 0 ...
+ ---------- + ---------- + ---------- + ---------- + ----- ----- + --------- + ---------- + ---------- + ---------- + - --------- + ---------- + ---------- + ---------- + ------- - + --------- + ---------- + ---------- + ---------- + ---- ------ + ---------- + ---------- + ---------- + --------- + ------...

Không đủ chữ cái để kiếm bất kỳ điểm thưởng.


độc đáo thực hiện! Tôi nghĩ rằng không có ngôn ngữ có thể đánh bại J tại thử thách này.
Cristian Lupascu

8

Toán học , 38

IntegerPartitions[n,5,Prime~Array~n,1]

Không thể tìm thấy cách thông qua WA ...
Tiến sĩ belisarius

1
Tôi đã có quyền truy cập vào Mathicala và nó hoạt động trên tất cả các đầu vào mà tôi đã cung cấp cho nó.
gian hàng

hãy tưởng tượng nếu IntegerPartitionshàm được đặt tên Goldbach...;)
Cristian Lupascu

@ w0lf thậm chí như vậy, nó sẽ nhiều hơn 1 lần so với J> _>
Rixius

@Rixius không, nó sẽ đạt 21 điểm trong trường hợp đó, ít hơn 8 so với J.
Mr.Wizard

8

C, 192-8 = 184 ký tự

Chứa "Goldbach" liên tiếp (không bao gồm dấu chấm câu) và "Tao" là tốt.
Khi tổng nhỏ hơn 5 số nguyên tố (nghĩa là luôn luôn), in số không (16 = 0+0+0+3+13)
Đọc số từ đầu vào tiêu chuẩn : echo 30 | ./prog.

#define T(x)for(x=0;x<=s;b=&x,c(++x))
G,o,l,d,*b,a;c(h)
{(*b-1?h<3:++*b)||c(*b%--h?h:++*b);}
main(s){
    scanf("%d",&s);
    T(G)T(o)T(l)T(d)T(a)o+G+l+d+a-s?0:exit(printf("%d+%d+%d+%d+%d\n",G,o,l,d,a));
}

Phiên bản cũ (179 ký tự), chỉ có thể tìm thấy tổng của 5 số nguyên tố (và do đó không thành công cho x <10):

#define T(x)for(x=2;x<s;b=&x,c(++x))
G,o,l,d,*b,a;c(h)
{h<3||c(*b%--h?h:++*b);}
main(s){
    scanf("%d",&s);
    T(G)T(o)T(l)T(d)T(a)o+G+l+d+a-s?0:exit(printf("%d+%d+%d+%d+%d\n",G,o,l,d,a));
}

Giải thích:
cđặt *bthành số nguyên tố tiếp theo (bao gồm *bchính nó nếu nó là số nguyên tố).
Txây dựng một vòng lặp for, tiến một trong các biến G,o,l,d,asang số nguyên tố tiếp theo.
Trong tất cả các vòng lặp, chúng tôi kiểm tra xem tổng có khớp hay không, và in và thoát nếu có.


4
G,o,l,d,*b,a;c(h)là một liên lạc tốt đẹp!
Joel Cornett

điều này không thành công cho n = 3
boothby

@boothby, bạn nói đúng, nó chỉ tìm thấy một số trong 5 số nguyên tố chứ không phải ít hơn.
ugoren

user_unknown có một giải pháp tốt cho việc này: xem xét số nguyên tố bằng 0 vì lợi ích của tổng
boothby

@boothby, đã thay đổi. Chi phí cho tôi nhiều hơn tôi muốn, bởi vì logic của tôi tự nhiên coi 1 là số nguyên tố và khi bắt đầu bằng 0 tôi cần bỏ qua nó.
ugoren

6

Brachylog , 9 byte

~+.ṗᵐl≤5∧

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

~+.          Output (.) should sum to the input,
   ṗᵐ        consist of all primes,
     l≤5     and have length ≤ 5.
        ∧    (Don't unify that 5 with the implicit output variable.)

1
Bạn có thể lưu một byte bằng cách thay đổi thứ tự . Cũng lưu ý rằng câu hỏi nói rằng đầu vào là số lẻ
H.PWiz

1
@ H.PWiz Và một cái khác như thế này .
Erik the Outgolfer

4

Ruby 138 124 117 - 8 = 109

require'mathn'
def g(o,l=[])
p l if l.inject(:+)==o#db
(l.last||1..o).each{|d|d.prime?and g(o,l+[d])if l.count<5}
end

Gọi với g(<number>). Đầu ra mẫu:

[2, 2, 2, 2, 19]
[2, 2, 3, 3, 17]
[2, 2, 3, 7, 13]
...

Kiểm tra: http://ideone.com/rua7A


1
Chỉ cần đặt #dbvào dòng 3 là đủ cho phần thưởng: bạn sẽ nhận được achtừ .each.
Ilmari Karonen

1
"Định dạng đầu ra cố định" nghĩa là gì? Điều này hoàn toàn mở - bạn có thể kết hợp các không gian nếu bạn muốn.
gian hàng

@IlmariKaronen Mẹo tuyệt vời! Tôi đã chỉnh sửa bài viết của mình. Cảm ơn!
Cristian Lupascu

@boothby Cảm ơn bạn đã nhận thấy điều này. Tôi thấy đầu ra mẫu và nghĩ rằng đó là một yêu cầu. Tôi thấy bây giờ định dạng đầu ra là mở. Cập nhật.
Cristian Lupascu

2

PHP 143 122 - 8 = 114

EDIT: Đã lưu một vài byte trên đầu ra, loại bỏ lệnh gọi hàm rõ ràng.

<?function g($o,$l,$d,$b){for(;$o>=$b=gmp_intval(gmp_nextprime(+$b));)echo$b^$o?$l<4&&g($o-$b,$l+1,"$d$b,",$b-1):"$d$b
";}

Chưa được kiểm soát:

<?
function g($o,$l,$d,$b){
  for(;$o>=$b=gmp_intval(gmp_nextprime(+$b));)
    echo$b^$o?$l<4&&g($o-$b,$l+1,"$d$b,",$b-1):"$d$b
";}

Gọi với @g(<number>);đầu ra mẫu cho n=27:

2,2,2,2,19
2,2,3,3,17
2,2,3,7,13
2,2,5,5,13
2,2,5,7,11
2,2,23
2,3,3,19
2,3,5,17
2,3,11,11
2,5,7,13
2,7,7,11
3,3,3,5,13
3,3,3,7,11
3,3,5,5,11
3,3,7,7,7
3,5,5,7,7
3,5,19
3,7,17
3,11,13
5,5,5,5,7
5,5,17
5,11,11
7,7,13

Hmm ... mã gửi của bạn dường như không hoạt động. Bạn đã có một vài thứ thú vị ~õ;}ở cuối ...
boothby

~ õ (chr (245)) là viết tắt của "\ n". Trong trường hợp này, nó không thực sự cần thiết. Tôi sẽ loại bỏ nó khỏi giải pháp.
primo

mã không thành công cho n = 3.
gian hàng

@boothby Tôi không tin điều đó. Với n = 3, nó xuất ra số 3, và sau đó chấm dứt (vì không có tổng các số nguyên tố nào khác là 3). Bạn đang mong đợi nó sản xuất cái gì?
primo

Tôi không thấy bất kỳ đầu ra. Hoạt động tốt trong 5, 7, 9, 11. ideone.com/cMNR8 Ngoài ra, lưu ý rằng bạn có thể tự do xác định hàm và không gọi nó.
gian hàng

2

Ruby 2 -rmathn, 66 byte - 8 = 58

g=->o,*l{o==l.reduce(:+)?p(l):l[5]||b=Prime.each(o){|x|g[o,*l,x]}}

Dựa nhiều vào câu trả lời của GolfWolf, nhưng từ năm 6 tuổi, tôi sẽ đăng bài của riêng mình thay vì nitpicking. Những tiến bộ trong công nghệ bao gồm lambda mạnh mẽ, sử dụng reducethay vì injectmiễn phí d, một cách dừng lại ngắn gọn tại các phân vùng 5 và Prime.each(o)lặp đi lặp lại trên tất cả các số nguyên tố nhỏ hơn hoặc bằng o(và cung cấp một ach). Có lẽ trong 6 năm nữa sẽ có cách sử dụng tốt hơn b.


1

Scala 137-8 = 129

def g(o:Int)={val l=0+:(2 to o).filterNot(d=>(2 to d-1).exists(d%_==0))
for(b<-l;a<-l;c<-l;h<-l;e<-l;if(b+a+c+h+e==o))yield{(b,a,c,h,e)}}

Sau gợi ý của boothby: đã loại bỏ một lệnh gọi hàm, cho phép hiểu 3 là tổng của 3 và không có gì, loại bỏ đầu vào khỏi đầu ra - lưu thêm 20 ký tự khác.

Phần thưởng nhấn mạnh:

def g (o : Int) = {val l = 0 + :( 2 đến o) .filterNot ( d => (2 đến d-1) .exists (d% _ == 0)) cho (b <-l ; a <-l; c <-l; h <-l; e <-l; if (b + a + c + h + e == o)) mang lại {( b, a, c, h , e) }}

Yêu cầu và kết quả:

println (l(17)) 
Vector((17,0,0,2,2,13), (17,0,0,2,13,2), (17,0,0,3,3,11), ...

Đầu ra lặp lại x cho mỗi danh sách để tổng hợp lên x, và sau đó hiển thị 5 triệu hồi. 0 cho thiếu summand, tức là 2 + 2 + 13.

Ung dung:

// see if there is some x, such that o%x is 0.
def dividable (o:Int) = (2 to o-1).exists (x=> o % x == 0)

// +: is a kind of cons-operator for Vectors
def primelist (d: Int) = {
  val s = 0 +: (2 to d).filterNot (b => dividable (b))
  for (a <- s;
    b <- s;
    c <- s;
    h <- s;
    e <- s;
    if (a+b+c+h+e == d)) yield {(a,b,c,h,e)}
}

Tôi không quen thuộc với Scala. Làm thế nào để được gọi là này? Bạn có thể gửi một ví dụ làm việc lên ideone.com ?
gian hàng

Bạn nên thực hiện nó trên đơn giản-scala vì nó cần ít nồi hơi hơn IDEone. Đối với lời mời, println (l(17))ví dụ. Đầu ra trông giống như Vector((17,0,0,2,2,13), (17,0,0,2,13,2), (17,0,0,3,3,11)và có nghĩa là: 17 sẽ được tính tổng và các triệu hồi là 0, 0 (không có nghĩa là không có triệu hồi) 2 + 2 + 13. Liên kết đến scala đơn giản đã được ghi nhận trên meta
người dùng không xác định

hay quá cảm ơn! Có vẻ như bạn có thể lưu một vài ký tự: yield{(d,a,...-> yield{(a,...và bằng cách đóng gói định nghĩa gvào filterNot(...). Tuy nhiên. Điều này không thành công cho n = 3.
gian hàng

Làm (2 to d)thay (2 to d-1), nhưng tôi không đồng ý rằng 3 là tổng của 3. Nếu bạn tổng hợp một Set, vâng, nó có thể là một tập rỗng, hoặc một Set gồm một số. Nhưng việc xây dựng một số tiền dẫn đến n - tôi chỉ thay đổi mã của mình dưới sự phản kháng.
người dùng không xác định

Cao quý như sự từ chối cố chấp của bạn để rút ngắn câu trả lời của bạn có thể, nguyên nhân của bạn bị hủy hoại bởi chính câu trả lời của bạn. Bạn đang trả lại danh sách có tổng là 3. Một như vậy nên được (0,0,0,0,3).
gian hàng

1

MuPAD 113 - 8 = 105

g:=[0,ithprime(i)$i=1..n]:f:=_for_in:f(l,g,f(d,g,f(b,g,f(a,g,f(c,g,if l+d+b+a+c=n then print(l,d,b,a,c)end)))))

Phiên bản này cũng sẽ in tất cả các hoán vị của mọi giải pháp:

0, 0, 0, 0, 7
0, 0, 0, 2, 5
0, 0, 0, 5, 2
0, 0, 0, 7, 0
0, 0, 2, 0, 5
...

Và vâng, nó tạo ra một danh sách quá dài g. Ai quan tâm? :-)

Phiên bản bị đánh cắp:

g:=[0].select([$1..n],isprime):
for l in g do
  for d in g do
    for b in g do
      for a in g do
        for c in g do
          if l+d+b+a+c=n then print(l,d,b,a,c); end;
        end
      end
    end
  end
end

Tôi không có quyền truy cập vào mupad - ai đó có thể kiểm tra xem cái này có hoạt động không?
gian hàng

1

Jelly , 19 byte (nhưng rất chậm - muốn có lời khuyên)

ÆR;0x5Œ!ḣ€5¹©S€i³ị®

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

ÆR;0x5Œ!ḣ€5¹©€i³ị®     main link, takes one argument N
ÆR                     get all the primes less than N
  ;0x5                 add zero, and then repeat the entire list 5 times
      Œ!               get all the permutations of this huge list (takes a long time!)
        ḣ€5            for each permutation, just take the first 5 numbers
                       (this gives us all possible length-5 combinations of the primes plus zero, with some repeats)
           ¹©          save that list to register
              S€       take the sum of every permutation in the list...
                i³     and find the index of our first argument N in that list of sums
                  ị®   then recall our list of permutations, and get the correct permutation at that index!

Nếu bạn có bất kỳ ý tưởng nào để làm cho nó nhanh hơn và ngắn hơn, xin vui lòng cho tôi biết!


1
12 byte . ṗЀ5tạo ra tất cả các kết hợp các số nguyên tố có độ dài từ một đến năm. S=¥kiểm tra xem tổng của một trong các phần tử có bằng với đối số của chuỗi không và Ðfchỉ giữ lại các phần tử đó. chỉ có ở đó để đưa tất cả các danh sách các số nguyên tố ở cùng cấp vào danh sách
dylnan

Bây giờ 10 byte kể từ Ƈđã được thêm làm bí danh cho ЀÐf
dylnan
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.