GolfScript, 59 ตัวอักษร
~:N..*.,2>{:P{(.P\%}do(!},{{N-.*}$0=}:C~[1.{.@+.N<}do]C+++4/
สคริปต์นี้ไม่เป็นไปตามข้อกำหนดบางประการ:
- ทำงานได้อย่างถูกต้องสำหรับอินพุต
n >= 2
เท่านั้นมิฉะนั้นจะขัดข้อง
- เอาต์พุตถูกปัดเศษเป็นจำนวนเต็ม
- ประสิทธิภาพที่ยอดเยี่ยมสำหรับขนาดใหญ่พอสมควร
n
คำแนะนำสั้น ๆ ของรหัส:
~:N..*
อินพุตถูกเก็บไว้ใน N และเรากดทั้งสองn
และสี่เหลี่ยมn*n
ทันที
.,2>
[2..n*n]
เราจะสร้างรายการของจำนวนเฉพาะโดยการกรองอาร์เรย์ เราใช้การคำนวณก่อนหน้าของเราn*n
ว่าเป็นขอบเขตที่แย่มากสำหรับการค้นหานายกที่มีขนาดใหญ่กว่า n
{:P{(.P\%}do(!},
อาร์เรย์ก่อนหน้าของเราถูกกรองโดยแผนกทดลอง จำนวนเต็ม P แต่ละตัวจะถูกทดสอบกับทุกจำนวนเต็ม [P-1..1]
{{N-.*}$0=}:C~
เรียงลำดับอาร์เรย์ก่อนหน้าตามระยะทางn
และจับองค์ประกอบแรก ตอนนี้เรามีนายกที่ใกล้ที่สุด
[1.{.@+.N<}do]C
เราสร้าง Fibonnacis จนกว่าเราจะได้มากกว่าn
หนึ่ง โชคดีที่อัลกอริทึมนี้ติดตาม Fibonnaci ก่อนหน้านี้ตามธรรมชาติดังนั้นเราจึงโยนมันลงในอาร์เรย์และใช้การเรียงลำดับระยะทางก่อนหน้าของเรา ตอนนี้เรามี Fibonnaci ที่ใกล้เคียงที่สุด
+++4/
เฉลี่ย. โปรดทราบว่า GolfScript ไม่รองรับการลอยดังนั้นผลลัพธ์จะถูกตัดทอน
GolfScript, 81 ตัวอักษร
นี่คือตัวแปรที่ตอบสนองความต้องการทั้งหมด
~:N..*2N*,3,|2,^{:P{(.P\%}do(!},{{N-.*}$0=}:C~[0.1{.@+.N<}do]C+++100:E*4/.E/'.'@E%
เพื่อให้แน่ใจว่าพฤติกรรมที่เหมาะสมสำหรับn<2
ผมหลีกเลี่ยง2<
(แฮงค์เมื่ออาร์เรย์ที่มีขนาดเล็ก) 3,|2,^
และแทนที่จะใช้ ซึ่งทำให้แน่ใจอาร์เรย์ตัวเต็งเป็นเพียงเมื่อ[2]
n < 2
ฉันเปลี่ยนขอบเขตบนสำหรับไพรม์ถัดไปจากn*n
เป็น2*n
( สมมุติของเบอร์แทรนด์ ) นอกจากนี้ 0 ถือว่าเป็นหมายเลข Fibonnaci ผลลัพธ์จะถูกคำนวณในคณิตศาสตร์จุดคงที่ในตอนท้าย น่าสนใจดูเหมือนว่าผลลัพธ์จะเป็นที่สี่เสมอ (0, .25, .5, .75) ดังนั้นฉันหวังว่าความแม่นยำทศนิยม 2 ตำแหน่งนั้นเพียงพอแล้ว
รอยแตกครั้งแรกของฉันเมื่อใช้ GolfScript ฉันแน่ใจว่ามีพื้นที่สำหรับการปรับปรุง!