Hitung persimpangan persegi panjang

8

Tantangan

Diberikan jumlah persegi panjang yang sewenang-wenang, menghasilkan jumlah total persimpangan saat digambar dalam bidang 2D.

Persimpangan di sini didefinisikan sebagai titik Pyang dilintasi oleh dua garis yang saling orthogonal dan keduanya tidak berakhir P.

Contoh

Setiap persegi panjang di sini dilambangkan dengan 2-tuple dengan koordinat sudut kiri atas terlebih dahulu dan koordinat sudut kanan bawah kedua.

[(-8,6), (- 4, -2)]
[(-4,9), (4,3)]
[(2,10), (14,4)]
[(1,7), (10, -6)]
[(7,4), (10,2)]
[(5,2), (9, -4)]
[(-6, -4), (- 2, -6)]

masukkan deskripsi gambar di sini

Kotak itu membuat 6 persimpangan, yang harus menjadi output Anda.

  • Seperti yang Anda lihat pada gambar di atas, menyentuh persegi panjang tidak akan membuat persimpangan di sini dan tidak dihitung.
  • Anda dapat menyandikan segi empat dalam format apa pun yang Anda inginkan. Jelaskan format mana yang Anda gunakan.
  • Jika beberapa persegi panjang berpotongan pada titik yang sama, itu hanya dihitung sebagai satu persimpangan.
  • Koordinat akan selalu berupa bilangan bulat.
  • Tidak akan ada persegi panjang duplikat di input.
  • Anda akan selalu mendapatkan setidaknya satu persegi panjang sebagai input.
  • Anda tidak boleh menggunakan bawaan apa pun yang memecahkan masalah ini secara langsung. Selain itu, Anda tidak boleh menggunakan builtin yang memecahkan persamaan. Semua bawaan lainnya diizinkan.
  • Output harus berupa bilangan bulat tunggal yang menunjukkan jumlah persimpangan.

Aturan

  • Fungsi atau program lengkap diizinkan.
  • Aturan default untuk input / output.
  • Celah standar berlaku.
  • Ini adalah , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.

Uji kasus

Format yang sama seperti pada contoh di atas. Persegi panjang dibungkus dalam daftar.

[[(-8,6), (- 4, -2)], [(- 4,9), (4,3)], [(2,10), (14,4)], [(1 , 7), (10, -6)], [(7,4), (10,2)], [(5,2), (9, -4)], [(- 6, -4), (-2, -6)]] -> 6
[[(-2,2), (6, -4)]] -> 0
[[(-12,10), (- 8,6)], [(- 14,6), (- 10,2)], [(- 10,6), (- 6,2)]] - > 0
[[(-4,10), (6,2)], [(- 2,8), (4,3)], [(1,6), (8,4)], [(2,11) ), (5,5)]] -> 10
[[(8,2), (12, -2)], [(10,0), (14, -4)]] -> 2
[[(0,2), (2,0)], [(0,1), (3,0)]] -> 1
[[(-10, -2), (- 6, -6)], [(- 6, -2), (- 2, -6)], [(- 8, -4), (- 4, -8)]] -> 3

Selamat Coding!

Denker
sumber
Anda perlu menentukan apa yang ingin Anda hitung jawaban, karena banyak titik di persimpangan dua atau lebih persegi panjang tampaknya diabaikan, menurut diagram.
feersum
1
Jadi, [[(0,0),(1,2)],[(0,0),(2,1)]]apakah ada 1 persimpangan?
Neil
@Neil Persis. Akan tambahkan test case ini, terima kasih!
Denker
@feersum Saya pikir diagram membuatnya cukup jelas apa yang harus dihitung dan apa yang tidak. Tapi saya rasa definisi formal tidak akan sakit, akan menambahkannya.
Denker
1
Jika ada N pasang persegi panjang yang berpotongan di (x, y), apakah titik (x, y) dihitung satu kali atau N kali?
feersum

Jawaban:

2

JavaScript (ES6), 186 byte

a=>a.map(([a,b,c,d])=>h.push([b,a,c],[d,a,c])&v.push([a,b,d],[c,b,d]),h=[],v=[])|h.map(([d,a,e])=>v.map(([c,f,b])=>a<c&c<e&b<d&d<f&t.every(([a,b])=>a-c|b-d)&&t.push([c,d])),t=[])|t.length

Pisahkan masing-masing persegi panjang ke dalam garis komponennya, kemudian memotong garis horizontal dan vertikal, membangun daftar persimpangan untuk menghindari duplikat.

Neil
sumber
Format input mana yang Anda gunakan? Ketika saya menyebut ini dengan tastcases, saya selalu mendapatkan nol.
Denker
@ DenkerAffe Maaf, saya seharusnya mengatakan, saya mengharapkan array array 4 elemen misalnya [[-4,10,6,2],[-2,8,4,3],[1,6,8,4],[2,11,5,5]]. Karena JavaScript tidak memiliki tupel, jika Anda mencoba menggunakan contoh Anda secara harfiah, Anda akan memicu operator koma sebagai gantinya, membatalkan input.
Neil
Baik terima kasih. Namun, ini memberikan 4 bukannya 3 untuk testcase terakhir, karena persimpangan beberapa persegi panjang hanya dihitung sebagai satu persimpangan. Saya mengklarifikasi ini setelah Anda memposting jawaban Anda, saya pikir, jadi yang ini berlaku untuk saya. Semoga tidak terlalu sulit untuk memperbaikinya, maaf atas ketidaknyamanan ini.
Denker
@DenkerAffe Saya telah memperbaruinya untuk bekerja dengan spec baru Anda.
Neil
0

Mathematica 138 byte

Belum selesai! Ini berfungsi untuk semua kasus kecuali[[(0,0),(1,2)],[(0,0),(2,1)]]


Length@Union[Join@@(Cases[RegionIntersection@@# &/@Subsets[Line[{{#,#2},{#3,#2},{#3,#4},{#,#4},{#,#2}}]&@@@Flatten/@#,{2}],Point@a__:> a])]

Contoh

Length@Union[
Join @@ (Cases[RegionIntersection @@ # & /@ Subsets[
Line[{{#, #2}, {#3, #2}, {#3, #4}, {#, #4}, {#, #2}}] & @@@ Flatten /@ #, {2}], 
Point@a__ :> a])] &@{{{-8, 6}, {-4, -2}}, {{-4, 9}, {4, 3}}, {{2, 10}, {14, 4}}, 
{{1, 7}, {10, -6}}, {{7, 4}, {10, 2}}, {{5, 2}, {9, -4}}, {{-6, -4}, {-2, -6}}}

6

DavidC
sumber