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 1ve boşlukları içeren çizgi parçalarını temsil 2eden 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]]


