Masalah Geometris sederhana

8

Masalah ini (lihat di bawah) telah diberikan sebagai tantangan golf kode Liga Pemrograman SMA. Kode terpendek yang dikirimkan selama kontes adalah: 177 byte di Ruby, 212 byte di Python 2.5, 265 byte di C. Adakah yang bisa membuatnya lebih pendek? Bahasa pemrograman lain juga diperbolehkan.

Rumusan masalah : Diberikan 8 bilangan bulat: -1000 <x1, y1, x2, y2, x3, y3, x4, y4 <1000. Periksa bagaimana bentuk persimpangan dua persegi panjang yang disejajarkan dengan sumbu: P1 = (x1, y1) , (x1, y2), (x2, y2), (x2, y1) dan P2 = (x3, y3), (x3, y4), (x4, y4), (x4, y3).

* If the rectangles do not intersect print *nothing*.
* If there is exactly one point in common print *point*.
* If the intersections of P1 and P2 is a line segment print *line*.
* If they have a rectangular area in common print *rectangle*. 

Spesifikasi data input : Baris pertama berisi jumlah test case t (1 <= t <1000). Setiap baris t berikut berisi 8 bilangan bulat: x1, y1, x2, y2, x3, y3, x4, y4 (Luas kedua persegi panjang lebih besar dari 0).

Anda dapat menguji solusi Anda di sini .

kuszi
sumber
Kenapa saya tidak melihat solusi yang diajukan untuk masalah ini?
Keith Randall
@Keith Randall Sesi kontes telah berakhir, hasil untuk solusi yang disampaikan dirangkum di sini
kuszi
Bagaimana jika koordinat tidak membuat persegi panjang? Bagaimana jika bentuknya tumpang tindih untuk membentuk bentuk selain persegi panjang?
0WJYxW9FMN
@ J843136028 Anda dapat mengasumsikan bahwa mereka memang membentuk persegi panjang. Untuk bagian kedua dari pertanyaan saya bisa melihat sekarang bahwa tidak disebutkan bahwa persegi panjang selaras sumbu (tidak ada kata yang ditambahkan).
kuszi

Jawaban:

4

Python, 200 karakter

f=lambda a,b,c,d:min(2,sum((x-c)*(x-d)<=0for x in range(min(a,b),max(a,b)+1)))
for i in' '*input():z=map(int,raw_input().split());print('nothing','point','line',0,'rectangle')[f(*z[::2])*f(*z[1::2])]

f pengembalian:

0 if the intervals [a,b] and [c,d] don't overlap
1 if the intervals [a,b] and [c,d] overlap in only one point
2 if the intervals [a,b] and [c,d] overlap in a range of points
Keith Randall
sumber
3

OCaml, 265 karakter

let a,c,p=abs,compare,print_endline
let q s t u v w x y z=match
c(a(s-u)+a(w-y))(a(s+u-w-y)),
c(a(t-v)+a(x-z))(a(t+v-x-z))with
0,0->p"point"|0,1|1,0->p"line"|1,1->p"rectangle"|_->p"nothing"
let()=for n=1 to read_int()do Scanf.scanf"%d %d %d %d %d %d %d %d\n"q done

Menggunakan (menyalahgunakan) fakta bahwa membandingkan menghasilkan 0, 1 atau -1. Ini tidak dijamin menurut dokumentasinya tetapi benar dengan OCaml 3.10.1.

bltxd
sumber
Bagus! Satu saran: Saya akan menulis Scanf.scanf "% d% d% d% d% d% d% d% d" (-1 char)
kuszi