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)