输出附近的素数


9

编写一个接受输入(可能是也可能不是素数)的程序,并列出紧随其后的立即质数。

输入示例:

1259

输出示例:

1249 1277

最短的程序获胜。必须在现代台式机上在10秒内执行。输入上限为10,000。


2
列出时间限制而不限制可能的输入范围似乎有些奇怪。我们是否需要在十秒钟内找到数千个质数?
Anon。

@Anon。假设我不会提供荒谬的输入,但是必须对程序进行一定程度的优化。我已经澄清了问题文本。
Thomas O

我的单线不是最佳选择,但是输入10000时,它的运行时间约为1秒。您必须非常努力地需要10秒。
ninjalj 2011年

@ninjalj只是淘汰绝对糟糕的算法。
Thomas O

3
因此,您不考虑n通过创建n长字符串并针对正则表达式进行绝对测试来测试数字的素数?
ninjalj 2011年

Answers:


6

Perl 5.10(perl -E),65个字符

至少一半的学分应归功于@JB。

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

真好!总理测试正则表达式!
Ming-Tang


似乎您可以用引号引起来保存几个字符(+2表示qr-4,以后不需要分隔符了)。
Anon。

实际上,它无需即可使用qr。LMGTFY:81个字符$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB

第二轮,考虑了两个模式匹配(66个字符):perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB


10

Mathematica:28个字符

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

用法

%[1259]
{1249, 1277}  

%[121231313159]  
{121231313129, 121231313191}

3

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

Python 116111109 字符

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

@ fR0DDY,而不是前3行使用n=input()-1m=n+2,节省了3个字符...我认为。
st0le 2011年

也许您可以not(all(...))通过any(...)反转布尔值来代替
st0le 2011年

您不计算新行。实际计数为108
JPvdMerwe 2011年

1
另外,请在字符数中加上换行符。-1用于欺骗他人。
moinudin 2011年


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

Main> p 1259
(1249,1277)

1

Python,116 139个字符(双缩进是制表符)

使用Eratosthenes的优质ole筛

编辑和(感谢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不计算必要的空格。
JPvdMerwe 2011年

@JPvdMerwe我的错,我是新来的,我意识到我可能使用了编辑器中的错误指标。
Doug T.

@JPvDMerwe也感谢您提供的编辑帮助
Doug T.

@DougT很酷,每个人都会犯一个错误:) +1要撤消我的不赞成票,只需确保下次即可。
JPvdMerwe 2011年

您可以采取的一种技巧是将1-3行移至4行下方,并替换a=range(9999)a=range(n)。同样在第2行中,您不需要传递a给lambda,您可以使用它。这应该可以省很多。
JPvdMerwe 2011年

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

21.2s可以将3998的所有 9998整数运行到10.000



1

夫特190 187 185 110

Swift在代码高尔夫球中非常糟糕,但是我还是尝试了:D
它越来越短了……(感谢@HermanLauenstein删除了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)}

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

另外,@ John除非模块现在是语言的一部分,否则为了公平起见,您应该包括代码。但荣誉的诚实。
JPvdMerwe 2011年

我认为使用起来很欺骗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或更低的情况下才会发生,在这种情况下,输出将始终是未定义的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.