Đầu ra số nguyên tố gần đó


9

Viết chương trình lấy một đầu vào (có thể có hoặc không phải là số nguyên tố) và liệt kê các số nguyên tố ngay sau đó và trước nó.

Ví dụ đầu vào:

1259

Ví dụ đầu ra:

1249 1277

Chương trình ngắn nhất sẽ thắng. Phải thực hiện trong vòng 10 giây trên máy tính để bàn hiện đại. Đầu vào sẽ được giới hạn tối đa 10.000.


2
Có vẻ hơi kỳ quặc khi liệt kê một giới hạn thời gian mà không giới hạn phạm vi đầu vào có thể. Chúng tôi có bắt buộc phải tìm các số nguyên tố vài nghìn chữ số trong vòng mười giây không?
Anon.

@Anon. Giả sử tôi sẽ không đưa ra đầu vào vô lý, nhưng chương trình phải được tối ưu hóa phần nào. Tôi đã làm rõ văn bản câu hỏi.
Thomas O

một lớp lót của tôi là bất cứ điều gì ngoại trừ tối ưu, nhưng nó chạy trong ~ 1 giây cho đầu vào 10000. Bạn phải cố gắng rất nhiều để cần 10 giây.
ninjalj

@ninjalj Chỉ cần loại bỏ các thuật toán hoàn toàn khủng khiếp.
Thomas O

3
Vì vậy, bạn không xem xét việc kiểm tra một số nnguyên thủy bằng cách tạo ra một chuỗi nký tự dài và kiểm tra điều đó theo regex hoàn toàn khủng khiếp?
ninjalj

Câu trả lời:


6

Perl 5.10 (perl -E), 65 ký tự

Một nửa tín dụng (ít nhất) nên vào @J B.

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

đẹp! regex thử nghiệm chính!
Ming-Tang

vâng, tôi đã tìm hiểu về nó tại stackoverflow.com/questions/3543811/code-golf-happy-primes
ninjalj

Có vẻ như bạn có thể lưu một vài ký tự với biểu thức chính được trích dẫn (+2 cho qr, -4 vì không cần các dấu phân cách sau).
Anon.

Trên thực tế, nó hoạt động mà không có qr. LMGTFY: 81 ký tự$m=$n=<>;$p='^1$|(^11+)\1+$';0while(1x--$m)=~$p;0while(1x++$n)=~$p;print"$m $n$/"
JB

Vòng thứ hai, bao thanh toán cả hai mẫu khớp (66 ký tự):perl -E'$m=<>;for(-1,1){$n=$m;0while(1x($n+=$_))=~q<^1$|(^11+)\1+$>;say$n}'
JB


10

Toán học: 28 ký tự

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

Sử dụng

%[1259]
{1249, 1277}  

%[121231313159]  
{121231313129, 121231313191}

3

Con trăn - 93

Dựa trên câu trả lời của fR0DDY . Về cơ bản, tôi đã hợp nhất các dòng 4 và 5 và rút ngắn dòng 2 bằng cách sử dụng một phương pháp khác.

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 Ký tự

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
sử dụngf=lambda n:not(all(pow(b,n-1,n)<2for b in(3,5,7,13)))
st0le

@ fR0DDY, thay vì 3 dòng đầu tiên sử dụng n=input()-1m=n+2, tiết kiệm 3 ký tự ... tôi nghĩ vậy.
st0le

và có lẽ bạn có thể thay thế not(all(...))bằng cách any(...)đảo ngược các
booleans

Bạn không đếm dòng mới. Số lượng thực tế là 108.
JPvdMerwe

1
Ngoài ra, xin vui lòng đếm dòng mới trong số lượng nhân vật của bạn. -1 để lừa dối người khác.
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..]

Thí dụ

Main> p 1259
(1249,1277)

1

Python, 116 139 ký tự (thụt đôi là tab-char)

Sử dụng tốt ole Sàng của Eratosthenes

Chỉnh sửa và (cảm ơn TON @JPvdMerwe). Nên làm việc với số nguyên tố bây giờ.

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

Nguyên

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 Không tính khoảng trắng CẦN THIẾT .
JPvdMerwe

@JPvdMerwe Lỗi của tôi, tôi mới ở đây và tôi nhận ra mình có thể đã sử dụng sai số liệu từ trình chỉnh sửa của mình.
Doug T.

@JPvDMerwe cũng cảm ơn vì sự giúp đỡ về các chỉnh sửa
Doug T.

@DougT tuyệt vời mọi người đều mắc lỗi :) +1 Để đảo ngược phiếu bầu của tôi, chỉ cần đảm bảo lần sau.
JPvdMerwe

Một mẹo bạn có thể làm là di chuyển các dòng 1-3 bên dưới dòng 4 và thay thế a=range(9999)bằng a=range(n). Ngoài ra trong dòng 2 bạn không cần phải chuyển qua alambda, bạn chỉ có thể sử dụng nó. Điều này sẽ cạo đi rất nhiều.
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,_))

vô dụng:

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,2 giây để chạy tất cả 9998 int từ 3 ​​đến 10.000



1

Swift 190 187 185 110

Swift rất tệ trong môn đánh gôn, nhưng dù sao tôi cũng đã thử: D
Nó ngày càng ngắn hơn ... (Cảm ơn @HermanLauenstein vì đã xóa 75 byte)

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 byte với rất nhiều cấu trúc lại 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)}(Tôi chưa kiểm tra đúng cách)
Herman L

Cảm ơn @HermanLauenstein. Đây là môn đánh gôn đầu tiên của tôi, vì vậy tôi có thể cần mọi sự giúp đỡ :)
Josef Zoller

0

Con trăn (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)

LƯU Ý: PrimesMô-đun được viết bởi tôi nhưng nó đã tồn tại trước khi câu hỏi này được hỏi. Nó KHÔNG được viết cho điều này. Tuy nhiên, điều này được coi là không công bằng, vì vậy đây là phiên bản cập nhật.

Con trăn (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)

Tôi không biết làm thế nào bạn quản lý để tính sai của bạn nhưng thực tế nó là:123
JPvdMerwe

Ngoài ra, @John trừ khi mô-đun bây giờ là một phần của ngôn ngữ, vì lợi ích của sự công bằng, bạn nên bao gồm mã. Nhưng Kudos về sự trung thực.
JPvdMerwe

Tôi nghĩ rằng nó gian lận để sử dụng Primes; chống lại tinh thần của mã golf.
Thomas O

@JPv: Hừ. Đó sai. Tôi tự hỏi làm thế nào điều đó xảy ra.
Giăng

@Thomas, @JPv: Tôi đã đăng một phiên bản cập nhật mà không cần nhập.
Giăng



0

C (gcc) , 98 byte

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

Hãy thử trực tuyến!

Phiên bản chương trình đầy đủ, C (gcc) , 116 byte

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

Hãy thử trực tuyến!

Cả hai phiên bản đều cho rằng chúng tôi không bao giờ kiểm tra tính nguyên thủy 1, điều này chỉ xảy ra nếu đầu vào là 2 hoặc thấp hơn, trong trường hợp đó đầu ra sẽ không được xác định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.