ความท้าทายนี้ขึ้นอยู่กับการตรวจจับการชนจริงที่ฉันได้เขียนสำหรับเกมง่ายๆเมื่อเร็ว ๆ นี้
เขียนโปรแกรมหรือฟังก์ชั่นที่ให้วัตถุสองชิ้นคืนค่าจริงหรือค่าเท็จขึ้นอยู่กับว่าวัตถุทั้งสองอยู่ในการชนกัน (เช่นตัดกัน) หรือไม่
คุณต้องรองรับวัตถุสามประเภท:
- กลุ่มสาย : ตัวแทนจาก 4 ลอยระบุสองจุดสิ้นสุดคือ(x 1 , y 1 )และ(x 2 , y 2 ) คุณอาจสมมติว่าจุดสิ้นสุดไม่เหมือนกัน (ดังนั้นส่วนของเส้นจะไม่ลดลง)
- แผ่น : คือเต็มไปวงการตัวแทนจาก 3 ลอยสองสำหรับศูนย์(x, y)และหนึ่ง (บวก) สำหรับรัศมีR
- ฟันผุ : สิ่งเหล่านี้เป็นส่วนประกอบของดิสก์ นั่นคือโพรงเติมเต็มพื้นที่ 2 มิติทั้งหมดยกเว้นพื้นที่วงกลมซึ่งระบุโดยจุดศูนย์กลางและรัศมี
โปรแกรมหรือฟังก์ชั่นของคุณจะได้รับวัตถุสองชนิดนี้ในรูปแบบของจำนวนเต็มที่ระบุ (ที่คุณเลือก) และ 3 หรือ 4 อัน คุณสามารถรับอินพุตผ่าน STDIN, ARGV หรืออาร์กิวเมนต์ของฟังก์ชัน คุณอาจเป็นตัวแทนของอินพุตในรูปแบบที่สะดวกใด ๆ ที่ไม่ได้ประมวลผลล่วงหน้าเช่น 8 ถึง 10 หมายเลขบุคคลรายการค่าที่คั่นด้วยเครื่องหมายจุลภาคสองรายการหรือสองรายการ ผลลัพธ์สามารถส่งคืนหรือเขียนไปยัง STDOUT
คุณอาจสันนิษฐานว่าวัตถุนั้นมีหน่วยความยาวอย่างน้อย 10 -10ชิ้นหรือแยกจากกันมากดังนั้นคุณไม่ต้องกังวลเกี่ยวกับข้อ จำกัด ของชนิดจุดลอย
นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ
กรณีทดสอบ
การเป็นตัวแทนของส่วนของเส้นด้วย0
แผ่นดิสก์1
และช่องว่าง2
โดยใช้รูปแบบอินพุตตามรายการต่อไปนี้ควรสร้างเอาต์พุตจริง:
[0,[0,0],[2,2]], [0,[1,0],[2,4]] # Crossing line segments
[0,[0.5,0],[-0.5,0]], [1,[0,0],1] # Line contained in a disc
[0,[0.5,0],[1.5,0]], [1,[0,0],1] # Line partially within disc
[0,[-1.5,0.5],[1.5,0.5]], [1,[0,0],1] # Line cutting through disc
[0,[0.5,2],[-0.5,2]], [2,[0,0],1] # Line outside cavity
[0,[0.5,0],[1.5,0]], [2,[0,0],1] # Line partially outside cavity
[0,[-1.5,0.5],[1.5,0.5]], [2,[0,0],1] # Line cutting through cavity
[1,[0,0],1], [1,[0,0],2] # Disc contained within another
[1,[0,0],1.1], [1,[2,0],1.1] # Intersecting discs
[1,[3,0],1], [2,[0,0],1] # Disc outside cavity
[1,[1,0],0.1], [2,[0,0],1] # Disc partially outside cavity
[1,[0,0],2], [2,[0,0],1] # Disc encircling cavity
[2,[0,0],1], [2,[0,0],1] # Any two cavities intersect
[2,[-1,0],1], [2,[1,0],1] # Any two cavities intersect
ในขณะที่ต่อไปนี้ควรส่งผลให้ผลลัพธ์ที่ผิดพลาด
[0,[0,0],[1,0]], [0,[0,1],[1,1]] # Parallel lines
[0,[-2,0],[-1,0]], [0,[1,0],[2,0]] # Collinear non-overlapping lines
[0,[0,0],[2,0]], [0,[1,1],[1,2]] # Intersection outside one segment
[0,[0,0],[1,0]], [0,[2,1],[2,3]] # Intersection outside both segments
[0,[-1,2],[1,2]], [1,[0,0],1] # Line passes outside disc
[0,[2,0],[3,0]], [1,[0,0],1] # Circle lies outside segment
[0,[-0.5,0.5],[0.5,-0.5]], [2,[0,0],1] # Line inside cavity
[1,[-1,0],1], [1,[1,1],0.5] # Non-intersecting circles
[1,[0.5,0],0.1], [2,[0,0],1] # Circle contained within cavity
[0,[-2,0],[-1,0]], [0,[1,0],[2,0]]