Yakındaki primer çıktıları


9

Girdi alan (asal olabilen veya olmayabilen) bir program yazın ve hemen ardından gelen ve ardından gelen asal listeyi listeleyin.

Örnek girdi:

1259

Örnek çıktı:

1249 1277

En kısa program kazanır. Modern bir masaüstü bilgisayarda 10 saniye içinde çalıştırılmalıdır. Girişler maksimum 10.000 ile sınırlı olacaktır.


2
Olası girdilerin aralığını da sınırlamaksızın bir zaman sınırını listelemek biraz garip görünüyor. On saniye içinde birkaç bin basamaklı asal bulmamıza gerek var mı?
Anon.

@Anon. Komik girdiler vermeyeceğim, ancak programın biraz optimize edilmesi gerektiğini varsayın. Soru metnini açıkladım.
Thomas O

benim tek astar optimal dışında bir şey, ama 10000 girişi için ~ 1s içinde çalışır. 10s gerçekten zor denemek zorunda.
ninjalj

@ninjalj Kesinlikle korkunç algoritmaları ayıklamak için.
Thomas O

3
uzun nbir dize nkarakterleri oluşturarak ve bunu kesinlikle korkunç bir regex karşı test ederek bir ilkelik için bir sayı test düşünmüyor musunuz?
ninjalj

Yanıtlar:


6

Perl 5.10 (perl-E), 65 karakter

Kredinin yarısı (en azından) @J B'ye gitmelidir.

$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~/^1$|(^11+)\1+$/;say$n}

Güzel! en iyi test düzenli ifadesi!
Ming-Tang


Görünen bir regex ile birkaç karakter kaydedebilirsiniz ( qrdaha sonra sınırlayıcılara ihtiyaç duymadığı için -4, -4).
Anon.

Aslında, olmadan çalışır qr. LMGTFY: 81 karakter$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB

İkinci tur, her iki kalıp eşleşmesini perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB


10

Mathematica: 28 karakter

(k=NextPrime;{k[#,-1],k@#})&  

kullanım

%[1259]
{1249, 1277}  

%[121231313159]  
{121231313129, 121231313191}

3

Python - 93

FR0DDY'nin cevabına dayanarak . Temel olarak 4 ve 5 numaralı satırları birleştirdim ve 2 numaralı satırı farklı bir yöntem kullanarak kısalttım.

n=input()-1
m=n+2
f=lambda n:any(n%x<1for x in range(2,n))
exec"n-=f(n);m+=f(m);"*m
print n,m

2

Python 116 111 109 Karakterler

n=input()-1
m=n+2
f=lambda n:any(pow(b,n-1,n)>1for b in(3,5,7,13))
while f(n):n-=1
while f(m):m+=1
print n,m

1
kullanımıf=lambda n:not(all(pow(b,n-1,n)<2for b in(3,5,7,13)))
st0le

@ fR0DDY, ilk 3 satır yerine kullanın n=input()-1ve m=n+23 karakter kaydeder ... sanırım.
st0le

ve belki yerini alabilir not(all(...))tarafından any(...)Boolean tersine
st0le

Yeni satır saymazsınız. Gerçek sayım 108.
JPvdMerwe

1
Ayrıca, lütfen karakter sayınızdaki yeni satırları sayın. Başkalarını aldatmak için -1.
moinudin


1

Haskell: 99

s(z:y)=z:s[x|x<-y,mod x z>0];f(x:y:z:w)=(x,z):f(y:z:w);p x=(head.filter(\(c,v)->c<x&&v>x).f.s)[2..]

Misal

Main> p 1259
(1249,1277)

1

Python, 116 139 karakter (çift girinti sekmesi-char)

Eratosthenes'in Elekini Kullanır

Düzenlemeler ve (teşekkürler bir TON @JPvdMerwe). Şimdi asallarla çalışmalı.

l=n=input();a=range(n*2)
for i in a[2:]:a=[k for k in a if k==i or k%i]
for g in a:
 if g>n:print l,g;break
 if i!=n:l=g

orijinal

a=range(9999)
j=lambda a,n:[i for i in a if i==n or i%n]
for i in a[2:]:a=j(a,i)
o=n=input();
for i in a:
 if o<n and i>n: 
  print o,i
 o=i

-1 GEREKLİ beyaz alanı saymamak için .
JPvdMerwe

@JPvdMerwe Benim hatam, burada yeniyim ve editörümden yanlış metriği kullanmış olabileceğimi fark ettim.
Doug T.

@JPvDMerwe ayrıca düzenlemeler için yardım için teşekkürler
Doug T.

@DougT cool herkes hata yapar :) +1 Aşağı oyumu tersine çevirmek için bir dahaki sefere emin olun.
JPvdMerwe

Yapabileceğiniz bir numara, 1-3 numaralı satırları 4. satırın altına taşımak ve a=range(9999)onunla değiştirmek a=range(n). Ayrıca 2. satırda alambda'ya geçmek zorunda değilsiniz, sadece kullanabilirsiniz. Bu çok tıraş olmalı.
JPvdMerwe

1

Scala 119:

def p(n:Int)=(2 to n-1).exists(n%_==0)
def i(n:Int,v:Int):Int=if(!p(n+v))n+v else i(n+v,v)
Seq(-1,1).map(i(readInt,_))

ungolfed:

def notPrime (n:Int) = 
    (2 to n-1).exists (n % _ == 0)

def itPrime (n: Int, vector:Int) : Int =
    if (! notPrime (n+vector)) n+vector
    else itPrime (n+vector, vector)

def nearbyPrime (value: Int) =
    Seq (-1, 1).map (sign => itPrime (value, sign))

3 ila 10.000 arasında 9998 interin tümünü çalıştırmak için 21.2s



1

Swift 190 187 185 110

Swift, kod golfünde çok kötü, ama yine de denedim: D
Gittikçe kısalıyor ... ( @HermanLauenstein sayesinde) 75 bayt kaldırdığı )

var a=Int(readLine()!)!;for b in[-1,1]{var n=a,c=0;while c<1{n+=b;c=1;for i in 2..<n{if n%i<1{c=0}}};print(n)}

Çok fazla yeniden yapılandırmaya sahip -75 bayt var a=Int(readLine()!)!;for b in[-1,1]{var n=a,c=0;while c<1{n+=b;c=1;for i in 2..<n{if n%i<1{c=0}}};print(n)}(Henüz doğru bir şekilde test etmedim)
Herman L

Teşekkürler @HermanLauenstein. Bu benim ilk kod golf, bu yüzden her yardıma ihtiyacım olabilir :)
Josef Zoller

0

Python (123)

import Primes as p
j=i=int(input())
n=p.primes(i*2)
while not i in n[:]:
 i+=1
print(i)
while not j in n[:]:
 j-=1
print(j)

NOT: PrimesModül benim tarafımdan yazılmıştı ama bu soru sorulmadan önce vardı. Bunun için yazılmadı. Bununla birlikte, bu haksız kabul edildi, bu yüzden güncellenmiş sürüm.

Python (215)

j=i=int(input())
import math as m
s=list(range(i*2))
for n in s[:]:
 for l in range(1,int(m.ceil(m.sqrt(n)))):
  if(n%l)==0and l!=1and n in s:s.remove(n)
while not i in s:i+=1
print(i)
while not j in s:j-=1
print(j)


Ayrıca, @John, modül artık dilin bir parçası değilse, adillik açısından kodu eklemelisiniz. Ama dürüstlük üzerine Kudos.
JPvdMerwe

Bence kullanmak hile yapıyor Primes; kod golf ruhuna karşı.
Thomas O

@JPv: Ha. O was yanlış. Bunun nasıl olduğunu merak ediyorum.
John

@Thomas, @JPv: İçe aktarma olmadan güncellenmiş bir sürüm yayınladım.
John



0

C (gcc) , 98 bayt

p(n,i){for(i=2;i<n;)n=n%i++?n:0;i=n;}g(n,d){for(;!p(n+=d););printf("%d ",n);}f(n){g(n,-1);g(n,1);}

Çevrimiçi deneyin!

Tam program sürümü, C (gcc) , 116 bayt

p(n,i){for(i=2;i<n;)n=n%i++?n:0;i=n;}g(n,d){for(;!p(n+=d););printf("%d ",n);}main(n){scanf("%d",&n);g(n,-1);g(n,1);}

Çevrimiçi deneyin!

Her iki sürümde de, yalnızca girişin 2 veya daha düşük olması durumunda gerçekleşen ilkeliğe karşı hiçbir zaman test edilmediğimizi varsayıyoruz, bu durumda çıktı yine de tanımsız olacaktır.

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.