รายชื่อของจำนวนเฉพาะภายใต้หนึ่งล้าน


56

นี่เป็นคำถามเกี่ยวกับกอล์ฟรหัสแรกของฉันและเป็นคำถามที่ง่ายมากดังนั้นฉันจึงขออภัยล่วงหน้าหากฉันอาจทำผิดหลักเกณฑ์ของชุมชน

งานคือการพิมพ์ออกมาตามลำดับจำนวนเฉพาะทั้งหมดน้อยกว่าหนึ่งล้าน รูปแบบเอาต์พุตควรเป็นหนึ่งหมายเลขต่อหนึ่งบรรทัดของเอาต์พุต

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


12
มันไม่เหมือนกันจริง ๆ แต่เป็นการทดสอบเบื้องต้นซึ่งเป็นองค์ประกอบของคำถามที่มีอยู่จำนวนมาก (เช่นcodegolf.stackexchange.com/questions/113 , codegolf.stackexchange.com/questions/5087 , codegolf.stackexchange com / คำถาม / 1977 ) FWIW หนึ่งแนวทางที่ไม่เพียงพอ (แม้โดยผู้ที่ควรรู้ดีกว่า) คือการเสนอคำถามล่วงหน้าใน meta sandbox meta.codegolf.stackexchange.com/questions/423สำหรับการวิจารณ์และการอภิปรายว่าสามารถเป็นอย่างไร ปรับปรุงก่อนที่ผู้คนจะเริ่มตอบคำถาม
Peter Taylor

อาใช่ฉันเป็นกังวลเกี่ยวกับคำถามนี้คล้ายกับคำถามมากมายที่เกี่ยวข้องจำนวนมากอยู่แล้ว
Delan Azabani

2
@ GlennRanders-Pehrson เพราะ10^6สั้นกว่า;)
14ıʇǝɥʇuʎs

1
ไม่กี่ปีที่ผ่านมาฉันส่งรายการ IOCCC ที่พิมพ์เฉพาะช่วงเวลาด้วยอักขระ 68 ตัวใน C เท่านั้นโชคไม่ดีที่มันหยุดแค่หนึ่งล้าน แต่มันอาจเป็นที่สนใจสำหรับบางคน: computronium.org/ioccc.html
Computronium

1
@ ɐɔıʇǝɥʇuʎsวิธีการเกี่ยวกับ1e6:-D
Titus

คำตอบ:


33

Mathematica , 17 24

เพื่อการเปรียบเทียบ:

Prime@Range@78498

ตามที่ระบุไว้ในความคิดเห็นฉันล้มเหลวในการให้หนึ่งนายกต่อบรรทัด; การแก้ไข:

Column@Prime@Range@78498

4
Prime~Array~78498ยัง 17 :)
chyanog

น่าจะเป็นเก้าไบต์ใน mthmca หากถูกปล่อยออกมา
Michael Stern

ที่ละเมิดเงื่อนไขของหนึ่งไพรม์ต่อบรรทัดของเอาต์พุต คำนำหน้าด้วยPrint/@และยกเลิกด้วย;เพื่อป้องกันไม่ให้เอาต์พุตของรายการNullแก้ไขแบบยาวที่ค่าใช้จ่ายของ 8 อักขระพิเศษ
celtschk

@celtschk ฉันไม่ทราบว่าฉันพลาดหรือเพิกเฉยเมื่อห้าปีที่แล้ว
Mr.Wizard

1
ฉันพลาดแน่นอนเมื่อห้าปีที่แล้ว :-)
celtschk

27

Python 3, 46 ไบต์

k=P=1
while k<1e6:P%k and print(k);P*=k*k;k+=1

ตามเวลาที่ห่วงถึงการทดสอบจะได้คำนวณซ้ำยืดปัจจัยk P=(k-1)!^2หากkเป็นสำคัญแล้วก็ไม่ปรากฏในสินค้าดังนั้นจึงไม่ได้เป็นปัจจัยของ1 * 2 * ... * (k-1) Pแต่ถ้ามันประกอบไปด้วยปัจจัยสำคัญทั้งหมดจะมีขนาดเล็กลงดังนั้นในผลิตภัณฑ์ การยกกำลังสองจำเป็นต้องหยุดยั้งk=4การถูกเรียกว่าสำคัญ

มากขึ้นอย่างมากก็ดังมาจากทฤษฏีของวิลสันว่าเมื่อkเป็นสำคัญเท่ากับP%k 1แม้ว่าเราต้องการเพียงว่ามันไม่ใช่ศูนย์ที่นี่ แต่มีประโยชน์โดยทั่วไปที่P%kเป็นตัวแปรตัวบ่งชี้ว่าkสำคัญ


23

C, 61 ตัวอักษร

เกือบเหมือนกันกับคำถามนี้ (คำถามก็เกือบเหมือนกันทุกประการ)

n=2;main(m){n<1e6&&main(m<2?printf("%d\n",n),n:n%m?m-1:n++);}

เตรียมพร้อมSEG-FAULTหลังจากพิมพ์881
manav mn

7
@Manav บางทีคุณอาจรวบรวมโดยไม่มีการเพิ่มประสิทธิภาพ ใช้เครื่องมือเพิ่มประสิทธิภาพที่ดีซึ่งจะลบการเรียกซ้ำ
ugoren

4
ใช่เพิ่ม-O3เพื่อgccแก้ไขปัญหา !!
manav mn

วิธีนี้เสียสติ ฉันรักมัน.
ทอดด์เลห์แมน

2
ฉันสามารถพาคุณไป 57 ไบต์n=2;main(m){n<1e6&&main(m<2?printf("%d\n",n),n:m-++n%m);}
อัลเบิร์ตเรนชอว์

22

MATLAB (16) (12)

น่าเสียดายที่ผลลัพธ์นี้ในบรรทัดเดียว:

primes(1000000)

แต่นั่นถูกแก้ไขโดยเมทริกซ์ง่าย ๆ :

primes(1000000)'

และฉันสามารถตัดอักขระบางตัวออกโดยใช้สัญกรณ์เอ็กซ์โพเนนเชียล (ตามที่แนะนำในความคิดเห็น):

primes(1e6)'

5
ใช้1e6แทนความ1000000ช่วยเหลือที่นี่เช่นกัน
orion

@orion นั่นจะทำให้เป็นตัวละคร 11 ตัว
Axoren

@Axoren ที่ไม่รวมถึง'ในตอนท้าย
Stan Strum

20

Bash (37 ตัวอักษร)

seq 2 1e6|factor|sed 's/.*: //g;/ /d'

(60 ตัวอักษร)

seq 2 1000000|factor|sed -e 's/[0-9]*: //g' -e '/^.* .*$/ d'

บนคอมพิวเตอร์ของฉัน (cpu 2.0 GHz, 2 GB ram) ใช้เวลา 14 วินาที


สิ่งนี้สามารถปรับปรุงเป็น: seq 2 1000000|factor|sed 's/[0-9]*: //g;/^.* .*$/ d'
Delan Azabani

ใช่คุณพูดถูก. ฉันเขียนคำสั่ง
เกลี้ยกล่อม

3
seq 1e6|factor|awk '$0=$2*!$3'สั้นกว่านี้เล็กน้อย
เดนนิส

1
seq, factor และ sed เป็นโปรแกรมภายนอกสิ่งนี้อาจเป็นc pที่ที่ c คือ symlink สำหรับ cat และ p เป็นไฟล์ข้อความที่มีจำนวนถึงหนึ่งล้าน ... คุณสามารถทำมันด้วยเชลล์บิวด์อินได้หรือไม่?
technosaurus

7
@technosaurus seqและfactorอยู่ในcoreutilsดังนั้นมันถูกต้องตามกฎหมาย sedยังเป็นที่แพร่หลายค่อนข้าง coreutilsสามารถรักษาได้เหมือนในตัว Bash ที่ไม่มี coreutils เหมือนกับ C ++ ที่ไม่มี STL

16

J, 21 ตัวอักษร

1[\p:i.(_1 p:1000000)

ซึ่งสามารถย่อให้เล็กลงได้

1[\p:i.78498

ถ้าคุณรู้ว่ามีจำนวนเฉพาะต่ำกว่า 1000000 เท่าไหร่


2
ใช้รายการ enfile ,.แทน 1 [\\ เพื่อบันทึกอักขระ 1e6ลบวงเล็บที่ไม่จำเป็นและใช้สัญกรณ์ชี้แจง:
โอมาร์

มากับสิ่งนี้: ,.i.&.(p:^:_1)1e6ไม่สั้น (หลังจากใช้คำแนะนำของ @Omar) แต่ฉันพบว่าการใช้ภายใต้สิ่งที่น่าสนใจ
kaoD

10

PowerShell, 47 44 ไบต์

ช้ามาก แต่สั้นที่สุดที่ฉันสามารถหาได้

$p=2..1e6;$p|?{$n=$_;!($p-lt$_|?{!($n%$_)})}

PowerShell ขนาด 123 ไบต์

มันเร็วกว่ามาก ไกลจากที่ดีที่สุด แต่ประนีประนอมที่ดีระหว่างประสิทธิภาพและความกะทัดรัด

 $p=2..1e6;$n=0
 while(1){$p=@($p[0..$n]|?{$_})+($p[($n+1)..($p.count-1)]|?{$_%$p[$n]});$n++;if($n-ge($p.count-1)){break}}
 $p


9

Bash ขนาด 30 ไบต์

เนื่องจากsaeednจะไม่ทำตามคำแนะนำของฉัน - ซึ่งทั้งสั้นและเร็วกว่าวิธีการของเขา - ฉันคิดว่าฉันโพสต์คำตอบของตัวเอง:

seq 1e6|factor|awk '$0=$2*!$3'

มันทำงานอย่างไร

seq 1e6

แสดงจำนวนเต็มบวกทั้งหมดได้สูงสุด 1,000,000 รายการ

factor

ปัจจัยพวกเขาหนึ่งโดยหนึ่ง สำหรับสิบอันดับแรกผลลัพธ์จะเป็นดังนี้:

1:
2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5

สุดท้าย

awk '$0=$2*!$3'

เปลี่ยนทั้งบรรทัด ( $0) เป็นผลคูณของฟิลด์ที่สอง (ตัวประกอบนายกรัฐมนตรีตัวแรก) และการปฏิเสธแบบลอจิคัลของฟิลด์ที่สาม ( 1ถ้าเป็นตัวประกอบตัวประกอบ0เดียว

สิ่งนี้แทนที่บรรทัดที่สอดคล้องกับตัวเลขเฉพาะด้วยตัวของมันเองและอื่น ๆ ทั้งหมดที่มีศูนย์ เนื่องจาก awk พิมพ์เฉพาะค่าจริงจำนวนเฉพาะเฉพาะเท่านั้นจึงจะถูกพิมพ์


4
awk '$0=$2*!$3'เจ๋งสุด ๆ !
yeti

8

ทับทิม50 41

require'mathn'
p (2..1e6).select &:prime?

2
ไม่จำเป็นต้อง.to_aเป็นEnumerableselectอยู่แล้วรวมถึง คุณสามารถใช้สัญลักษณ์ย่อสำหรับSymbol # to_procเพื่อย่อให้สั้นลงได้อีก: p (2..1e6).select &:prime?(1 ไม่ใช่เฉพาะ)
Ventero

@Ventero ขอบคุณมาก! ฉันไม่รู้เกี่ยวกับ Symbol # to_proc ฉันต้องให้ความสำคัญกับทางลัดของ Ruby
Cristian Lupascu

2
require'prime';p Prime.take 78498รุ่นสั้น
Hauleth

@ ŁukaszNiemierเยี่ยมมาก! ฉันคิดว่ามันแตกต่างกันมากจนคุณสามารถโพสต์เป็นคำตอบแยกต่างหาก
Cristian Lupascu

การใช้ประโยชน์จาก 'country boy mathn' ol ดี
DoctorHeckle

8

Bash, 37

จะตีกอล์ฟมากกว่านี้ไหมถ้าฉันสามารถ ...

สิ่งเหล่านี้ส่วนใหญ่พยายามแยกfactorรูปแบบเอาต์พุตที่น่าอึดอัดใจ

seq 1e6|factor|grep -oP "(?<=: )\d+$"

ใช้เวลา 5.7 วินาทีหรือมากกว่านั้นจึงจะเสร็จสิ้นในเครื่องของฉัน

(มันเพิ่งเกิดขึ้นที่โพสต์ของฉันเป็นคนแรกที่ไปที่หน้าสองของคำตอบดังนั้นไม่มีใครจะเห็นมัน ... )

วิธีการแก้ปัญหาเก่า

สิ่งนี้ยาวและช้าลง (ใช้เวลา 10 วินาที)

seq 1e6|factor|egrep ':.\S+$'|grep -oE '\S+$'

2
ว้าว - ฉันไม่เคยเจอมาfactorก่อน แต่มีอยู่ในนั้นใน coreutils!
Digital Trauma

1
สลัดตัวละครตัวหนึ่งออกมาseq 1e6|factor|grep -oP "(?<=: )\d+$"ด้วยลุคแป๊ปแป๊ปแป๊ะแปะไว้
Digital Trauma

@DigitalTrauma ทำงานอย่างไร

1
-Pเปิดใช้งาน regexes แบบ perl (?<=: )เป็นลักษณะเชิงบวกสำหรับสตริง ":" โดยพื้นฐานแล้วสิ่งนี้บอกว่า ":" ต้องมาก่อนสิ่งที่ตรงกัน\d+$แต่จริงๆแล้วไม่ได้เป็นส่วนหนึ่งของการแข่งขันดังนั้น-oตัวเลือกเพียงแค่ให้เราจับคู่หมายเลขหนึ่งหลังลำไส้ใหญ่คือเพียงให้ตัวเลขที่มีเพียงปัจจัยเดียวคือนายก
Digital Trauma

@DigitalTrauma ได้เพิ่ม

8

Python 3.x: 66 ตัวอักษร

for k in range(2,10**6):
 if all(k%f for f in range(2,k)):print(k)

โซลูชันที่มีประสิทธิภาพมากขึ้น: 87 ตัวอักษร

ขึ้นอยู่กับตะแกรงของ Eratosthenes

p=[];z=range(2,10**6)
while z:f=z[0];p+=[f];z=[k for k in z if k%f]
for k in p:print(k)

1
คนแรกที่ไม่สมควรพิมพ์และ0 คุณสามารถแก้ไขปัญหานี้โดยการแทนการใช้1 range(2,10**6)นอกจากนี้ฉันคิดว่าifคำสั่งจะต้องอยู่ในบรรทัดแยกต่างหากจากนอกforหรือคุณได้รับข้อผิดพลาด
xnor

@xnor: แก้ไข
dan04

8

Haskell, 51

mapM print [n|n<-[2..10^6],all((>0).rem n)[2..n-1]]

คุณสามารถเปลี่ยนmapM_เป็นmapMค่าส่งคืนจะไม่ถูกพิมพ์และนี่คือรหัสกอล์ฟ ;)
Dogbert

เหตุใดจึงมีช่องว่างเพิ่มเติมหลังจากพิมพ์และ (> 0)
ภูมิใจ haskeller

รับได้สวย! ขอบคุณ
pt2121

คุณสามารถแทนที่ 999999 ด้วย 10 ^ 6 และโปรดอัปเดตจำนวนไบต์ของคุณ - 63 อาจไม่ถูกต้อง
2845840

@ user2845840 ขอบคุณ ความคิดที่ดี!
pt2121

8

APL, 15

p~,p∘.×p←1↓⍳1e6

ล่ามของฉันมีปัญหาเรื่องความจำ แต่ใช้งานได้ในทางทฤษฎี


อย่างไร? คุณสามารถให้คำแนะนำได้หรือไม่?
Rasmus Damgaard Nielsen

คุณจำเป็นต้องมีในด้านหน้าที่จะทำให้จำนวนหนึ่งต่อบรรทัดและคุณไม่จำเป็นต้อง ,
อดัม

@RasmusDamgaardNielsen เป็นจำนวนเต็มแรก 1↓หยดแรก p←มอบหมายให้ p. p∘.×pทำให้ตารางสูตรคูณ p~ลบสิ่งที่อยู่ทางขวาออกจาก p ( ,ไม่จำเป็นต้องใช้มัน Ravels ตารางลงในรายการ.)
อดัม

8

Perl, 49 ไบต์

การแสดงออกปกติกังฟู :)

for(1..1E6){(1x$_)=~/^(11+?)\1+$/ or print"$_\n"}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

for(1 .. 1_000_000) { 
    (1x$_) =~ /^(11+?)\1+$/ or print "$_\n";
}

มันไม่ได้คืบหน้าแม้แต่ 10% ในขณะที่ฉันพิมพ์โพสต์นี้!

แหล่งที่มาสำหรับ regex: http://montreal.pm.org/tech/neil_kandalgaonkar.shtml


2
เป็นแรงบันดาลใจให้ฉันเขียน perl6 version ยัง1000000สามารถเขียน10**6
Pabo

1
นอกจากนี้ 1000000 สามารถเขียนได้ 1E6
ม็อบ

อัปเดตคำตอบของฉัน ขอบคุณ @mob
Gowtham

เป็นเสมอ regex ที่ชื่นชอบของฉัน แต่คุณต้องจำไว้ว่ามันล้มเหลวอย่างน่าทึ่งเมื่อคุณได้รับตัวเลขที่สูงขึ้น - เนื่องจากความจริงที่ว่ามันแปลงตัวเลขขนาดใหญ่เป็นเอก regex นี้อาจไม่ทำงานสำหรับการค้นหาเฉพาะในหลายร้อยหลายพันขึ้นอยู่กับการกำหนดค่าของภาษา (และเครื่องของคุณ)
Codefun64

7

จูเลียอายุ 11 ปี

primes(10^6)

ดูเหมือนว่าบิลด์อินจะได้รับอัปโหลดแล้วและฉันต้องการคำเพิ่มเติมสำหรับการตอบอีกต่อไป


7

J (15 หรือ 9)

ฉันไม่สามารถเชื่อว่านี่ชนะ Mathematica (ถึงแม้ว่ามันจะเป็นเพียงคนเดียว 2 ตัวอักษร)

a#~1 p:a=:i.1e6

หรือ:

p:i.78498

1
... The output format should be one number per line of output.1[\ นั่นเป็นเหตุผลที่คำตอบของฉันเริ่มต้นด้วย
Gareth

6

gs2, 5 ไบต์

เข้ารหัสใน CP437:

∟)◄lT

1C 29ดันล้าน11 6Cเป็นค่าช่วงล่าง, 54เป็นเส้นแสดง


5

GolfScript, 22/20 (20/19) ไบต์

n(6?,:|2>{(.p|%-.}do:n

ที่ความเร็วโค้ดสามารถทำให้โค้ดสั้นลงสองไบต์:

n(6?,:|2>.{|%2>-}/n*

หากรูปแบบเอาต์พุตที่ระบุไว้ในคำถามที่แก้ไขนั้นถูกเพิกเฉย (ซึ่งเป็นคำตอบที่มีอยู่มากมาย) สองไบต์สามารถบันทึกได้ในเวอร์ชันที่รวดเร็วและสามารถบันทึกได้ในรูปแบบที่ช้า:

n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`

นี้จะพิมพ์ LF เพิ่มเติมหลังจากช่วงเวลาสำหรับรุ่นที่รวดเร็วและมันจะพิมพ์ช่วงเวลาที่เป็นอาร์เรย์สำหรับคนที่ช้า

มันทำงานอย่างไร

ทั้งสองรุ่นมีการใช้งานของตะแกรงของ Eratosthenes

เวอร์ชันที่รวดเร็วทำสิ่งต่อไปนี้:

  1. ตั้งค่าและA = [ 2 3 4 … 999,999 ]| = [ 0 1 2 … 999,999 ]

  2. ชุดและพิมพ์N = A[0]N

  3. รวบรวมทุกองค์ประกอบ N-TH จากใน| เหล่านี้เป็นทวีคูณของCN

  4. A = A - Cตั้งค่า

  5. ถ้าAไม่ว่างให้กลับไปที่ 2

n(6?   # Push "\n".pop() ** 6 = 1,000,000.
,:|    # Push | = [ 0 1 2 … 999,999 ].
,2>    # Push A = [ 2 3 4 … 999,999 ].
{      #
  (    # Unshift the first element (“N”) of “A”.
  .p   # Print “N”.
  |%   # Collect every N-th element from “A” into a new array, starting with the first.
  -    # Take the set difference of “A” and the array from above.
  .    # Duplicate the set difference.
}do    # If the set difference is non-empty, repeat.
:n     # Store the empty string in “n”, so no final LF will get printed.

เวอร์ชั่นช้านั้นทำงานในรูปแบบที่คล้ายกัน แต่แทนที่จะทำการลบทวีคูณอย่างน้อยที่สุดของ“ A” (ซึ่งเป็นตำแหน่งที่ดีที่สุดเสมอ) มันจะลบจำนวนทวีคูณของจำนวนเต็มบวกทั้งหมดต่ำกว่า 1,000,000

สามารถในการแข่งขัน

ในกรณีที่ไม่มีฟังก์ชั่นทางคณิตศาสตร์ใด ๆ ในตัวที่จะแยกตัวประกอบหรือตรวจสอบสภาพดั้งเดิมโซลูชั่น GolfScript ทั้งหมดจะมีขนาดใหญ่มากหรือไม่มีประสิทธิภาพมาก

ในขณะที่ยังห่างไกลจากการมีประสิทธิภาพฉันคิดว่าฉันได้รับอัตราส่วนความเร็วต่อขนาดที่เหมาะสม ในช่วงเวลาของการส่งของวิธีการนี้ดูเหมือนว่าจะสั้นที่สุดของผู้ที่ไม่ได้ใช้ในตัวดังกล่าวข้างต้น ฉันพูดเหมือนเพราะฉันไม่รู้ว่าคำตอบบางอย่างทำงานอย่างไร ...

ฉันเปรียบเทียบมาตรฐาน GolfScript ที่ส่งมาทั้งสี่โซลูชัน: w0lf's (แผนกทดลอง) คำตอบอื่น ๆ ของฉัน (ทฤษฎีของ Wilson) และคำตอบสองข้อนี้ ผลลัพธ์เหล่านี้คือ:

Bound     | Trial division     | Sieve (slow)       | Wilson's theorem | Sieve (fast)
----------+--------------------+--------------------+------------------+----------------
1,000     | 2.47 s             | 0.06 s             | 0.03 s           | 0.03 s
10,000    | 246.06 s (4.1 m)   | 1.49 s             | 0.38 s           | 0.14 s
20,000    | 1006.83 s (16.8 m) | 5.22 s             | 1.41 s           | 0.38 s
100,000   | ~ 7 h (estimated)  | 104.65 (1.7 m)     | 35.20 s          | 5.82 s
1,000,000 | ~ 29 d (estimated) | 111136.97s (3.1 h) | 3695.92 s (1 h)  | 418.24 s (7 m)

ตะแกรง "ช้า" เป็นเพียงตะแกรงของ Eratosthenes หรือไม่?
dorukayhan

ทั้งสองคือ. รุ่นที่ช้าเป็นเพียงการใช้งานที่น่ากลัว
Dennis


4

Golfscript 26 25 24

แก้ไข (บันทึกอีกหนึ่งถ่านขอบคุณ Peter Taylor):

10 6?,{:x,{)x\%!},,2=},`

รหัสเก่า:

10 6?,{.,{)\.@%!},,2=*},`

รหัสนี้มีค่าตามทฤษฎีเท่านั้นเพราะมันช้าและไม่มีประสิทธิภาพอย่างไม่น่าเชื่อ ฉันคิดว่าอาจใช้เวลาหลายชั่วโมงกว่าจะทำงานได้

หากคุณต้องการทดสอบลองใช้เฉพาะช่วงเวลาที่มีค่ามากถึง 100:

10 2?,{:x,{)x\%!},,2=},`

คุณสามารถบันทึกตัวอักษรโดยการแทนที่ด้วย\; *(คุณสามารถเร็วขึ้นมากสำหรับจำนวนตัวอักษรปัจจุบันโดยการค้นหาตัวหารแรกมากกว่าพวกเขาทั้งหมด:10 6?,2>{.),2>{1$\%!}?=},`
Peter Taylor

@ PeterTaylor ขอบคุณที่ใช้การคูณมีเคล็ดลับที่เรียบร้อยมาก
Cristian Lupascu

มีอีกหนึ่งการประหยัดกับตัวแปรถ่านเป็น: แทนที่.,ด้วย:x,และ\.@กับx\ (ช่องว่างเป็นเพราะหนีปัญหากับเอ็มในความคิดเห็น) *และลบ
Peter Taylor

@PeterTaylor ดีคนหนึ่งขอบคุณ! ฉันแก้ไขรหัสแล้ว
Cristian Lupascu

4

CJam - 11

1e6,{mp},N*

1e6,- อาร์เรย์ 0 ... 999999
{mp},- เลือกช่วงเวลา
N*- เข้าร่วมกับสายใหม่


1
CJam ล่าสุดนี้ไม่ใช่คำถามนี้ใช่ไหม?
Peter Taylor

@PeterTaylor โอ้ใช่แล้ว
aditsu

4

GolfScript 25 ไบต์ (24)

!10 6?,2>{.(@*.)@%!},n*\;

หากรูปแบบเอาต์พุตที่ระบุในคำถามที่แก้ไขนั้นถูกเพิกเฉยสามารถบันทึกได้หนึ่งไบต์:

!10 6?,2>{.(@*.)@%!},`\;

สิ่งนี้จะพิมพ์จำนวนเฉพาะเป็นอาร์เรย์ (เช่นเดียวกับวิธีแก้ปัญหาอื่น ๆ ) มากกว่าหนึ่งรายการต่อบรรทัด

มันทำงานอย่างไร

ความคิดทั่วไปคือการใช้ทฤษฎีบทของวิลสันซึ่งระบุว่าn > 1 นั้นเป็นเรื่องสำคัญหาก

                                                      (n - 1)!  = -1 (mod n)

!     # Push the logical NOT of the empty string (1). This is an accumulator.
10 6? # Push 10**6 = 1,000,000.
,2>   # Push [ 2 3 4 … 999,999 ].
{     # For each “N” in this array:
  .(  # Push “N - 1”.
  @   # Rotate the accumulator on top of the stack.
  *   # Multiply it with “N - 1”. The accumulator now hold “(N - 1)!”.
  .)  # Push “(N - 1)! + 1”
  @   # Rotate “N” on top of the stack.
  %!  # Push the logical NOT of “((N - 1)! + 1) % N”.
},    # Collect all “N” for which “((N - 1)! + 1) % N == 0” in an array.
n*    # Join that array by LF.
\;    # Discard the accumulator.

มาตรฐาน

เร็วกว่าแผนกทดลอง แต่ช้ากว่าตะแกรงของ Eratosthenes ดูคำตอบอื่น ๆ ของฉัน


4

Java, 110 ไบต์

void x(){for(int i=1;i++<1e6;)System.out.print(new String(new char[i]).matches(".?|(..+?)\\1+")?"":(i+"\n"));}

ใช้การแบ่งเอกด้วยการทดสอบ regex


1
วิธีการที่ดี ไม่เคยเห็นว่านายก - regex มาก่อน +1 จากฉัน แม้ว่าการใช้ซ้อนกันสำหรับห่วงสำหรับนายกตรวจสอบจะสั้นกว่าเล็กน้อย :)
Kevin Cruijssen

3

C, 91 88 85 82 81 80 76 72 ตัวอักษร

main(i,j,b){for(;i++<1e6;b++&&printf("%d\n",i))for(j=2;j<i;)b=i%j++&&b;}

อัลกอริทึมนั้นไม่มีประสิทธิภาพอย่างมาก แต่เนื่องจากเรากำลังทำโค้ดกอล์ฟซึ่งไม่สำคัญ


1
คุณสามารถลดได้อย่างง่ายดาย: main(i,j,b){for(;i++<1e6;b++&&printf("%d\n",i))for(j=2;j<i;)b=i%j++&&b;}หรือความคิดบางอย่างเช่นนี้ (ตั้งแต่ที่จริงผมไม่ได้รวบรวมมัน)
Ali1S232

จะiแน่ใจได้อย่างไรว่าเป็น 0 ฉันคิดว่าถ้าคุณให้ข้อโต้แย้งใด ๆมันจะล้มเหลว นอกจากนี้ฉันคิดว่าjจะมีข้อผิดพลาดประเภทบางประเภท ไม่แน่ใจสำหรับbแม้ว่า
Erik the Outgolfer

3

Mathematica 25

สมมติว่าคุณไม่รู้จำนวนช่วงเวลาน้อยกว่า 10 ^ 6:

Prime@Range@PrimePi[10^6]

3

J, 16 ตัวอักษร

1]\(#~1&p:)i.1e6

หากไม่มีข้อกำหนดรูปแบบเอาต์พุตสามารถลดได้ถึง13ตัวอักษร:

(#~1&p:)i.1e6

1]\ เพิ่งใช้เวลาช่วง primes อันดับ 1 เปลี่ยนเป็นอาร์เรย์อันดับ 2 และวางนายกแต่ละตัวไว้ในแถวของตัวเอง - และดังนั้นรูปแบบเอาต์พุตเริ่มต้นของล่ามจะเปลี่ยนรายการหนึ่งบรรทัดเป็นหนึ่งรายการต่อหนึ่งบรรทัด

(#~ f) yเป็นพื้นฐานfilterที่fส่งกลับบูลีนสำหรับแต่ละองค์ประกอบyมา i.1e6คือช่วงของจำนวนเต็ม [0,1000000) และ1&p:เป็นฟังก์ชั่นบูลีนที่ส่งกลับ 1 สำหรับช่วงเวลา


3

R, 45 43 ตัวอักษร

for(i in 2:1e6)if(sum(!i%%2:i)<2)cat(i," ")

สำหรับแต่ละหมายเลข x จาก 2 ถึง 1e6 ให้ส่งออกมันถ้าจำนวนของ x mod 2 ถึง x ที่เท่ากับ 0 น้อยกว่า 2


หมายเลขแรกที่สร้างโดยรหัสนี้คือ 1 แต่ 1 ไม่ใช่หมายเลขเฉพาะ
Sven Hohenstein

@SvenHohenstein ขอบคุณแก้ไขแล้ว
plannapus

3

Bash (433643)

ความพยายามของฉัน (ไม่ฉลาด) คือการใช้ปัจจัยเพื่อแยกแยะผลิตภัณฑ์

factor ${PRODUCT}

น่าเสียดายที่มีผลิตภัณฑ์จำนวนมากเป็นจำนวนมาก มันใช้เวลานานกว่า 12 ชั่วโมงในการวิ่ง ฉันตัดสินใจที่จะโพสต์มันเพราะฉันคิดว่ามันเป็นเอกลักษณ์

นี่คือรหัสเต็ม

ถ้ามันเป็นช่วงเวลาที่ต่ำกว่าหกปีมันจะสมเหตุสมผล

  factor 30

โอ้ดีฉันพยายาม


+1 คำตอบนี้โหดร้ายอย่างแท้จริง ผลลัพธ์ที่ไม่ได้คำนวณล่วงหน้า (ช่วยประหยัดอักขระได้เล็กน้อย) และน่ากลัวยิ่งกว่าในการคำนวณ :) มันอาจเป็นตัวอย่างที่ทำให้การเพิ่มประสิทธิภาพfactorทำงานได้แย่กว่าอัลกอริธึมการทดลองขั้นพื้นฐานมาก
orion

3

C #, 70

Enumerable.Range(1,1e6).Where(n=>Enumerable.Range(2,n).All(x=>x%n!=0))

คุณจะไม่เห็นมากที่นี่แม้ว่าเป็นเวลานาน ...


มีสาเหตุหลายประการที่ทำให้สิ่งนี้ผิด (1) คุณไม่สามารถปริยายแปลงจากdouble 1e6สระintแต่ถูกต้องตามint Range(2) ภายในRangeจะต้องใช้เวลามากที่สุดn-2แง่มิฉะนั้นคุณจะทดสอบซึ่งเป็นที่ชัดเจนn % n 0(3) คุณเขียนเมื่อคุณต้องการx%n n%xแก้ไขปัญหาเหล่านี้บางอย่างเช่นนี้จะได้ผล: Enumerable.Range(2,999999).Where(n=>Enumerable.Range(2,n-2).All(x=>n%x!=0))อย่างไรก็ตามสิ่งนี้ยังไม่ส่งออกตัวเลข ข้อกำหนดคือหนึ่งรายการต่อบรรทัด
Jeppe Stig Nielsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.