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
เวอร์ชันที่รวดเร็วทำสิ่งต่อไปนี้:
ตั้งค่าและA = [ 2 3 4 … 999,999 ]
| = [ 0 1 2 … 999,999 ]
ชุดและพิมพ์N = A[0]
N
รวบรวมทุกองค์ประกอบ N-TH จากใน|
เหล่านี้เป็นทวีคูณของC
N
A = A - C
ตั้งค่า
ถ้า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)