प्रमुख अंतराल की गणना करें


19

प्राइम्स ढूंढना मार्ग का एक प्रोग्रामिंग संस्कार है और बहुत बार एक पहला गंभीर कार्यक्रम है जो किसी को भी (आमतौर पर परीक्षण विभाजन के साथ) क्रेट करता है।

लेकिन अकेले प्राइम पहले से ही खराब हो जाते हैं। एक और अधिक दिलचस्प बात यह है कि प्रधान अंतराल प्राप्त करना है: लगातार-सबसे लंबे समय तक सबसे लंबे अंतराल के बीच अंतराल। ये काफी दुर्लभ और "अनमोल" हैं। पहले कुछ जोड़े और उनके अंतर हैं:

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

मेरे पिता 10k तक मज़े के लिए हाथ से इनकी गणना करते थे। देखते हैं कि आपको कितना कम कोड मिल सकता है।

नियम:

  • प्राइम टेस्टिंग, प्राइम जनरेशन या प्राइम गैप के लिए कोई बिलिन कार्य नहीं करता है
  • http://oeis.org/A002386 या समान पुनर्प्राप्त नहीं कर रहा है (मैं आपको दूर से थिएटर सूंघ सकता हूं :))
  • कोई प्री-कॉम्पट्यूट एरेज़ नहीं
  • तब तक प्रिंट करते रहें जब तक कि आपका आंतरिक पूर्णांक प्रकार आप पर विफल न हो जाए

सबसे कम वर्ण गणना जीत जाती है। +10 वर्ण यदि आप केवल बिना प्रिंट के अंतराल प्रिंट करते हैं।

यदि आप दिलचस्प हैं, तो आप बिलिन फ़ंक्शन के साथ संस्करण भी दिखा सकते हैं। रचनात्मक बनो।

स्पष्टता: आप अपराधों से गुजरते हैं और आप हर बार रिपोर्ट करते हैं कि आप एक अंतराल को देखते हैं जो आपके द्वारा देखे गए किसी भी अंतराल से बड़ा है। उदाहरण के लिए, 3 और 5 के बीच, 2 इकाइयों की खाई चौड़ी है। 5 और 7 के बीच का अंतर भी 2 है, लेकिन यह पुरानी खबर है, हम किसी भी अधिक परवाह नहीं करते हैं। केवल जब आप एक नया सबसे बड़ा अंतर देखते हैं, तो आप इसकी रिपोर्ट करते हैं। यह दर्शाता है कि कैसे अपराध कम और कम लगातार हो रहे हैं, क्योंकि अंतराल व्यापक और व्यापक हो गए हैं।


EDIT : अधिकांश उत्तर शानदार हैं और अधिक मान्यता के पात्र हैं। हालांकि, अब तक, 48 अक्षरों के साथ एक गोल्फस्क्रिप्ट प्रविष्टि सबसे छोटी है।


1
आपके उदाहरण में 3 एक जोड़ी का अंत है, और अगली जोड़ी की शुरुआत है, जबकि अन्य संख्याओं के लिए ऐसा नहीं है। तुम क्या चाहते हो?
mmumboss

कोई बात नहीं, मैं समझ गया।
mmumboss

आप अपने नियम को "प्रधान परीक्षण, प्रधान गणना या प्रधान अंतराल के लिए कोई अंतर्निहित कार्य नहीं" के रूप में फिर से लिखना चाह सकते हैं। अन्यथा एक स्पष्ट समाधान एक फ़ंक्शन का उपयोग करेगा जो एन वें प्राइम को लौटाता है , फिर वेतन वृद्धि एन , फ़ंक्शन को फिर से चलाएं और अंतर ढूंढें।
user12205

2
ओह। मुझे OEIS से प्यार है
TheDoctor

मुझे @mmumboss जैसी ही शंका है। आप कृपया xplain कर सकते हैं?
क्लाइड लोबो

जवाबों:


3

गोल्फस्क्रिप्ट 66 59 57 49 48

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

हालाँकि मुझे इसे चलाने में परेशानी हो रही है http://golfscript.apphb.com/ (शायद वह साइट अनंत लूप पसंद नहीं करती?) लेकिन यह ठीक काम करता है जब मैं इसे अपने कंप्यूटर पर golfscript.rb के साथ चलाता हूं। मैं GolfScript के लिए बहुत नया हूँ ताकि यह शायद और भी नीचे गोल्फ हो सकता है। अद्यतन: मुझे नहीं लगता कि यह एल्गोरिथ्म को किसी तरह बदलने के बिना बहुत अधिक नीचे गिराया जा सकता है।

पहले कुछ पंक्तियाँ मुद्रित (यदि आपको पसंद नहीं है "" जिसे आप मुद्रित कर सकते हैं, तो आप स्क्रिप्ट की शुरुआत में जोड़ सकते हैं, लेकिन यह 49 वर्णों तक टकराती है):

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

सामान्य मानव-पठनीय विचार यह कैसे काम करता है (कुछ चीजें थोड़ी अलग हैं क्योंकि मैं इस संस्करण में स्टैक का उपयोग नहीं कर रहा हूं):

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

पायथन, 121 110 109 108 104 103 वर्ण

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

पहली बार मैंने यहाँ जवाब देने की कोशिश की, मुझे आशा है कि मैंने इसे सही किया ... यकीन नहीं होता कि मैंने पात्रों को भी गिना।

हम्म, मैं पायथन 2.x पर अपग्रेड करके प्रिंट पर एक और चरित्र बचा सकता था ...


121 वर्ण, शीर्षक को शीर्षक के साथ बनाते हैं #, आप गंभीरता से चर को हाथ से नहीं गिनते हैं? javascriptkit.com/script/script2/charcount.shtml
user80551

नहीं, मैं हाथ से नहीं गिनता था :) लेकिन मैंने अन्य प्रश्नों के उत्तर पायथन को देखा है, जो एक पंक्ति में कुछ सवालों के जवाब देता है, जो व्हाट्सएप को कम कर देता है, और स्पष्ट रूप से मुझे यकीन नहीं है कि एक नई पंक्ति को 1 या 2 वर्णों के रूप में गिना जाता है ...
ताल

1
जब तक प्रश्न के नियम स्पष्ट रूप से अन्यथा न हों तब तक हम नई वर्णमाला को 1 वर्ण के रूप में गिनते हैं। PPCG में आपका स्वागत है!
जोनाथन वान मैटर

3
स्वागत हे! अच्छा जवाब, और इसमें सुधार के लिए कुछ जगह भी है। उदाहरण के लिए, if all(n%x>0for x in p):थोड़ा छोटा है। आप उसी लाइन (जैसे a=1;b=2;f()) पर स्टेटमेंट ले जाकर कुछ कैरेक्टर भी सेव कर सकते हैं ।
gr

1
नवीनतम बदलाव ने कोड को [n] आगे की ओर न बढ़ाते हुए तोड़ दिया।
ओरियन

4

जावास्क्रिप्ट, 90 85 78 74 वर्ण

लघु कोड (Google बंद करने वाला कंपाइलर - उन्नत अनुकूलन; कुछ मैनुअल संपादन; @ 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)

लंबा कोड

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

उत्पादन

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

प्राइम्स के लिए सुंदर अक्षम परीक्षण, लेकिन इस तरह से यह कम वर्णों का उपयोग करता है।

पहले यहाँ पोस्ट करें, इसलिए कृपया किसी भी गलती का बहाना करें।


78 वर्ण -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 धन्यवाद। उन लोगों को हाजिर नहीं किया। संपादित।
सिरको

इससे भी अधिक अयोग्य लेकिन 74 अक्षर -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

गणितज्ञ, ११४ १० 114

अनंत आउटपुट की अनुमति देता है, हालांकि अनुक्रम में एक निश्चित बिंदु के बाद पंखा घूमता है और आपको संदेह होने लगता है कि आपका सीपीयू व्यस्त दिखने के लिए अपना सर्वश्रेष्ठ प्रदर्शन करते हुए फ्रीसेल खेल रहा है।

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]

आउटपुट नमूना (ये वे हैं जिन्हें यह पहले ~ 30s में उठाता है):

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

अघोषित कोड:

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]

क्या यह पहचान है ?
13.314

हां, यह सिर्फ उस तरह से निर्यात नहीं करता है, लेकिन जब आप नोटबुक में कोड पेस्ट करते हैं तो यह ठीक होगा। मैंने पहले ही इसके अनुसार स्कोर किया है लेकिन मैं इसे सरल बनाने के लिए संशोधित करूंगा।
जोनाथन वान मैट्रे

अगर आप गणित के बिल्ट-इन प्राइम फ़ंक्शंस का उपयोग करते हैं तो कितने पात्र हैं ?
माइकल स्टर्न

76. चूँकि पूरे p @ x_ की परिभाषा नेक्स्टप्राइम का केवल एक कार्यान्वयन है, इसे p = नेक्स्टप्राइम द्वारा प्रतिस्थापित किया जा सकता है;
जोनाथन वान मैटर

3

हास्केल - 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

(अकुशल) प्राइम लिस्ट एक्सप्रेशन विल नेस से चुराया ।

-edit- मुझे नहीं पता था x|y=z|w=qकि यह मान्य होगा।


2

MATLAB 104 89

बस हर संभव विभाजन की जाँच करके मूल विधि को लागू किया।

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

आउटपुट:

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

मैं चालू हूं octaveऔर यह infबात काम नहीं करती है (और लूप के समाप्त होने तक प्रिंट को स्थगित कर दिया जाता है)। क्या matlab में आलसी श्रेणी का मूल्यांकन होता है?
ओरियन

मतलाब रियलटाइम प्रिंट करता है, लूप के प्रत्येक पुनरावृत्ति। जब मैं अपना कार्यक्रम शुरू करता हूं तो मुझे एक चेतावनी मिलती है कि अधिकतम सूचकांक 2147483647 है, और फिर यह शुरू होता है। वैकल्पिक रूप से मैं infmax के साथ inf को बदल सकता था, लेकिन वह तीन वर्ण अधिक है।
mmumboss

2

76 वर्ण, डॉगलैंग

मेरे पायथन संस्करण से परिवर्तित :

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)

आउटपुट:

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

विजेता के रूप में चुना जाना चाहिए!
सर्ज बोर्स्च

2

गोल्फस्क्रिप्ट, 59 51 50 चार्ट

प्रत्येक चरित्र को खोना अत्यंत कठिन है:

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

आउटपुट :

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

स्पष्टीकरण :

स्टैक सेट किया गया है, इसलिए प्रत्येक पुनरावृत्ति स्टैक के साथ शुरू होती है, शीर्ष दाईं ओर स्थित है। [वर्तमान सरणी मार्कर को इंगित करता है, जिसका अर्थ है जब दुभाषिया एक का सामना करना पड़ता ], शीर्ष करने के लिए निशान से ढेर पर सब कुछ एक सरणी में डाल दिया है।

g [ last | cur

gअब तक का अधिकतम अंतर है। ऊपर से नीचे:

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

लूप के अंदर:

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

यह एक सूची में सभी विभाजक कैसे डालता है? चलो यह कदम से कदम है

 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]

यदि भाजक खाली हैं तो यह क्या करता है?

 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                             | 

दो रास्ते: हाँ और नहीं। यदि हाँ (ध्यान दें कि ifस्टैक पर शीर्ष मूल्य का उपभोग करता है):

 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

यदि नही:

 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

या तो मामले में ध्यान दें, हमारा स्टैक अब फॉर्म में है ... | g [ c | c | c

अब doस्टैक से शीर्ष मान को चबूतरे - हमेशा c- और लूप्स यदि यह सकारात्मक है। चूंकि cहमेशा बढ़ते हुए, यह हमेशा सच होता है, इसलिए हम हमेशा के लिए लूप करते हैं।

एक बार पॉप करने के बाद, स्टैक का शीर्ष है g [ c | c, जिसका अर्थ है कि अंतिम रूप से अपडेट किया गया है c, सरणी का निशान उसी स्थान पर है, और gअभी भी वह जगह है जहां हम इसकी उम्मीद करते हैं।

ये GolfScript के जटिल ऑपरेशन हैं। मुझे आशा है कि आपको साथ में मज़ा आया!


1
बहुत बढ़िया अभिवादन!
जोनाथन वान मैटर

1

रूबी, 110

केवल रूबी 2.0 के लिए lazyविधि के कारण :

(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]}

आउटपुट:

[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

पर्ल, 105 बाइट्स

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

Ungolfed:

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

एल्गोरिदम सरल है, $pपिछले अभाज्य संख्या को याद करता है। तब ऊपर $iसे चला जाता 3है, जब $ i प्रकार "मुझ पर विफल" या अतिप्रवाह के कारण नकारात्मक हो जाता है। $i2 से सभी विभाजकों की जाँच करके कच्चे रास्ते का परीक्षण किया जाता है $i-1। एक पंक्ति मुद्रित की जाती है, यदि वर्तमान अंतर पिछले मुद्रित अंतर से बड़ा है $d

कुछ और बाइट्स के साथ रन-टाइम में सुधार किया जा सकता है:

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

परिणाम के साथ शुरू होता:

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
यह सही नहीं है, आपको बढ़ते अंतराल की श्रृंखला खोजने की आवश्यकता है। उदाहरण के लिए देखें रूबी या अपेक्षित आउटपुट के लिए मतलाब उत्तर।
13:14

1
@mmumboss: ओह, मैंने इसे अनदेखा कर दिया है। अब तय हो गया।
हेइको ओबर्डिएक

ऐसी भाषा के लिए अच्छा है जहाँ सभी चर को न्यूनतम 2 वर्णों की आवश्यकता होती है।
ओरियन

1

पायथन, 93 91 वर्ण

अनुभवहीन प्रधानमंत्री जाँच (जाँच करता है, तो करने के लिए 2 से कुछ भी से विभाज्य n(करने के लिए कम से कम वर्ण 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

इंडेंट का दूसरा स्तर एक टैब वर्ण है।

आउटपुट:

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

अच्छा, मैं उस सीमा तक भूल गया nऊपर केवल जांच केn-1
Claudiu

1

बैश और प्राइम रेगेक्स के लिए कुछ पर्ल ( 167 157 143 112 बाइट्स)

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

कुछ आउटपुट:

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

रेगेक्स की एनपी बैकट्रैकिंग का उपयोग पूरी तरह से किसी भी छोरों और नियंत्रण संरचनाओं को दरकिनार करने के लिए शुद्ध पूर्णता है। हालाँकि, testकाफी विरोध कर रहा है, और यह मेरे लिए काम नहीं करता है। तुम भी कुछ इस्तेमाल कर सकते हैं let n++और let f=c-pऔर की जगह testके साथ [। या संभवतः (())जहाँ आपको ज़रूरत नहीं है $या रिक्त स्थान का परीक्षण करें ।
ओरियन

test -n $dखाली स्ट्रिंग के लिए सही है। test -n "$d"ठीक था, लेकिन अब। हालाँकि, मैन पेज कहता है -n वैकल्पिक है, और यह test $dठीक है। और इसलिए [ $d ]भी। और जी = 0 को आरंभीकृत किया जाना था।
ओरियन

@ion, किसी कारण के लिए खेद है कि यह एक बार काम करने के लिए लग रहा था अब यह मेरी मशीन पर भी टूट गया, मैंने इसे 167 में बदल दिया। मैं आपके कुछ अन्य सुझावों को जोड़ने की कोशिश
करूंगा

आपके परिवेश में शायद पूर्वनिर्धारित चर थे।
ओरियन

@ किसी कारण से आपका संपादन अस्वीकार कर दिया गया था, क्या आप पुनः संपादित कर सकते हैं?
न्यूब्रिक्ट

1

पर्ल 95 90 बाइट्स

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

पुराना गैर गोल्फ संस्करण:

$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"}
}

यह मेरे अन्य सबमिशन, सैंस बैश के समान है।


मुझे गुस्सा नहीं आ रहा है, मैं बस यह देखना चाहता हूं कि यह कितनी दूर जा सकता है। यहाँ:for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
ओरियन

@ थोर जो कि लूप एब्यूज हाहा के लिए कुछ गंभीर है!
न्यूब्रिक्ट

1

सी (100)

मेरा अपना योगदान, कोई विशेष एल्गोरिथ्म, सिर्फ गोल्फ:

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 वर्ण यदि आप केवल बिना प्रिस्क्रिप्शन के अंतराल प्रिंट करते हैं। " - यदि आप की छपाई हटाते हैं rऔर pआपके पास कम पात्र होंगे और बोनस स्कोर होगा :)
कॉम्प्युक्ति

पूर्णता सुंदर है :)
ओरियन

1

हास्केल, 134 सी

golfed:

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

Ungolfed:

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

उस आलसी मूल्यांकन से प्यार करो!
जोनाथन वान मैट्रे

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);}

मैं प्रत्यावर्तन नहीं के सामान्य पाश इस्तेमाल किया forया 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);
}

आउटपुट:

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

यह काम नहीं करता है। सही / गलत को परिभाषित नहीं किया गया है, लेकिन भले ही हम इसे ठीक कर लें, लेकिन यह गलत अंतराल की सूचना दे रहा है। उदाहरण के लिए, 25219 और 43237 के बीच ए लॉट ऑफ़ प्राइम हैं। आपकी पुनर्संरचना leakingसबसे ऊपर है, क्योंकि आप परीक्षण नहीं कर रहे हैं। Prime (n2), आप n1 और n2 के बीच primes दे रहे हैं। और यह वास्तव में तय नहीं किया जा सकता है, क्योंकि आप बिना मीटिंगों के n2 नहीं बढ़ा सकते हैं।
ओरियन

तुम सही हो! यह गलत है! मेरी सोच शुरू से ही गलत थी।
लौकस

1
अब यह बेहतर है .. :)
लौकस

+1 अब यह तय हो गया है कि मुझे यह पसंद है - यह अच्छी तरह से असामान्य है (हालांकि कुशल नहीं है)। आप इसे बहुत नीचे कर सकते हैं। returnमुख्य में छोड़ें । आखिरी को छोड़ दें else। बदलें &&-> &और num%i==0साथ num%i<1। और प्राचीन ग मानकों (चेतावनी होगी) द्वारा, आपको शून्य और अंतर कार्यों के लिए रिटर्न मान निर्दिष्ट करने की आवश्यकता नहीं है (उनके तर्क भी int के लिए डिफ़ॉल्ट हैं)।
ओरियन

मैं थोड़ा खेल रहा था और इसे १५१ अक्षरों तक ले गया, एक बिना शर्त पुनरावर्ती कॉल के साथ, केवल एक ही प्रकार का स्पेसियर ( int) और बहुत कम प्राइम परीक्षण परीक्षण: 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);}
ओरियन १४'१४

1

Oracle SQL, 216 202 196 172 + 10 = 182

इस सवाल पर बस ध्यान दिया:

सबसे कम वर्ण गणना जीत जाती है। +10 वर्ण यदि आप केवल बिना प्रिंट के अंतराल प्रिंट करते हैं।

जैसा कि यह एसक्यूएल है और कीवर्ड इतने लंबे हैं कि वास्तव में जुर्माना लेना बेहतर है, निम्नलिखित दे रहा है। यह मूल के समान ही विचार है।

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

जो इसके लिए पूर्व निर्धारित करता है:

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

पुराना उत्तर (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)))

और एक पठनीय प्रारूप में:

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

यह एक नंबर जनरेटर बनाता है c, अंतरतम उप-चयन एक छलनी का उपयोग करके एराटोस्थनीज की संख्या बनाता है, बाहरी पिछले प्राइम का काम करता है और अंत में अंतिम चयन एक को दूसरे से घटाता है।

यह कुछ भी वापस नहीं करेगा क्योंकि यह 1 x 10 124 पुनरावर्ती प्रश्नों का प्रदर्शन कर रहा है ... इसलिए, यदि आप चाहते हैं कि यह संख्या कुछ कम समझदार काम करने के लिए है।


जब यह इस तरह की एक चुनौती की बात आती है, तो मुझे लगता है कि एसक्यूएल इतना ट्यूरिंग-पूर्ण नहीं है, लेकिन ट्यूरिंग-ऑब्स्टिक्ट।
जोनाथन वान मैट्रे

लेकिन यह है टर्निंग-पूरा @Jonathan, हालांकि यह हो रही है वहाँ कभी कभी है "रोचक" :-)?
बेन

यह जानते हुए कि यह ट्यूरिंग-पूर्ण है, मैं लक्ष्य बना रहा था। जाहिरा तौर पर निशान छूट गया। :) वैसे भी, मेरी प्रोफ़ाइल में कई टी-एसक्यूएल उत्तर हैं ... अपना ओरेकल लाओ और चलो एक द्वंद्व है!
जोनाथन वान मैट्रे

0

डी - 153 + 10 = 163

मैं स्वेच्छा से +10 जुर्माना यहां ले रहा हूं, क्योंकि चार गिनती अभी भी कम है क्योंकि अगर मैंने प्रिंट को मुद्रित किया होता तो यह होता।

गोल्फ :

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

पठनीय संस्करण :

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 चार

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

लघु संस्करण:

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

जावास्क्रिप्ट 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)}

इस कोड को अपने ब्राउज़र कंसोल में कॉपी करें। यह हमेशा के लिए पसंद करेगा क्योंकि अधिकतम संख्या आसपास कुछ है 1.79*10^308

Ungolfed:

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

सी # 162 161 चार

151 वर्ण + 10 दंड चार = 161 वर्ण

लघु संस्करण:

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:;}}}

दीर्घ संस्करण:

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

यह वास्तव में 10 वर्ण दंड लेना बेहतर था, क्योंकि यह छोटा लेखन है g(दंड के साथ 11 वर्ण) p+" "+i+" "+g(दंड के बिना 13 वर्ण)।


0

रूबी 90 86 84 83 चार

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

कुछ बूलियन शॉर्ट सर्किट, अभिव्यक्ति मूल्यांकन का दुरुपयोग, आदि।


0

सी 248

कोड लगातार अभाज्य संख्याओं की तुलना करता है a, b और फिर जाँचता है कि क्या अंतराल g से बड़े हैं तो अगले युग्मों को ढूँढता है।

#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;}

यह C ++ है, है ना?
Zacharý

0

हास्केल, 154 144 137 123

pएरेस्टोटेनेस की छलनी का उपयोग करके प्राइम उत्पन्न होते हैं# , और फिर उपयोग करके फ़िल्टर और मुद्रित किया जाता है %

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

आउटपुट जैसा दिखता है

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

मुझे आशा है कि ठीक है।


0

गेम मेकर लैंग्वेज, 85

सभी असंवैधानिक चर को मान लें 0(यह गेम मेकर के कुछ संस्करणों के साथ डिफ़ॉल्ट है)।

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

गेम मेकर लैंग्वेज, 74 + 55 = 129

सभी असंवैधानिक चर को मान लें 0(यह गेम मेकर के कुछ संस्करणों के साथ डिफ़ॉल्ट है)।

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

स्क्रिप्ट pनीचे है:

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

0

पर्ल, 87 बाइट्स ( एक मॉड्यूल का उपयोग करके )

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

मैंने मॉड्यूल लिखा था, लेकिन हमें टैली में अतिरिक्त 565,000 वर्ण जोड़ना होगा। ज्यादातर मस्ती के लिए पोस्टिंग, लेकिन यह भी एक प्रदर्शन विकल्प देने के लिए क्योंकि मैं अभी तक किसी भी निर्माण का उपयोग नहीं देख रहा हूँ। 1e9 के लिए अंतराल के लिए 4.6s, 1e10 के अंतराल के लिए 36s, 1e11 के लिए 6.5min।

Pari / GP 2.8 को मूल रूप से उसी तरह से किया जा सकता है, जो 2x धीमे से अधिक होता है:

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

-1

पर्ल 153

छोटे संकेत:

$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=$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++;
  }
}

यह सभी अंतरालों का उत्पादन करता है, न कि अब तक का सबसे बड़ा।
ओरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.