近くの素数を出力する


9

入力(素数である場合もそうでない場合もある)を取り、直後および直後の素数をリストするプログラムを記述します。

入力例:

1259

出力例:

1249 1277

最短のプログラムが勝ちます。最新のデスクトップPCでは10秒以内に実行する必要があります。入力は最大10,000に制限されます。


2
可能な入力の範囲を制限することなく時間制限をリストするのは少し奇妙に思われます。10秒以内に数千桁の素数を見つける必要がありますか?
アノン。

@Anon。私はばかげた入力を与えないと仮定しますが、プログラムは多少最適化されている必要があります。質問文を明確にしました。
Thomas O、

私のワンライナーは最適ではありませんが、10000の入力に対して〜1秒で実行されます。10秒を必要とするためには、本当に一生懸命に努力する必要があります。
ninjalj

@ninjalj絶対にひどいアルゴリズムを排除するためだけに。
Thomas O

3
したがってn、文字列n文字を長く作成して素数性をテストし、それを正規表現に対して絶対にひどくテストすることを検討しませんか?
ninjalj

回答:


6

Perl 5.10(perl -E)、65文字

(少なくとも)クレジットの半分は@J Bに送られるべきです。

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

いいね!プライムテスト正規表現!
Ming-Tang


引用符で囲まれた正規表現でいくつかの文字を保存できるようです(+2はqr、-4は区切り文字を後で必要としないため)。
アノン。

実際には、なしで動作しqrます。LMGTFY:81文字$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB

2番目のラウンド、両方のパターンマッチ(66文字)を考慮:perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB



3

パイソン-93

基づいてfR0DDYによって答え。基本的に、4行目と5行目をマージし、別の方法を使用して2行目を短くしました。

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

パイソン116 111 109文字

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
使用f=lambda n:not(all(pow(b,n-1,n)<2for b in(3,5,7,13)))
st0le

@ fR0DDYは、最初の3行でn=input()-1andを使用する代わりに、m=n+23文字を節約します...
st0le

そして多分あなたは置き換えることができますnot(all(...))によってany(...)ブール値を反転させる
st0le

新しい行は数えません。実際の数は108です。
JPvdMerwe

1
また、改行も文字数に含めてください。他人をだますための-1。
モイヌディン


1

ハスケル: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..]

Main> p 1259
(1249,1277)

1

Python、116 139文字(二重インデントはタブ文字)

エラトステネスの良質のふるいを使用

編集および(TON @JPvdMerweに感謝)。今すぐ素数で動作するはずです。

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

元の

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の場合はカウントされませんNECESSARY空白を。
JPvdMerwe

@JPvdMerwe私のせいで、私はここに新しいので、エディタから間違ったメトリックを使用した可能性があることに気付きました。
Doug T.

@JPvDMerweは、編集に関するヘルプにも感謝します
Doug T.

@DougTクールみんなが間違えます:) +1私の反対票を取り消すには、次の機会に確認してください。
JPvdMerwe

あなたができるトリックの1つは、1〜3行目を4行目の下に移動し、で置き換えるa=range(9999)ことa=range(n)です。また、2行目でaはラムダに渡す必要はなく、そのまま使用できます。これはかなりひげをそるはずです。
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,_))

ゴルフなし:

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から10.000までのすべての 9998 int を実行する21.2s



1

スウィフト190 187 185 110

Swiftはコードゴルフで非常に悪いですが、私はとにかくそれを試しました:D
どんどん短くなっています...(75バイトを削除してくれた@HermanLauensteinに感謝します)

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

-75バイト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)}(多くの再構築あり)(まだ適切にテストしていません)
Herman L

@HermanLauensteinに感謝します。それは私の最初のコードゴルフなので、私はあらゆる助けが必要になるかもしれません:)
Josef Zoller

0

パイソン(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)

注:Primesモジュールは私が作成しましたが、この質問が尋ねられる前に存在していました。これは書かれていません。それにもかかわらず、これは不公平であると見なされたので、ここに更新されたバージョンがあります。

パイソン(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)

私はあなたのカウントが間違っを得ることができたのか分からないが、それは実際にあります:123
JPvdMerwe

また、モジュールが現在言語の一部でない限り、@ Johnは公平を期すためにコードを含める必要があります。しかし、正直に称賛。
JPvdMerwe

私はそれを使用するのはごまかしだと思いますPrimes。コードゴルフの精神に反する。
Thomas O

@JPv:うん。それ間違っていました。どうしてこうなったのかな。
ジョン

@ Thomas、@ JPv:インポートなしの更新バージョンを投稿しました。
ジョン



0

C(gcc)、98バイト

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

オンラインでお試しください!

完全なプログラムバージョン、C(gcc)、116バイト

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

オンラインでお試しください!

どちらのバージョンも、素数性について1をテストしないことを前提としています。これは、入力が2以下の場合にのみ発生します。この場合、出力はいずれにしても未定義になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.