Asal boşlukları hesapla


19

Asal bulmak, bir programlama ayinidir ve sıklıkla birisinin ürettiği ilk ciddi bir programdır (genellikle deneme bölümü ile).

Ancak sadece primerler yıpranmış durumda. Bir sonraki çok daha ilginç şey, asıl boşlukları elde etmektir: ardışık asallar arasındaki en uzun boşluklar. Bunlar oldukça nadir ve "değerli" dir. İlk birkaç çift ve farklılıkları şunlardır:

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

Babam bunları 10k'ye kadar eğlenmek için elle hesaplardı. Bir kodun ne kadar kısa olabileceğini görelim.

Kurallar:

  • ana test, ana üretim veya ana boşluklar için yerleşik fonksiyonlar yoktur
  • http://oeis.org/A002386 veya benzerlerini almak yok (sizi uzaktan dolandırıcıların kokusunu alabiliyorum :))
  • önceden hesaplanmamış diziler yok
  • dahili tamsayı türünüz başarısız olana kadar yazdırmaya devam edin

En düşük karakter sayısı kazanır. Boşlukları yalnızca asal olmadan yazdırırsanız +10 karakter.

İlginçse yerleşik işlevli sürümleri de gösterebilirsiniz. Yaratıcı ol.

Açıklama: Asalları gözden geçirirsiniz ve daha önce gördüğünüz herhangi bir boşluktan daha büyük bir boşluk gördüğünüzde rapor verirsiniz. Örneğin, 3 ile 5 arasında, 2 birim genişliğinde bir boşluk vardır. 5 ve 7 arasındaki boşluk da 2, ancak bu eski haber, artık umursamıyoruz. Sadece yeni bir en büyük boşluk gördüğünüzde bunu rapor edersiniz. Bu, boşluklar genişledikçe ve genişledikçe, primerlerin nasıl daha az sıkıldığını yansıtır.


EDIT : Cevapların çoğu parlak ve daha fazla tanınmayı hak ediyor. Ancak, şimdiye kadar 48 karakterli bir GolfScript girişi en kısa olanıdır.


1
Örnek 3'te bir çiftin sonu ve bir sonraki çiftin başlangıcıdır, ancak bu diğer sayılar için geçerli değildir. Ne istiyorsun?
mmumboss

Boşver, şimdi anladım.
mmumboss

Kuralınızı "ana test, ana hesaplama veya ana boşluklar için yerleşik işlev yok" olarak yeniden yazmak isteyebilirsiniz. Aksi takdirde, bariz bir çözüm n. Üssünü döndüren bir işlevi kullanır , ardından n'yi artırır , işlevi yeniden çalıştırır ve farkı bulur.
user12205 12:14

2
Ayy.
OEIS'i

@Mmumboss ile aynı şüphe var. Lütfen açıklayabilir misiniz?
Clyde Lobo

Yanıtlar:


3

GolfScript 66 59 57 49 48

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

Burada çalışırken sorun yaşıyor olmama rağmen http://golfscript.apphb.com/ (belki de bu site sonsuz döngüyü sevmez?) Ama golfscript.rb ile bilgisayarımda çalıştırdığımda iyi çalışıyor. GolfScript'te oldukça yeniyim, bu yüzden muhtemelen daha da golf edilebilir. GÜNCELLEME: Algoritmayı bir şekilde değiştirmeden bunun daha fazla golf oynayabileceğini düşünmüyorum.

İlk birkaç satır yazdırılır ("" yazdırılmasından hoşlanmıyorsanız, komut dosyasının başına ekleyebilirsiniz, ancak bu 49 karaktere kadar çıkacaktır):

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

Bunun nasıl çalıştığına dair genel insan tarafından okunabilir fikir (bu sürümde bir yığın kullanmıyorum çünkü biraz farklı):

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

Python, 121 110 109 108 104 103 karakter

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

Burada ilk cevaplamaya çalıştığımda, umarım doğru yaptım ... karakterleri doğru saydığımdan bile emin değilim.

Hmmm, Python 2.x'e geçerek baskıya başka bir karakter kaydedebilirim ...


121 karakter, başlık ile bir başlık yapmak #, ciddi el ile karakter saymıyor musunuz? javascriptkit.com/script/script2/charcount.shtml
user80551

Hayır, elle saymadım :) Ama bazı satırlara boşlukları azaltacak şekilde düzleştirilmiş bazı sorulara başka Python cevapları gördüm ve açıkçası yeni satırın 1 veya 2 karakter olarak sayıldığından emin değilim ...
Tal

1
Sorunun kuralları aksini açıkça belirtmedikçe, yeni satırları 1 karakter olarak sayıyoruz. PPCG'ye Hoşgeldiniz!
Jonathan Van Matre

3
Hoşgeldiniz! Güzel cevap, ve ayrıca iyileştirilmesi için bir yer var. Örneğin, if all(n%x>0for x in p):biraz daha kısadır. Bazı karakterleri ifadeleri aynı satıra taşıyarak da kaydedebilirsiniz (örn. a=1;b=2;f()).
grc

1
Son değişiklik, [n] 'yi belirtildiği gibi öne itmeyerek kodu kırdı.
orion

4

JavaScript, 90 85 78 74 karakter

Kısa Kod (Google Closure Derleyici - Gelişmiş Optimizasyonlar; bazı manuel düzenlemeler; @ MT0 tarafından daha fazla düzenleme )

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)

Uzun Kod

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

Çıktı

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

Asallar için oldukça verimsiz bir test, ancak bu şekilde daha az karakter kullanıyor.

Burada ilk gönderi, lütfen hataları bahane edin.


78 Karakter -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 Teşekkürler. Bunları görmedim. Düzenlenen.
Sirko

Daha da verimsiz ama 74 karakter -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

Mathematica 114 108

Dizideki belirli bir noktadan sonra fan döner ve meşgul görünmek için elinden gelenin en iyisini yaparken CPU'nuzun Freecell oynadığından şüphelenmeye başlarsınız.

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]

Çıktı örneği (Bunlar ilk ~ 30'larda aldıkları):

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

Kod çözülmemiş kod:

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]

Tanıyor mu ?
Mart'ta Riking

Evet, sadece bu şekilde dışa aktarılmaz, ancak kodu dizüstü bilgisayara yapıştırdığınızda iyi ayrıştırır. Zaten buna göre puan aldım ama basitleştirmek için revize edeceğim.
Jonathan Van Matre

Eğer varsa kaç karakter yapmak kullanımı mathematica yerleşik oluyor Prime fonksiyonlarının?
Michael Stern

76. p @ x_ tanımının tamamı sadece NextPrime'ın yeniden uygulanması olduğundan, p = NextPrime ile değiştirilebilir;
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

Will Ness'ten çalınan (verimsiz) ana liste ifadesi .

-edit- x|y=z|w=qGeçerli olacağını asla bilmiyordum .


2

MATLAB 104 89

Sadece mümkün olan her bölümü kontrol ederek temel yöntemi uyguladık.

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

Çıktı:

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

Ben octaveve bu infşey işe yaramaz (ve döngü bitene kadar baskı ertelenir). Matlab'ın tembel aralık değerlendirmesi var mı?
orion

Matlab, döngünün her yinelemesini gerçek zamanlı olarak yazdırır. Programımı başlattığımda, maksimum dizinin 2147483647 olduğuna dair bir uyarı alıyorum ve sonra başlıyor. Alternatif olarak inf'yi intmax ile değiştirebilirim, ancak bu üç karakter daha fazla.
mmumboss

2

76 karakter, dogelang

Python sürümümden dönüştürüldü :

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)

Çıktı:

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

Kazanan olarak seçilmelidir!
Çavuş Borsch

2

Golfscript, 59 51 50 karakter

Adam her karakteri kaybetmek son derece zordur:

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

Çıktı :

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

Açıklama :

Yığın, her yineleme, yığının bu şekilde başlamasıyla başlar, üst kısım sağda olur. [Tercüman bir karşılaştığında, yani şimdiki dizi işaretleyici belirten ]bir diziye konur üstüne işaretinden yığın, her şeyi.

g [ last | cur

gşu ana kadarki maksimum boşluktur. Yukarıdan aşağıya:

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

Döngünün içinde:

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

Tüm bölenleri bir listeye nasıl yerleştirir? Adım adım yapalım

 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]

Bölenler boşsa ne yapar?

 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                             | 

İki yol: evet ve hayır. Cevabınız evetse ( ifyığındaki en yüksek değeri tüketdiğini unutmayın ):

 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

Eğer hayırsa:

 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

Her iki durumda da, yığımızın şimdi formda olduğunu unutmayın ... | g [ c | c | c.

Şimdi doyığındaki en yüksek değeri - her zaman c- çıkarır ve pozitifse döngüler. Beri chep artan bu biz döngü böylece sonsuza kadar hep doğrudur.

Bir kez atlandığında, yığının üstü g [ c | c, yani son olarak güncellendi c, dizi işareti aynı yerde ve ghala beklediğimiz yer.

Bunlar GolfScript'in kıvrık operasyonlarıdır. Umarım takip etmekten keyif alırsınız!


1
Mükemmel aydınlanma!
Jonathan Van Matre

1

Yakut, 110

Sadece lazyyöntem nedeniyle Ruby 2.0 için :

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

Çıktı:

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

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

Algoritma basittir, $pönceki asal sayıyı hatırlar. Sonra $igider 3tipi $ i "üzerimde başarısız" veya taşmadan dolayı negatif olunca, up. $i2'den tüm bölücüler kontrol edilerek ham yol test edilir $i-1. Geçerli fark önceki yazdırılan farktan daha büyükse bir çizgi yazdırılır $d.

Bazı baytlarla çalışma süresi geliştirilebilir:

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

Sonuç başlar:

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
Bu doğru değil, artan boşlukları bulmanız gerekiyor. Örneğin beklenen çıktı için Ruby veya Matlab cevabına bakınız.
mmumboss

1
@mmumboss: Oh, bunu göz ardı ettim. Şimdi düzeltildi.
Heiko Oberdiek

Tüm değişkenlerin en az 2 karakter gerektirdiği bir dil için iyi.
orion

1

Python, 93 91 karakter

Saf prime kontrolü (2'den n(daha az karaktere n/2) bölünebilir olup olmadığını kontrol edin ):

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

İkinci girinti düzeyi bir sekme karakteridir.

Çıktı:

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

Güzel, ben nsadece kontrol kadar o aralığı unuttumn-1
Claudiu

1

Temel regex için Bash ve bazı Perl ( 1671515143122 bayt)

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

bazı çıktı:

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

Herhangi bir döngüyü ve kontrol yapısını tamamen atlatmak için regex'in NP geri izlemesini kullanmak saf mükemmelliktir. Ancak, testoldukça protesto ediyor ve benim için çalışmıyor. Ayrıca bazı kullanabilirsiniz let n++ve let f=c-pve değiştirme testile [. Ya da muhtemelen (())ihtiyaç duymadığınız $yerleri veya boşlukları test edin .
orion

test -n $dboş bir dize için true döndürdü. test -n "$d"iyiydi ama daha uzundu. Ancak, man sayfası -n'nin isteğe bağlı olduğunu ve test $dtamam olduğunu söylüyor . Ve bu yüzden [ $d ]de. Ve g = 0 başlatılmalıydı.
orion

@orion, bir nedenden ötürü üzgünüm, bir kez şimdi makinemde kırıldı, 167'ye geri döndüm. Diğer önerilerinizden bazılarını eklemeye çalışacağım
Newbrict

Ortamınızda önceden tanımlanmış değişkenler olabilir.
orion

@orion düzenlemenizin bir nedenle reddedildiğini yeniden düzenleyebilir misiniz?
Yenidoğan

1

Perl 95 90 bayt

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

eski olmayan golf versiyonu:

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

Bu benim diğer gönderime benzer, sans bash.


Can sıkıcı değilim, sadece bunun ne kadar ileri gidebileceğini görmek istiyorum. Burada: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 bu döngü kötüye kullanımı için ciddi bir haha!
Yenidoğan

1

C (100)

Kendi katkım, özel bir algoritma yok, sadece 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 karakter boşlukları yalnızca asal olmadan yazdırırsanız." - yazdırmayı kaldırırsanız rve pdaha az karaktere sahip olursanız ve bonus kazanırsanız :)
CompuChip

Tamamlama güzel :)
orion

1

Haskell, 134C

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

Bu tembel değerlendirmeyi seviyorum!
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);}

Ben her zamanki döngü Özyinelemeyi kullanılan forveya 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);
}

Çıktı:

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

Bu işe yaramıyor. true / false tanımlanmamıştır, ancak bunu düzeltsek bile yanlış boşluklar bildiriyor. Örneğin, 25219 ve 43237 arasında bir sürü LOT vardır. Özyinelemeniz leakingen üstte, çünkü isPrime (n2) testini yapmıyorsanız, n1 ve n2 arasında primerlere izin veriyorsunuz. Ve bu gerçekten düzeltilemez, çünkü primerleri karşılamadan n2'yi artıramazsınız.
orion

Haklısın! Bu yanlış! Düşüncem başından beri yanlıştı.
Loukas

1
Şimdi daha iyi .. :)
Loukas

+1 Artık düzeltildiğine göre, beğendim - hoş değil (verimli olmasa da). Çok golf olabilir. returnAna bölüme atlayın . Sonuncuyu atla else. &&-> &ve num%i==0ile değiştirin num%i<1. Ve eski c standartlarına göre (uyarılar olacaktır), void ve int işlevleri için dönüş değerlerini belirtmeniz gerekmez (argümanları varsayılan olarak int'dir).
orion

Biraz oynuyordum ve tek bir koşulsuz özyinelemeli çağrı, sadece bir tür belirleyici ( int) ve çok azaltılmış prime test fonksiyonu ile 151 karaktere düştüm : 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

Sadece soruda bunu fark ettim:

En düşük karakter sayısı kazanır. Boşlukları yalnızca asal olmadan yazdırırsanız +10 karakter.

Bu SQL olduğundan ve anahtar kelimeler çok uzun olduğu için, aşağıdakileri vererek cezayı almak daha iyidir. Orijinaliyle aynı fikir.

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

hangi gibi davranır:

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

Eski cevap (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)))

ve okunabilir bir biçimde:

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

Bu bir sayı üreteci yaratır c, en içteki alt seçim bir Eratosthenes Eleği kullanarak asal sayıları oluşturur, dış bir önceki asalı çalışır ve son olarak son seçim diğerini çıkarır.

Bu hiçbir şey döndürmez, çünkü 1 x 10 124 özyinelemeli sorgu gerçekleştirir ... Yani, eğer bu sayıyı mantıklı bir şeye düşürün.


Böyle bir meydan okuma söz konusu olduğunda, SQL'i çok fazla Turing-complete değil, Turing-obstinate olarak düşünüyorum.
Jonathan Van Matre

Ama edilir Torna tamamlama @Jonathan, bazen :-) "ilginç" var onu almak olsa?
Ben

Bunun Turing-complete olduğunu bilerek, jest yapmayı hedefliyordum. Görünüşe göre işareti kaçırdı. :) Her neyse, profilimde birkaç T-SQL cevabı var ... Oracle'ınızı getirin ve bir düello yapalım!
Jonathan Van Matre

0

D - 153 + 10 = 163

İsteyerek burada +10 cezasını alıyorum, çünkü karakter sayısı hala asalları bassaydımdan daha düşük.

Golfçü :

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

Okunabilir sürüm :

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 karakter

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

kısa versiyon:

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

Bu kodu tarayıcı konsolunuza kopyalayın. Maksimum sayı etrafta bir şey olduğu için sonsuza dek gibi olacak 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

C # 162 161 karakter

151 karakter + 10 ceza puanı = 161 karakter

Kısa versiyon:

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

Uzun versiyon:

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

Aslında 10 karakter cezası almak daha iyiydi, çünkü daha kısa yazı g(11 karakter cezası ile) daha p+" "+i+" "+g(penaltı olmadan 13 karakter).


0

Yakut 90 86 84 83 karakter

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

Bazı boole kısa devreleri, ifade değerlendirmesinin kötüye kullanılması vb.


0

C 248

Kod, ardışık asal sayıları a, b ile karşılaştırır ve daha sonra boşlukların g'den büyük olup olmadığını kontrol eder, ardından bir sonraki asal çiftini bulur.

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

Bu C ++, değil mi?
Zacharý

0

Haskell, 154144143123 123

Asal pErasthotenes bir elek kullanılarak oluşturulur #filtre edilir ve sonra üzerlerine baskı ve %.

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

Çıktı şöyle görünüyor

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

umarım iyidir.


0

Oyun Yapıcı Dili, 85

Başlatılmamış tüm değişkenler olarak kabul edilir 0(bu, Game Maker'ın bazı sürümlerinde varsayılan değerdir).

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

Game Maker Dili, 74 + 55 = 129

Başlatılmamış tüm değişkenler olarak kabul edilir 0(bu, Game Maker'ın bazı sürümlerinde varsayılan değerdir).

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

Komut dosyası paşağıdadır:

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

0

Perl, 87 bayt ( bir modül kullanarak )

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

Modülü yazdım, ama taksitli fazladan 565.000 karakter eklemek zorundayız. Çoğunlukla eğlenmek için gönderiyor, ancak şimdiye kadar builtins'i kullanmıyorum çünkü bir performans alternatifi vermek. 1e9'a boşluklar için 4.6s, 1e10'a boşluklar için 36s, 1e11 için 6.5 dakika.

Pari / GP 2.8, 2 kat daha yavaş da olsa temel olarak aynı şekilde yapılabilir:

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

-1

Perl 153

Kısa kod:

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

okuması kolay:

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

Bu, şimdiye kadarki en büyük boşluğu değil, tüm boşlukları ortaya çıkarır.
orion
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.