Tính khoảng trống nguyên tố


19

Tìm số nguyên tố là một nghi thức lập trình của đoạn văn và rất thường xuyên là chương trình nghiêm túc đầu tiên mà ai đó đóng thùng (thường là với phân chia thử nghiệm).

Nhưng một mình số nguyên tố đã bị hao mòn. Một điều thú vị hơn nữa là có được những khoảng trống chính: khoảng cách rất xa giữa các số nguyên tố liên tiếp. Đây là khá hiếm và "quý giá". Một vài cặp đầu tiên và sự khác biệt của chúng là:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
...

Bố tôi thường tính toán những thứ này bằng tay cho vui lên tới 10k. Hãy xem bạn có thể nhận được mã ngắn như thế nào.

Quy tắc:

  • không có hàm dựng sẵn để kiểm tra chính, tạo số nguyên tố hoặc khoảng trống chính
  • không truy xuất http://oeis.org/A002386 hoặc tương tự (Tôi có thể ngửi thấy bạn gian lận từ xa :))
  • không có mảng được tính toán trước
  • tiếp tục in cho đến khi loại số nguyên nội bộ của bạn không thành công với bạn

Số lượng nhân vật thấp nhất sẽ thắng. +10 ký tự nếu bạn chỉ in các khoảng trống mà không có số nguyên tố.

Bạn cũng có thể hiển thị các phiên bản có chức năng dựng sẵn nếu chúng thú vị. Sáng tạo.

Làm rõ: bạn đi qua các số nguyên tố và bạn báo cáo mỗi khi bạn thấy một khoảng trống lớn hơn bất kỳ khoảng trống nào bạn đã thấy trước đó. Chẳng hạn, từ 3 đến 5, có một khoảng cách rộng 2 đơn vị. Khoảng cách giữa 5 và 7 cũng là 2, nhưng đó là tin cũ, chúng tôi không quan tâm nữa. Chỉ khi bạn thấy một khoảng cách lớn nhất mới, bạn báo cáo nó. Điều này phản ánh làm thế nào các số nguyên tố ngày càng ít đi, vì các khoảng trống ngày càng rộng hơn.


EDIT : Hầu hết các câu trả lời là tuyệt vời và xứng đáng được công nhận hơn. Tuy nhiên, cho đến nay, một mục GolfScript có 48 ký tự là ngắn nhất.


1
Trong ví dụ 3 của bạn là kết thúc của một cặp và bắt đầu của cặp tiếp theo, trong khi đây không phải là trường hợp của các số khác. Bạn muốn gì?
mmumboss

Nevermind, tôi đã nhận nó ngay bây giờ.
mmumboss

Bạn có thể muốn viết lại quy tắc của mình dưới dạng "không có hàm dựng sẵn để kiểm tra chính, tính toán nguyên tố hoặc các khoảng trống chính". Nếu không, một giải pháp rõ ràng sẽ sử dụng một hàm trả về số nguyên tố thứ n , sau đó tăng n , chạy lại hàm và tìm sự khác biệt.
dùng12205

2
À. tôi yêu OEIS
TheDoctor

Tôi có cùng nghi ngờ với @mmumboss. Bạn có thể vui lòng xplain?
Clyde Lobo

Câu trả lời:


3

GolfScript 66 59 57 49 48

[2.0{:d{;\;.{).{(1$1$%}do(}do.2$-.d>!}do].p~.}do

Mặc dù tôi gặp sự cố khi chạy nó ở đây http://golfscript.apphb.com/ (có thể trang web đó không giống như vòng lặp vô hạn?) Nhưng nó hoạt động tốt khi tôi chạy nó trên máy tính của mình với golfscript.rb. Tôi khá mới với GolfScript vì vậy điều này có thể được đánh giá thấp hơn nữa. CẬP NHẬT: Tôi không nghĩ rằng điều này có thể được đánh golf nhiều hơn nữa mà không thay đổi thuật toán bằng cách nào đó.

Một vài dòng đầu tiên được in (Nếu bạn không thích "" được in, bạn có thể thêm vào, ở phần đầu của tập lệnh, nhưng điều đó làm cho nó có tới 49 ký tự):

[2 3 1]
["" 3 5 2]
["" 7 11 4]
["" 23 29 6]
["" 89 97 8]
["" 113 127 14]
["" 523 541 18]
["" 887 907 20]
["" 1129 1151 22]
...

Ý tưởng chung về con người có thể đọc được về cách thức hoạt động của nó (một số điều hơi khác vì tôi không sử dụng ngăn xếp trong phiên bản này):

cur_prime = 2
next_prime = 2
gap = 0        

do {
    do {
        cur_prime = next_prime
        do {
            next_prime = next_prime + 1
            possible_factor = next_prime
            do {
                possible_factor = possible_factor - 1
            } while (next_prime % possible_factor > 0)
        } while (possible_factor != 1)
    } while (next_prime - cur_prime <= gap)

    gap = next_prime - cur_prime
    print [cur_prime next_prime gap]
} while (true)

11

Con trăn, 121 110 109 108 104 103 ký tự

p,n,m=[2],3,0
while 1:
 if all(n%x for x in p):
  c=n-p[0]
  if m<c:m=c;print(p[0],n,c)
  p=[n]+p
 n+=1

Lần đầu tiên tôi cố gắng trả lời ở đây, tôi hy vọng tôi đã làm đúng ... không chắc tôi thậm chí còn đếm đúng các ký tự.

Hmmm, tôi có thể lưu một ký tự khác trên bản in bằng cách hạ cấp xuống Python 2.x ...


121 ký tự, làm cho tiêu đề trở thành tiêu đề #, bạn nghiêm túc không đếm số ký tự bằng tay phải không? javascriptkit.com/script/script2/charcount.shtml
user80551

Không, tôi đã không đếm bằng tay :) Nhưng tôi đã thấy các câu trả lời khác của Python cho một số câu hỏi được làm phẳng thành một dòng theo cách giảm khoảng trắng, và thật lòng tôi không chắc liệu một dòng mới được tính là 1 hay 2 ký tự ...
Tal

1
Chúng tôi tính các dòng mới là 1 ký tự trừ khi các quy tắc của câu hỏi nêu rõ ràng khác. Chào mừng đến với PPCG!
Jonathan Van Matre

3
Chào mừng bạn Câu trả lời tốt đẹp, và nó cũng có một số chỗ để cải thiện. Ví dụ, if all(n%x>0for x in p):ngắn hơn một chút. Bạn cũng có thể lưu một số ký tự bằng cách di chuyển các câu lệnh vào cùng một dòng (ví dụ a=1;b=2;f()).
grc

1
Thay đổi mới nhất đã phá vỡ mã bằng cách không đẩy [n] lên phía trước như đã nêu.
orion

4

JavaScript, 90 85 78 74 ký tự

Mã ngắn (Trình biên dịch đóng cửa của Google - Tối ưu hóa nâng cao; một số chỉnh sửa thủ công; nhiều chỉnh sửa của @ MT0 )

for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)

Mã dài

var lastPrime = 2,
    curNumber = lastPrime,
    maxDistance = 0,
    i;

// check all numbers
while( curNumber++ ) {

  // check for primes
  i = curNumber;
  while( curNumber % --i != 0 ) {}

  // if prime, then i should be equal to one here
  if( i == 1 ) {

    // calc distance
    i=curNumber-lastPrime;

    // new hit
    if( maxDistance < i ) {
      maxDistance = i;
      console.log( lastPrime, curNumber, maxDistance );
    }

    // remember prime
    lastPrime = curNumber;
  }
}

Đầu ra

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52
31397 31469 72
...

Kiểm tra khá kém hiệu quả cho các số nguyên tố, nhưng theo cách đó nó sử dụng ít ký tự hơn.

Bài viết đầu tiên ở đây, vì vậy xin miễn cho bất kỳ sai lầm.


78 Nhân vật -for(a=b=2,c=0;b++;){for(d=b;b%--d;);1==d&&(c<b-a&&console.log(a,b,c=b-a),a=b)}
MT0

@ MT0 Cảm ơn. Không phát hiện ra những cái đó. Đã chỉnh sửa.
Sirko

Thậm chí không hiệu quả hơn nhưng 74 ký tự -for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)
MT0

3

Toán học, 114 108

Cho phép đầu ra vô hạn, mặc dù sau một thời điểm nhất định trong chuỗi, quạt sẽ quay lên và bạn bắt đầu nghi ngờ rằng CPU của mình đang chơi Freecell trong khi cố hết sức để trông có vẻ bận rộn.

p@x_:=NestWhile[#+1&,x+1,Divisors@#≠{1,#}&];m=0;q=1;While[1<2,If[p@q-q>m,Print@{q,p@q,p@q-q};m=p@q-q];q=p@q]

Mẫu đầu ra (Đây là những mẫu mà nó nhặt được trong ~ 30 giây đầu tiên):

{1,2,1}
{3,5,2}
{7,11,4}
{23,29,6}
{89,97,8}
{113,127,14}
{523,541,18}
{887,907,20}
{1129,1151,22}
{1327,1361,34}
{9551,9587,36}
{15683,15727,44}
{19609,19661,52}
{31397,31469,72}
{155921,156007,86}
{360653,360749,96}
{370261,370373,112}
{492113,492227,114}
{1349533,1349651,118}
{1357201,1357333,132}
{2010733,2010881,148}

Mã bị đánh cắp:

p@x_ := NestWhile[
   # + 1 &,
   x + 1,
   Divisors@# ≠ {1, #} &];
m = 0;
q = 1;
While[
 1 < 2,
 If[
  p@q - q > m,
  Print@{q, p@q, p@q - q}; m = p@q - q];
 q = p@q]

Nó có nhận ra không?
Đạp xe

Vâng, nó chỉ không xuất theo cách đó nhưng nó sẽ phân tích cú pháp tốt khi bạn dán mã vào sổ ghi chép. Tôi đã ghi điểm tương ứng nhưng tôi sẽ sửa lại để đơn giản hóa.
Jonathan Van Matre

có bao nhiêu ký tự nếu bạn làm sử dụng Mathematica được xây dựng-in Thủ chức năng?
Michael Stern

76. Vì toàn bộ định nghĩa p @ x_ chỉ là sự tái hiện của NextPrime, nên nó có thể được thay thế bằng p = NextPrime;
Jonathan Van Matre

3

Haskell - 122 116 114 112 110

q=[n|n<-[3..],all((>0).rem n)[2..n-1]]
d m((p,q):b)|q-p>m=print(p,q,q-p)>>d(q-p)b|q>p=d m b
main=d 0$zip(2:q)q

(Không hiệu quả) biểu thức danh sách chính bị đánh cắp từ Will Ness .

-edit- Tôi không bao giờ biết x|y=z|w=qsẽ hợp lệ.


2

MATLAB 104 89

Chỉ cần thực hiện phương pháp cơ bản bằng cách kiểm tra mọi bộ phận có thể.

a=2;g=0;for n=3:inf;b=n*(sum(mod(n,1:n)<1)<3);h=b-a;if(h>g)g=h;[a,b,h]
end;a=max(a,b);end

Đầu ra:

  2     3     1
  3     5     2
  7    11     4
 23    29     6
 89    97     8
113   127    14
523   541    18
887   907    20

Tôi đang bật octaveinfđiều này không hoạt động (và in bị hoãn lại cho đến khi vòng lặp kết thúc). Liệu MATLAB có đánh giá phạm vi lười biếng?
orion

Matlab in thời gian thực, mỗi lần lặp của vòng lặp. Khi tôi bắt đầu chương trình của mình, tôi nhận được một cảnh báo rằng chỉ số tối đa là 2147483647, và sau đó nó bắt đầu. Ngoài ra, tôi có thể thay thế inf bằng intmax, nhưng đó là ba ký tự nhiều hơn.
mmumboss

2

76 ký tự, dogelang

Chuyển đổi từ phiên bản Python của tôi :

g=0
i=l=2
while i+=1=>all$map(i%)(2..i)=>(i-l>g=>(g=i-l),print(l,i,g)),(l=i)

Đầu ra:

(2, 3, 1)
(3, 5, 2)
(7, 11, 4)
(23, 29, 6)
(89, 97, 8)
(113, 127, 14)
(523, 541, 18)
(887, 907, 20)
(1129, 1151, 22)
...

Nên được chọn là người chiến thắng!
Sange Borsch

2

Golfscript, 59 51 50 ký tự

Con người mỗi nhân vật đều vô cùng khó mất:

0[2.{).,2>{\.@%!},{.2$-.4$>{].p~\[}{;\;}if..}or}do

Đầu ra :

[2 3 1]
[3 5 2]
[7 11 4]
[23 29 6]
[89 97 8]
[113 127 14]
...

Giải thích :

Ngăn xếp được thiết lập để mỗi lần lặp bắt đầu với ngăn xếp như thế này, phía trên bên phải. Dấu [hiệu cho biết dấu hiệu mảng hiện tại, nghĩa là khi trình thông dịch gặp a ], mọi thứ trên ngăn xếp từ dấu đến đỉnh được đặt vào một mảng.

g [ last | cur

glà khoảng cách tối đa cho đến nay. Từ đỉnh xuống:

 command         | explanation
-----------------+----------------------------------------
 0[2.            | initialize vars g=0, last=2, cur=2
 {...}do         | loop forever...

Bên trong vòng lặp:

 )               | cur += 1
 .,2>{\.@%!},    | put all divisors of cur into a list
 {...}or         | if the list is empty, cur is prime, so
                 | the block is executed. otherwise,
                 | 'do' consumes the stack, sees it is truthy,
                 | and loops again

Làm thế nào để nó đưa tất cả các ước vào một danh sách? Hãy làm từng bước một

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack                                | n
 .,              | make list of 0..n-1                          | n [0,1,...,n-1]
 2>              | take elements at index 2 and greater         | n [2,3,...,n-1]
 {...},          | take list off stack, then iterate through    |
                 | the list. on each iteration, put the current |
                 | element on the stack, execute the block, and |
                 | pop the top of the stack. if the top is      |
                 | true then keep the element, else drop it.    |
                 | when done, push list of all true elements    |
                 | So, for each element...                      | n x
   \.            |   Swap & dup                                 | x n n 
   @             |   Bring x around                             | n n x
   %             |   Modulo                                     | n (n%x)
   !             |   Boolean not. 0->1, else->0. Thus this is 1 |
                 |   if x divides n.                            | n (x divides n)
                 | So only the divisors of n are kept           | n [divisors of n]

Nó làm gì nếu các ước số trống?

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack                                | g [ last | cur
  .              | dup                                          | g [ l | c | c
  2$             | copy 3rd down                                | g [ l | c | c | l
  -              | sub. This is the current gap, cur-last       | g [ l | c | c-l
  .              | dup                                          | g [ l | c | c-l | c-l
  4$             | copy 4th down                                | g [ l | c | c-l | c-l | g
  >              | is cur gap > max gap so far?                 | g [ l | c | c-l | c-l>g
  {#1}{#2}if..   | #1 if c-l > g, #2 otherwise, and do ".." in  | ... | g [ c | c | c
                 | either situation                             | 

Hai con đường: có và không. Nếu có (lưu ý rằng iftiêu thụ giá trị hàng đầu trên ngăn xếp):

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack. note that now the old `g` is  | XX [ l | c | g
                 | garbage and `c-l` is the new `g`.            |
 ]               | close the array                              | XX [l, c, g]
 .p              | duplicate it and print it, consuming the dup | XX [l, c, g]
 ~               | pump array back onto the stack. Note now the | XX | l | c | j
                 | array marker [ is gone.                      | 
 \               | swap.                                        | XX | l | g | c                         
 [               | mark the array                               | XX | l | g | c [
 .               | this is the part after the if. dups the top, | XX | l | g [ c | c
                 | but it does this in two steps, first popping | 
                 | c then putting two copies on top, so the     | 
                 | array marker moves                           | 
 .               | dup again                                    | XX | l | g [ c | c | c

Nếu không:

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack. In this case g is still the   | g [ l | c | c-l
                 | max gap so far                               | 
 ;\;             | dump top of stack, swap, and dump again      | g [ c
 ..              | the part after the if. dup twice             | g [ c | c | c

Lưu ý trong cả hai trường hợp, ngăn xếp của chúng tôi bây giờ ở dạng ... | g [ c | c | c.

Bây giờ dogiá trị bật ra khỏi ngăn xếp - luôn luôn c- và các vòng lặp nếu nó là số dương. Vì cluôn luôn tăng, điều này luôn đúng, vì vậy chúng tôi lặp đi lặp lại mãi mãi.

Sau khi bật lên, đỉnh của ngăn xếp g [ c | c, nghĩa là lần cuối cùng đã được cập nhật c, dấu mảng nằm ở cùng một vị trí và gvẫn là nơi chúng ta mong đợi.

Đây là những hoạt động phức tạp của GolfScript. Tôi hy vọng bạn thích theo sau!


1
Làm sáng tỏ tuyệt vời!
Jonathan Van Matre

1

Hồng ngọc, 110

Chỉ dành cho Ruby 2.0 do lazyphương thức:

(2..1.0/0).lazy.select{|n|!(2...n).any?{|m|n%m==0}}.reduce([2,0]){|(l,t),c|d=c-l;p [l,c,d]if d>t;[c,d>t ?d:t]}

Đầu ra:

[2, 3, 1]
[3, 5, 2]
[7, 11, 4]
[23, 29, 6]
[89, 97, 8]
[113, 127, 14]
[523, 541, 18]
[887, 907, 20]
[1129, 1151, 22]
[1327, 1361, 34]
[9551, 9587, 36]
[15683, 15727, 44]
[19609, 19661, 52]
[31397, 31469, 72]
[155921, 156007, 86]
[360653, 360749, 96]
[370261, 370373, 112]
[492113, 492227, 114]
...

1

Perl, 105 byte

$p=2;$d=0;L:for($i=2;++$i>2;){!($i%$_)&&next L for 2..$i-1;if($i-$p>$d){$d=$i-$p;print"$p $i $d\n"}$p=$i}

Ung dung:

$p = 2;
$d = 0;
L: for ($i = 2; ++$i > 2; ){
    !($i % $_) && next L for 2..$i-1;
    if ($i - $p > $d) {
        $d = $i - $p;
        print "$p $i $d\n"
    }
    $p = $i
}  

Thuật toán rất đơn giản, $pghi nhớ số nguyên tố trước. Sau đó $ichuyển từ 3lên đến, khi loại $ i "thất bại với tôi" hoặc trở nên tiêu cực vì tràn. $iđược kiểm tra cách thô bằng cách kiểm tra tất cả các ước số từ 2 đến $i-1. Một dòng được in, nếu chênh lệch hiện tại lớn hơn chênh lệch in trước đó $d.

Với một số byte nữa, thời gian chạy có thể được cải thiện:

$p = 2;
$d = 0;
L: for ($i=3; $i > 2; $i += 2){
    for ($j=3; $j <= sqrt($i); $j += 2){
        next L if !($i%$j)
    }
    if ($i - $p > $d) {
        $d = $i - $p;
        print "$p $i $d\n"
    }
    $p = $i
}

Các kết quả bắt đầu với:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52
31397 31469 72
155921 156007 86
360653 360749 96
370261 370373 112
492113 492227 114
1349533 1349651 118
1357201 1357333 132
2010733 2010881 148
4652353 4652507 154
17051707 17051887 180
20831323 20831533 210
47326693 47326913 220
...

1
Điều đó không chính xác, bạn cần tìm ra hàng loạt khoảng trống ngày càng tăng. Xem ví dụ câu trả lời của Ruby hoặc Matlab cho đầu ra dự kiến.
mmumboss

1
@mmumboss: Ồ, tôi đã bỏ qua điều này. Đã sửa bây giờ.
Heiko Oberdiek

Tốt cho một ngôn ngữ trong đó tất cả các biến yêu cầu tối thiểu 2 ký tự.
orion

1

Python, 93 91 ký tự

Kiểm tra nguyên tố ngây thơ (kiểm tra nếu chia hết cho bất kỳ thứ gì từ 2 đến n(ít ký tự hơn so với n/2)):

g=0;i=l=2
while 1:
 i+=1
 if all(i%x for x in range(2,i)):
    if i-l>g:g=i-l;print l,i,g
    l=i

Cấp độ thụt lề thứ hai là một ký tự tab.

Đầu ra:

2 3 1
5 7 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
...

Thật tuyệt, tôi đã quên rằng phạm vi đó nchỉ kiểm tra tối đan-1
Claudiu

1

Bash và một số Perl cho regex chính ( 167 157 143 112 byte)

n=2
c=2
while p=$c
do perl -e\(1x$[++n]')=~/^(11+?)\1+$/&&exit 1'&&c=$n
((c-p>g))&&g=$[c-p]&&echo $p $c $g
done

một số đầu ra:

$./golfd.sh
2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22

Sử dụng quay lui NP của regex để phá vỡ hoàn toàn bất kỳ vòng lặp và cấu trúc điều khiển nào là sự hoàn hảo thuần túy. Tuy nhiên, testviệc phản đối khá nhiều và nó không hiệu quả với tôi. Bạn cũng có thể sử dụng một số let n++let f=c-pvà thay thếtest với [. Hoặc có thể kiểm tra ở (())nơi bạn không cần $hoặc không gian.
orion

test -n $d trả về true cho một chuỗi rỗng. test -n "$d"vẫn ổn nhưng lâu hơn Tuy nhiên, trang man nói -n là tùy chọn, và hóa ra test $dlà ok. Và do đó [ $d ]cũng vậy. Và g = 0 phải được khởi tạo.
orion

@orion, xin lỗi vì một số lý do dường như nó đã hoạt động ngay bây giờ khi nó bị hỏng trên máy của tôi, tôi đã hoàn nguyên nó thành 167. Tôi sẽ cố gắng thêm một số đề xuất khác của bạn
Newbrict

Môi trường của bạn có thể có các biến được xác định trước.
orion

@orion vì một số lý do chỉnh sửa của bạn đã bị từ chối, bạn có thể chỉnh sửa lại không?
Newbrict

1

Perl 95 90 byte

for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}

phiên bản cũ của Golf:

$n=$c=2;
while($p=$c){
    $c=$n if (1x++$n)!~/^(11+?)\1+$/;
    if ($c-$p>$g) {$g=$c-$p;print "$p $c $g\n"}
}

Điều này tương tự như đệ trình khác của tôi, sans bash.


Tôi không khó chịu, tôi chỉ muốn xem điều này có thể đi bao xa. Tại đây:for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
orion

@orion đó là một số nghiêm trọng cho lạm dụng vòng lặp haha!
Newbrict

1

C (100)

Đóng góp của riêng tôi, không có thuật toán đặc biệt, chỉ là golf:

i,g,r,p=2;main(){for(;r=p;p-r>g?printf("%d %d %d\n",r,p,g=p-r):0)for(i=0;i-p;)for(i=1,++p;p%++i;);}

"+10 ký tự nếu bạn chỉ in các khoảng trống mà không có số nguyên tố." - nếu bạn xóa in rpbạn sẽ có ít ký tự hơn ghi điểm thưởng :)
CompuChip

Hoàn thành là đẹp :)
orion

1

Haskell, 134C

Chơi gôn

c n=null[x|x<-[2..n-1],n`mod`x==0]&&n>1
p=filter c[1..]
g l(m:n:o)
 |(n-m)>l=do print(m,n,n-m);g(n-m)(n:o)
 |True=g l(n:o)
main=g 0 p

Ung dung:

-- c function checks if n is a prime number
c n=null[x|x<-[2..n-1],n`mod`x==0]&&n>1

-- p is an infinite list of primes
p=filter c[1..]

-- g function prints a list of primes and differences.
--   l is the maximum difference seen so far
--   (m:n:o) is the list of unprocessed primes
g l(m:n:o)
 |(n-m)>l=do print(m,n,n-m);g(n-m)(n:o)
 |True=g l(n:o)

-- main starts the ball rolling with a default max-seen value of 0
main=g 0 p

Yêu mà lười đánh giá!
Jonathan Van Matre

1

C: 493 302 272 246

int e(int j){for(int i=2;i<j;i++)if(j%i<1)return 0;return 1;}void f(int a,int b,int c){if(e(a)&e(b))if(c<b-a){printf("%d %d %d\n",a,b,b-a);f(a+1,b+1,b-a);}else f(a+1,b+1,c);if(e(b))f(a+1,b,c);if(e(a))f(a,b+1,c);f(a+1,b+1,c);}int main(){f(2,3,0);}

Tôi đã sử dụng đệ quy không phải là vòng lặp thông thường của forhoặc while.

int isPrime(int num){
    for( int i=2; i<num; i++ )
        if(num%i < 0) return 0;
    return 1;
}
void fun(int n1, int n2, int gap){
   if( isPrime(n1) & isPrime(n2) ){
        if( gap < n2-n1 ){
           printf("%d %d %d\n", n1, n2, n2-n1);
           fun(n1+1, n2+1, n2-n1);
        }else{
           fun(n1+1, n2+1, gap);
        }
   }
   if( isPrime(n2) ){
       fun(n1+1, n2, gap);
   }
   if( isPrime(n1) ){
       fun(n1, n2+1, gap);
   }
   fun(n1+1, n2+1, gap);
}

int main(){
   fun(2,3,0);
}

Đầu ra:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52

Điều này không hoạt động. đúng / sai không được xác định, nhưng ngay cả khi chúng tôi sửa nó, nó báo cáo các khoảng trống sai. Chẳng hạn, có RẤT NHIỀU số nguyên tố trong khoảng từ 25219 đến 43237. Đệ quy của bạn leakingđứng đầu, vì bạn không kiểm tra isPrime (n2), bạn đang để các số nguyên tố giữa n1 và n2. Và điều này thực sự không thể được sửa chữa, bởi vì bạn không thể tăng n2 mà không gặp các số nguyên tố.
orion

Bạn đúng rồi! Đó là sai! Suy nghĩ của tôi đã sai ngay từ đầu.
Loukas

1
Bây giờ thì tốt hơn .. :)
Loukas

+1 Bây giờ nó đã được sửa, tôi thích nó - thật lạ thường (mặc dù không hiệu quả). Bạn có thể đánh nó xuống rất nhiều. Bỏ qua returntrong chính. Bỏ qua cuối cùng else. Thay thế &&-> &num%i==0bằng num%i<1. Và theo tiêu chuẩn c cổ đại (sẽ có cảnh báo), bạn không cần chỉ định giá trị trả về cho hàm void và int (đối số của chúng cũng được mặc định là int).
orion

Tôi đã chơi một chút và nhận được tới 151 ký tự, với một cuộc gọi đệ quy vô điều kiện, chỉ có một công cụ xác định loại ( int) và chức năng kiểm tra chính giảm nhiều: e(j,i){while(j%++i);return i==j;}f(a,b,c){int A=e(a,1),B=e(b,1);if(A&B&&c<b-a)printf("%d %d %d\n",a,b,c=b-a);f(a+(B|!A),b+(A|!B),c);}main(){f(2,3,0);}
orion

1

Oracle SQL, 216 202 196 172 + 10 = 182

Chỉ cần lưu ý điều này trong câu hỏi:

Số lượng nhân vật thấp nhất sẽ thắng. +10 ký tự nếu bạn chỉ in các khoảng trống mà không có số nguyên tố.

Vì đây là SQL và các từ khóa quá dài nên thực sự tốt hơn để chịu hình phạt, đưa ra những điều sau đây. Đó là ý tưởng giống như bản gốc.

with c as(select level+1n from dual connect by level<1e124)select lead(n)over(order by n) from(select*from c a where not exists(select*from c where n<a.n and mod(a.n,n)=0))

mà thích hợp để:

with c as ( 
 select level + 1 n 
   from dual 
connect by level < 1e124
        )
select lead(n) over ( order by n ) 
  from ( select *
           from c a 
          where not exists( select * 
                              from c 
                             where n < a.n 
                               and mod(a.n, n) = 0
                                   )
                )

Câu trả lời cũ (196)

with c as(select level+1n from dual connect by level<1e124)select n,p,p-n from(select n,lead(n)over(order by n)p from(select*from c a where not exists(select*from c where n<a.n and mod(a.n,n)=0)))

và ở định dạng có thể đọc được:

with c as ( 
 select level + 1 n 
   from dual 
connect by level < 1e124
        )
select n, p, p-n 
  from ( select n, lead(n) over ( order by n ) p 
           from ( select * 
                    from c a 
                   where not exists (
                                select * 
                                  from c
                                 where n < a.n 
                                   and mod(a.n, n) = 0
                                       )
                         )
                )

Điều này tạo ra một trình tạo số trong c , phần chọn phụ trong cùng tạo ra các số nguyên tố bằng cách sử dụng Sàng của Eratosthenes, phần bên ngoài làm ra số nguyên tố trước và cuối cùng là phần chọn cuối cùng trừ đi phần còn lại.

Điều này sẽ không trả lại bất cứ điều gì vì nó thực hiện 1 x 10 124 truy vấn đệ quy ... Vì vậy, nếu bạn muốn nó hoạt động thấp hơn con số này xuống mức hợp lý.


Khi nói đến một thách thức như thế này, tôi nghĩ rằng SQL không quá Turing-đầy đủ, nhưng Turing-cố chấp.
Jonathan Van Matre

Nhưng nó Turn-Complete @Jonathan, mặc dù đôi khi nó vẫn "thú vị" :-)?
Ben

Biết nó là Turing-đầy đủ, tôi đã nhắm đến trò đùa. Mất dấu, rõ ràng. :) Dù sao, có một số câu trả lời T-SQL trong hồ sơ của tôi ... hãy mang theo Oracle của bạn và hãy đấu tay đôi!
Jonathan Van Matre

0

D - 153 + 10 = 163

Tôi sẵn sàng nhận mức phạt +10 ở đây, vì số lượng char vẫn thấp hơn so với nếu tôi đã in các số nguyên tố.

Golfed :

import std.stdio;bool p(int l){int n;foreach(i;1..l+1)n+=l%i==0?1:0;return n==2;}void main(){int g;foreach(l;0..int.max)if(l.p){if(g>0)(l-g).write;g=l;}}

Phiên bản dễ đọc :

import std.stdio;

bool prime( int number )
{
    int divisors;

    foreach( i; 1 .. number + 1 )
        divisors += number % i == 0 ? 1 : 0;

    return divisors == 2;
}

void main()
{
    int lastPrime;

    foreach( number; 0 .. int.max )
        if( number.prime )
        {
            if( lastPrime > 0 )
                ( number - lastPrime ).write;

            lastPrime = number;
        }
}

0

JAVASCRIPT 174 char

var p=[2],l=2,g=0;
for(var n=3;n>0;n+=2){
  var o=0;
  for(var t=0;t<p.length;++t){
    if(n/p[t] == parseInt(n/p[t])){
      o=1;
    }
  }
  if(o==0){
    p.push(n);
    if(n-l>g){
      g=n-l;
      console.log(l,n,g);
    }
    l=n;
  }
}

phiên bản ngắn:

var p=[2],l=2,g=0;for(var n=3;n>0;n+=2){var o=0;for(var t=0;t<p.length;++t){if(n/p[t] == parseInt(n/p[t])){o=1;}}if(o==0){p.push(n);if(n-l>g){g=n-l;console.log(l,n,g);}l=n;}}

0

Javascript 138

for(var a=2,b=0,c=0;a++;){var d;a:{for(var e=a,f=2;f<e;f++)if(0==e%f){d=!1;break a}d=!0}d&&(0!=b&&a-b>c&&(c=a-b,console.log(b,a,c)),b=a)}

Sao chép mã này vào bảng điều khiển trình duyệt của bạn. Nó sẽ như thế mãi mãi vì số lượng tối đa là một cái gì đó xung quanh 1.79*10^308.

Ung dung:

var number = 2;
var lastPrime = 0;
var gap = 0;

while(number++)
{
    if (isPrime(number)) {
        if (lastPrime != 0) {            
            if (number - lastPrime > gap)
            {
                gap = number - lastPrime;
                console.log(lastPrime, number, gap);
            }
        }

        lastPrime = number;
    }
}

function isPrime(n){
    for (var i = 2; i < n; i++) {
        if (n % i == 0)
            return false;
    }
    return true;
}

0

C # 162 161 ký tự

151 ký tự + 10 ký tự phạt = 161 ký tự

Phiên bản ngắn:

using System;class P{static void Main(){int p=2,g=0;for(int i=3;;i++){for(int j=2;j<i;j++)if(i%j==0)goto e;if(i-p>g)Console.WriteLine(g=i-p);p=i;e:;}}}

Phiên bản dài:

using System;

class PrimeGaps
{
    private static void Main()
    {
        int lastPrime = 2;
        int largestGap = 0;

        for (int i = 3; true; i++)
        {
            // Prime test
            for (int j = 2; j < i; j++)
                if (i%j == 0)
                    goto nextI; // Skip to next iteration of i

            // Largest gap check
            if (i - lastPrime > largestGap)
            {
                largestGap = i - lastPrime;
                Console.WriteLine(largestGap);
            }

            // Remember last prime
            lastPrime = i;

            nextI:
                ; // Do nothing
        }
    }
}

Thực sự tốt hơn là nhận 10 hình phạt ký tự, vì nó viết ngắn hơn g(11 ký tự có hình phạt) so với p+" "+i+" "+g(13 ký tự mà không bị phạt).


0

Ruby 90 86 84 83 ký tự

r,i,g=2,2,0;while i+=1 do(2...i).all?{|j|i%j>0}&&((i-r<=g||p([r,i,g=i-r]))&&r=i)end

Một số ngắn mạch boolean, lạm dụng đánh giá biểu thức, vv


0

C 248

Mã so sánh các số nguyên tố liên tiếp a, b và sau đó kiểm tra xem các khoảng trống có lớn hơn g không thì tìm cặp số nguyên tố tiếp theo.

#include <cstdio>
void f(int* a, int* b){*a =*b;int t=1;while (*b += 2){t=1;for(int i=3;i<*b;i+=2){if(*b%i==0){t=0; break;}}if(t)break;}}
int main(){int a=2,b=3,g=0;do{(b-a>g)?printf("%d %d %d\n",a,b,(g=b-a)): f(&a,&b);} while(b>=0);return 0;}

Đây là C ++, phải không?
Zacharý

0

Haskell, 154 144 137 123

Các số nguyên tố pđược tạo ra bằng rây erasthotenes #, sau đó được lọc và in bằng cách sử dụng %.

p=2:3#1
n#m|all((>0).mod n)$take m p=n:(n+1)#(m+1)|1<2=(n+1)#m
(l:u@(o:_))%k|o-l>k=print(l,o,o-l)>>u%(o-l)|1<2=u%k
main=p%0

Đầu ra trông như

(2,3,1)
(3,5,2)
(7,11,4)
(23,29,6)
(89,97,8)

mà tôi hy vọng là ổn


0

Ngôn ngữ nhà sản xuất trò chơi, 85

Giả sử tất cả các biến chưa được khởi tạo là 0(đây là mặc định với một số phiên bản của Game Maker).

a=2b=2for(d=2;b++;1)for(c<b-a;b mod --d;1)d<3&&(c=b-a&&show_message_ext("",a,b,c)a=b)

0

Ngôn ngữ nhà sản xuất trò chơi, 74 + 55 = 129

Giả sử tất cả các biến chưa được khởi tạo là 0(đây là mặc định với một số phiên bản của Game Maker).

n=2while(n++){if p(n){if l{if n-l>g{g=n-l;show_message_ext("",l,n,g)}}l=n}

Kịch bản pdưới đây:

r=1a=argument0for(i=2i<a;i++){if a mod i=0r=0}return r}

0

Perl, 87 byte ( sử dụng mô-đun )

use Math::Prime::Util":all";$l=2;forprimes{if($_-$l>$m){say"$l $_ ",$m=$_-$l}$l=$_}1e14

Tôi đã viết mô-đun, nhưng chúng tôi sẽ phải thêm thêm 56.000 ký tự vào kiểm đếm. Chủ yếu là đăng cho vui, nhưng cũng để cung cấp một sự thay thế hiệu suất vì tôi không thấy bất kỳ sử dụng nội dung nào cho đến nay. 4,6 giây cho các khoảng trống đến 1e9, 36 giây cho các khoảng trống đến 1e10, 6,5 phút cho 1e11.

Pari / GP 2.8 về cơ bản có thể được thực hiện theo cách tương tự, mặc dù chậm hơn 2 lần:

l=2;m=0;forprime(p=2,1e14,if(p-l>m,print(l," ",p," ",m=p-l));l=p)

-1

Perl 153

Mã ngắn:

$i=$a=2;while($a=$i++){if(p($i)){if($m<$m2=$i-$a){$m=$m2;print"$a $i $m$/"}}}sub p{$d=2;$s=sqrt$_[0];while(){return 0if!($_[0]%$d);return 1if$d>$s;$d++}}

dễ đọc:

$i=$a=2;
while($a=$i++){
  if(p($i)){
    if($m<$m2=$i-$a){
      $m=$m2;
      print"$a $i $m$/"
    }
  }
}
sub p {
  $d=2;
  $s=sqrt$_[0];
  while(){
    return 0if!($_[0]%$d);
    return 1if$d>$s;
    $d++;
  }
}

Điều này tạo ra tất cả các khoảng trống, không chỉ lớn nhất cho đến nay.
orion
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.