Thử thách này dựa trên phát hiện va chạm thực tế mà tôi đã phải viết cho một trò chơi đơn giản gần đây.
Viết chương trình hoặc hàm, cho hai đối tượng, trả về giá trị trung thực hoặc sai lệch tùy thuộc vào việc hai đối tượng có va chạm (tức là giao nhau) hay không.
Bạn cần hỗ trợ ba loại đối tượng:
- Phân đoạn dòng : được biểu thị bằng 4 số float, biểu thị hai điểm cuối, nghĩa là (x 1 , y 1 ) và (x 2 , y 2 ) . Bạn có thể giả sử rằng các điểm cuối không giống nhau (vì vậy đoạn đường không bị suy biến).
- Đĩa : tức là các vòng tròn được lấp đầy, được biểu thị bằng 3 số float, hai cho tâm (x, y) và một (dương) cho bán kính r .
- Sâu răng : đây là một bổ sung của đĩa. Đó là, một khoang lấp đầy tất cả không gian 2D, ngoại trừ một vùng hình tròn, được chỉ định bởi một trung tâm và bán kính.
Chương trình hoặc hàm của bạn sẽ nhận được hai đối tượng như vậy dưới dạng một số nguyên xác định (bạn chọn) và 3 hoặc 4 số float của chúng. Bạn có thể nhận đầu vào thông qua STDIN, ARGV hoặc đối số hàm. Bạn có thể biểu thị đầu vào dưới bất kỳ hình thức thuận tiện nào chưa được xử lý trước, ví dụ 8 đến 10 số riêng lẻ, hai danh sách giá trị được phân tách bằng dấu phẩy hoặc hai danh sách. Kết quả có thể được trả lại hoặc ghi vào STDOUT.
Bạn có thể giả định rằng các đối tượng cách nhau ít nhất 10 -10 đơn vị hoặc giao nhau với nhau, vì vậy bạn không cần phải lo lắng về các giới hạn của các loại dấu phẩy động.
Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Các trường hợp thử nghiệm
Đại diện cho các phân đoạn dòng với 0
, đĩa có 1
và khoang với 2
, sử dụng định dạng đầu vào dựa trên danh sách, tất cả những điều sau đây sẽ tạo ra một đầu ra trung thực:
[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
trong khi sau đây tất cả sẽ dẫn đến một đầu ra giả
[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]]