J , 40 ไบต์
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
ลองออนไลน์!
จะหมดเวลาใช้งาน TIO เป็นเวลา 5 ถ้าคุณใช้ความแม่นยำแบบขยาย ( 5xแทน5) ฉันจะไม่ลองเลข 6 ในคอมพิวเตอร์ของฉันเนื่องจากจะไม่มีข้อสงสัยใด ๆ ในการแปลล่าม
กำลังมองหาคำแนะนำเกี่ยวกับการเล่นกอล์ฟโดยเฉพาะส่วนที่ผ่านมารุ่นพิกัด ฉันรู้สึกว่าควรจะมีวิธีการถอดหมวกบางอันออก
]<:[:+/&.:*:"1*:<:[:+/"1[:*:อาจถูกแทนที่โดยค่าเท่ากัน
คำอธิบาย
คำอธิบายนี้ทำบน REPL (ช่องว่างสามช่องระบุคำสั่งไม่มีช่องว่างที่ระบุถึงเอาต์พุต) ฉันจะสร้างคำตอบ
การสร้างพิกัด
#~ #: i.@^~ ให้พิกัดทั้งหมดที่เราใส่ใจเกี่ยวกับขัดแตะ
^~ เป็นตัวเลขที่ยกขึ้นเพื่อตัวเองและ i.ให้ช่วง [0, n) โดยที่ n คืออินพุต @รวบรวมฟังก์ชั่นเหล่านั้น
i.@^~ 2
0 1 2 3
#~ คัดลอกตัวเลขด้วยตัวเองเช่น
#~ 3
3 3 3
#: แปลงอาร์กิวเมนต์ที่ถูกต้องเป็นฐานที่ระบุโดย อาร์เรย์ที่กำหนดให้เป็นอาร์กิวเมนต์ด้านซ้าย จำนวนหลักในอาร์เรย์สอดคล้องกับจำนวนหลักในเอาต์พุตฐานนั้น (และคุณสามารถมีฐานผสม) ตัวอย่างเช่น
3 3 3 #: 0
0 0 0
5 5 #: 120
4 0
NB. If you want 120 base 5 use #.inv
#.inv 120
4 4 0
ดังนั้นทั้งหมดเข้าด้วยกันนี่บอกว่าแจกแจงผ่านฐานค่าทั้งหมด n (โดยที่ n คืออินพุต) จนถึง n ^ n ให้พิกัดของเราได้อย่างมีประสิทธิภาพ
(#~ #: i.@^~) 2
0 0
0 1
1 0
1 1
รับระยะทางระหว่างแต่ละคู่
ก่อนอื่นเราจะนำความแตกต่างของแต่ละพิกัดกับคนอื่น ๆ ทั้งหมดโดยใช้ dyad /-table และ~-reflexive โปรดทราบว่าสิ่งนี้ไม่ได้คำนึงถึงความจริงที่ว่าคำสั่งซื้อไม่สำคัญสำหรับคู่: สิ่งนี้สร้างระยะทางที่ซ้ำกัน
NB. 2 {. takes the first two elements (I'm omitting the rest).
2 {. -"1/~ (#~ #: i.@^~) 2
0 0
0 _1
_1 0
_1 _1
0 1
0 0
_1 1
_1 0
จากนั้นเราใช้กริยานี้+/&.:*:ในแต่ละพิกัด (ที่"1หรือที่รู้จักอันดับหนึ่ง) กริยานี้คือ sum ( +/) ใต้ ( &.:) square ( *:) ภายใต้ใช้กริยาด้านขวา (สี่เหลี่ยม) จากนั้นรวบรวมผลลัพธ์และให้เป็นอาร์กิวเมนต์ของคำกริยาด้านซ้าย (ผลรวม) จากนั้นจะใช้อินเวอร์สของคำกริยาด้านขวา (ซึ่งจะเป็นสแควร์รูท)
+/&.:*: 3 4
5
+/&.:*:"1 ([: -"1/~ #~ #: i.@^~) 2
0 1 1 1.41421
1 0 1.41421 1
1 1.41421 0 1
1.41421 1 1 0
ไม่น่าแปลกใจที่ระยะทางจำนวนมากเหมือนกัน
นับระยะทางที่มากกว่าหรือเท่ากับอินพุท
ส่วนสุดท้ายคือการดูว่าระยะทางมากกว่าหรือเท่ากับอินพุตที่ใช้]<:หรือไม่ จากนั้นผลลัพธ์ทั้งหมดจะถูกรวมโดยใช้+/^:_(รวมถึงการบรรจบกัน) นับจำนวนของค่าความจริง จากนั้นค่านี้จะถูกหารด้วย 2 ( 2%~นี่~หมายถึงสลับลำดับของอาร์กิวเมนต์ที่ระบุไปยัง%) เหตุผลที่เราสามารถหารด้วย 2 ได้เพราะสำหรับการจับคู่ความจริงแต่ละครั้งจะมีอีกอันสำหรับลำดับการพลิกยกเว้นการจับคู่ที่ประสานงานกับตัวเอง ไม่เป็นไรเพราะจะส่งผลให้ระยะทางเป็น 0