Bu zorluk, son zamanlarda basit bir oyun için yazmak zorunda kaldığım gerçek çarpışma tespitine dayanıyor.
İki nesneye verilen , iki nesnenin çarpışma halinde olup olmadığına (yani kesişen) olup olmadığına bağlı olarak bir gerçeği veya sahte değeri döndüren bir program veya işlev yazın .
Üç tür nesneyi desteklemeniz gerekir:
- Hat segmentleri : 4 yüzer ile temsil edilen, yani iki uç noktayı gösteren (x 1 , y 1 ) ve (x 2 , y 2 ) . Bitiş noktalarının aynı olmadığını varsayabilirsiniz (bu nedenle çizgi kesimi dejenere değildir).
- Diskler : yani, merkezler için iki (x, y) ve biri yarıçap r için bir (pozitif) olmak üzere 3 yüzer ile temsil edilen doldurulmuş daireler .
- Boşluklar : bunlar bir diskin tamamlayıcısıdır. Yani, bir boşluk , bir merkez ve yarıçap tarafından belirtilen dairesel bir bölge dışında tüm 2D alanı doldurur .
Programınız veya işleviniz, tanımlayıcı bir tamsayı (kendi seçiminize göre) ve 3 veya 4 değişken şeklinde iki tane nesne alacaktır. STDIN, ARGV veya fonksiyon argümanı ile giriş yapabilirsiniz. Girişi önceden işlenmemiş herhangi bir formda, örneğin 8 ila 10 bireysel sayı, iki virgülle ayrılmış değer listesi veya iki liste olarak temsil edebilirsiniz. Sonuç iade edilebilir veya STDOUT'a yazılabilir.
Nesnelerin en az 10-10 uzunluk birimi olduğu veya bu kadar kesiştiği varsayılabilir , bu nedenle kayan nokta türlerinin sınırlamaları hakkında endişelenmenize gerek yoktur.
Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.
Test Kılıfları
Liste tabanlı bir giriş formatı kullanarak 0
, disk bölümlerini 1
ve boşlukları içeren çizgi parçalarını temsil 2
eden aşağıdakilerin tümü bir gerçek çıktı üretmelidir:
[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
aşağıdakilerin tümü sahte çıktıyla sonuçlanmalıdır
[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]]