AWK - 129 ไบต์
... oookay ... นานเกินไปที่จะชนะคะแนนสำหรับความเป็นปึกแผ่น ... แต่บางทีมันอาจได้รับเกียรติจากความเร็ว
x
ไฟล์:
BEGIN{n=2;i=0;while(n<1366662){if(n in L){p=L[n];del L[n]}else{P[p=n]=++i;if(i in P)print n}j=n+p;while(j in L)j=j+p;L[j]=p;n++}}
วิ่ง:
$ awk -f x | nl | tail
9991 1365913
9992 1365983
9993 1366019
9994 1366187
9995 1366327
9996 1366433
9997 1366483
9998 1366531
9999 1366609
10000 1366661
อ่านได้:
BEGIN {
n=2
i=0
while( n<1366662 ) {
if( n in L ) {
p=L[n]
del L[n]
} else {
P[p=n]=++i
if( i in P ) print n
}
j=n+p
while( j in L ) j=j+p
L[j]=p
n++
}
}
โปรแกรมคำนวณกระแสของช่วงเวลาที่ใช้L
เป็น "เทปตัวเลข" ถือพบช่วงเวลาที่กระโดดไปรอบ ๆL
เพื่อตั้งค่าสถานะตัวเลขที่รู้จักกันแล้วมีตัวหาร ช่วงเวลาที่กระโดดเหล่านี้จะเพิ่มขึ้นในขณะที่ "เทปตัวเลข" L
ถูกตัดออกไปตามหมายเลขตั้งแต่ต้น
ในขณะที่กำลังตัดส่วนหัวของเทปL[n]
ที่ว่างเปล่าหมายความว่าไม่มีตัวหาร (นายก) ที่รู้จัก
L[n]
n
ถือเป็นค่าหมายถึงค่านี้เป็นสำคัญและเป็นที่รู้จักในการแบ่ง
ดังนั้นเราจึงได้พบตัวหารเอกหรือนายกใหม่ จากนั้นนายกรัฐมนตรีจะถูกเลื่อนไปL[n+m*p]
ยังเทปถัดไปบนเทปที่ว่างเปล่า
นี่เป็นเหมือน Sieve of Eratosthenes "ดึงขวด Klein ผ่าน" คุณมักจะทำในการเริ่มต้นเทป แทนที่จะใช้จำนวนทวีคูณของเทปผ่านเทปคุณจะใช้ช่วงเวลาที่พบแล้วเมื่อเคอร์เซอร์กระโดดออกจากเทปโดยเริ่มจากระยะทางหลายระยะของค่าของตัวเองจนกว่าจะพบตำแหน่งว่าง
ในขณะที่ลูปด้านนอกสร้างการแยกเฉพาะไพร์มมิ่งหนึ่งไพร์มมิ่งต่อลูป แต่จำนวนเฉพาะที่พบจะนับและเก็บไว้ในP
คีย์ค่าของคู่นี้ (คีย์ค่า) ไม่เกี่ยวข้องกับโฟลว์ของโปรแกรม
หากคีย์ของพวกเขาi
เกิดขึ้นP
แล้ว ( i in P
) เรามีสายพันธุ์ที่สำคัญของ p (p (i))
วิ่ง:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
พิจารณาว่ารหัสนี้ไม่ได้ใช้ตารางสำคัญที่คำนวณล่วงหน้าภายนอก
ใช้เวลากับ Thinkpad T60 อันเก่าของฉันดังนั้นฉันคิดว่ามันสมควรที่จะถูกเรียกอย่างรวดเร็ว
ทดสอบกับmawk
และgawk
บน Debian8 / AMD64