Tantangan ini didasarkan pada deteksi tabrakan aktual yang harus saya tulis untuk permainan sederhana baru-baru ini.
Tulis program atau fungsi yang, mengingat dua objek, mengembalikan nilai yang benar atau salah tergantung pada apakah kedua objek tersebut bertabrakan (mis. Berpotongan) atau tidak.
Anda perlu mendukung tiga jenis objek:
- Segmen garis : diwakili oleh 4 pelampung, menunjukkan dua titik akhir, yaitu (x 1 , y 1 ) dan (x 2 , y 2 ) . Anda dapat mengasumsikan bahwa titik akhir tidak identik (sehingga segmen garis tidak mengalami degenerasi).
- Cakram : yaitu lingkaran yang diisi, diwakili oleh 3 pelampung, dua untuk pusat (x, y) dan satu (positif) untuk jari-jari r .
- Rongga : ini adalah pelengkap disk. Artinya, rongga mengisi semua ruang 2D, kecuali wilayah melingkar, ditentukan oleh pusat dan jari-jari.
Program atau fungsi Anda akan menerima dua objek tersebut dalam bentuk integer pengidentifikasi (pilihan Anda) dan 3 atau 4 floatnya. Anda dapat mengambil input melalui STDIN, ARGV atau argumen fungsi. Anda dapat mewakili input dalam bentuk apa pun yang tidak diproses sebelumnya, mis. 8 hingga 10 angka individual, dua daftar nilai yang dipisahkan koma atau dua daftar. Hasilnya dapat dikembalikan atau ditulis ke STDOUT.
Anda mungkin berasumsi bahwa objek-objek itu setidaknya 10 -10 unit panjang terpisah atau berpotongan sebanyak itu, sehingga Anda tidak perlu khawatir tentang keterbatasan tipe floating point.
Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.
Uji Kasus
Mewakili segmen garis dengan 0
, cakram dengan 1
dan lubang 2
, dengan menggunakan format input berbasis daftar, yang berikut ini semua harus menghasilkan output yang benar:
[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
sementara yang berikut semua harus menghasilkan output yang salah
[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]]