ผลผลิตเฉพาะช่วงเวลาใกล้เคียง


9

เขียนโปรแกรมที่รับอินพุต (ซึ่งอาจจะใช่หรือไม่ใช่ไพร์ม) และทำรายการไพรม์ทันทีที่ตามมาและนำหน้ามัน

อินพุตตัวอย่าง:

1259

ตัวอย่างผลลัพธ์:

1249 1277

โปรแกรมที่สั้นที่สุดชนะ ต้องดำเนินการภายใน 10 วินาทีบนเดสก์ท็อปพีซีที่ทันสมัย อินพุตจะ จำกัด สูงสุด 10,000


2
ดูเหมือนว่าค่อนข้างแปลกที่จะแสดงรายการการ จำกัด เวลาโดยไม่มีการ จำกัด ช่วงของอินพุตที่เป็นไปได้ เราจำเป็นต้องค้นหาช่วงเวลาหลายพันหลักภายในสิบวินาทีหรือไม่?
อานนท์

@Anon สมมติว่าฉันจะไม่ให้อินพุตที่ไร้สาระ แต่โปรแกรมจะต้องปรับให้เหมาะสม ฉันได้ชี้แจงข้อความคำถาม
โทมัส O

หนึ่งซับของฉันคืออะไร แต่ที่ดีที่สุด แต่มันทำงานใน ~ 1s สำหรับอินพุต 10,000 คุณต้องพยายามอย่างหนักเพื่อต้องการ 10 วินาที
ninjalj

@ninjalj เพียงเพื่อกำจัดอัลกอริทึมที่น่ากลัวอย่างแน่นอน
โทมัสโอ

3
ดังนั้นคุณไม่ได้ลองทดสอบจำนวนnสำหรับ primality ด้วยการสร้างnตัวอักขระสตริงยาว ๆ และทดสอบกับ regex อันยิ่งใหญ่อย่างนั้นหรือ
ninjalj

คำตอบ:


6

Perl 5.10 (perl -E), 65 ตัวอักษร

เครดิตครึ่งหนึ่ง (อย่างน้อย) ควรไปที่ @J B.

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

ดี! การทดสอบ regex สำคัญ!
Ming-Tang

ใช่ฉันเรียนรู้เกี่ยวกับมันที่stackoverflow.com/questions/3543811/code-golf-happy-primes
ninjalj

ดูเหมือนว่าคุณสามารถบันทึกอักขระสองสามตัวด้วย regex ที่ยกมา (+2 สำหรับqr, -4 สำหรับการไม่ต้องการตัวคั่นในภายหลัง)
อานนท์

qrที่จริงมันทำงานโดยไม่ต้อง LMGTFY: 81 chars$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



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 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และm=n+2ประหยัด 3 ตัวอักษร ... ฉันคิดว่า
st0le

และบางทีคุณสามารถแทนที่not(all(...))โดยany(...)การกลับรายการบูล
st0le

คุณไม่นับบรรทัดใหม่ 108นับเป็นจริง
JPvdMerwe

1
นอกจากนี้โปรดนับบรรทัดใหม่ในการนับตัวละครของคุณ -1 สำหรับการหลอกลวงผู้อื่น
moinudin



1

Python 116 139 chars (เยื้องคู่คือ tab-char)

ใช้ Sieve of Eratosthenes โดยตรง

แก้ไขและ (ขอบคุณ 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

@JPvdMerwe ความผิดของฉันฉันใหม่ที่นี่และฉันรู้ว่าฉันอาจใช้ตัวชี้วัดที่ไม่ถูกต้องจากเครื่องมือแก้ไขของฉัน
Doug T.

@JPvDMer เราขอขอบคุณสำหรับความช่วยเหลือในการแก้ไขด้วย
Doug T.

@DougT เจ๋งทุกคนทำผิด :) +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,_))

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

21.2s เพื่อเรียกใช้int ทั้งหมด 9998 จาก 3 เป็น 10.000



1

สวิฟต์190 187 185 110

สวิฟท์นั้นแย่มากในการเขียนโค้ดกอล์ฟ แต่ฉันก็ลองทำดู: 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 มันเป็นครั้งแรกรหัสกอล์ฟของฉันดังนั้นฉันสามารถทุกความต้องการความช่วยเหลือ :)
โจเซฟ 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)

หมายเหตุ: 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; ต่อต้านวิญญาณของรหัสกอล์ฟ
โทมัส 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.