주변 프라임 출력


9

입력을 취하는 (프라임 일 수도 있고 아닐 수도있는) 프로그램을 작성하고 그 다음에 바로 오는 프라임을 나열합니다.

입력 예 :

1259

출력 예 :

1249 1277

최단 프로그램이 이깁니다. 최신 데스크탑 PC에서 10 초 이내에 실행해야합니다. 입력은 최대 10,000으로 제한됩니다.


2
가능한 입력 범위를 제한하지 않고 시간 제한을 나열하는 것이 다소 이상해 보입니다. 10 초 내에 수천 자리 소수를 찾아야합니까?
아논.

@곧. 내가 우스운 입력을하지 않겠다고 가정하지만 프로그램은 다소 최적화되어야합니다. 질문 텍스트를 명확히했습니다.
토마스 오

내 one-liner는 최적의 것이지만 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


인용 된 정규 표현식으로 두 문자를 저장할 수있는 것처럼 보입니다 ( qr뒤에 구분 기호가 필요하지 않은 경우 +4, 뒤에 -4).
아논.

실제로, 그것은없이 작동합니다 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

매스 매 티카 : 28 자

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

용법

%[1259]
{1249, 1277}  

%[121231313159]  
{121231313129, 121231313191}

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()-1및을 사용 하여 3자를 m=n+2저장합니다 ... 생각합니다.
st0le

어쩌면 부울 not(all(...))any(...)뒤집어 대체 할 수도 있습니다
st0le

새로운 줄을 세지 마십시오. 실제 개수는 108입니다.
JPvdMerwe

1
또한 문자 수로 줄 바꿈을 계산하십시오. 다른 사람을 속이는 경우 -1입니다.
moinudin


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, 116139 자 (이중 들여 쓰기는 tab-char 임)

에라토스테네스의 좋은 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 NECESSARY 공백을 계산하지 않습니다 .
JPvdMerwe

@JPvdMerwe 내 잘못, 나는 여기 새로 왔고, 나는 에디터에서 잘못된 메트릭을 사용했을 수도 있다는 것을 깨달았다.
Doug T.

@JPvDMerwe 또한 편집에 대한 도움에 감사드립니다
Doug T.

@DougT cool 모두가 실수합니다 :) +1 내 다운 투표를 취소하려면 다음에 확인하십시오.
JPvdMerwe

당신이 할 수있는 한 가지 트릭은 라인 1-3을 라인 4 아래로 옮기고로 대체 a=range(9999)하는 것 a=range(n)입니다. 또한 2 행 a에서 람다 로 전달할 필요가 없습니다 . 이것은 많이 면도해야합니다.
JPvdMerwe

1

스칼라 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 정수 를 실행 하는 21.2 초



1

신속한 190 187 185 110

스위프트는 코드 골프에서 매우 나쁘지만 어쨌든 시도했습니다 : 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
했는지 모르겠지만

또한 모듈이 이제 언어의 일부가 아닌 경우 @John은 공정성을 위해 코드를 포함시켜야합니다. 그러나 정직에 대한 쿠도스.
JPvdMerwe

나는 그것이 부정 행위를하는 것을 생각한다 Primes; 코드 골프의 정신에 위배됩니다.
토마스 오

@JPv : 허. 그것은 이었다 잘못. 어떻게 된 일인지 궁금합니다.
John

@Thomas, @JPv : 가져 오기없이 업데이트 된 버전을 게시했습니다.
John



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에 대해 1을 테스트하지 않는다고 가정합니다. 입력이 2 이하인 경우에만 발생하며,이 경우 출력은 정의되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.