Bài toán hình học đơn giản


8

Vấn đề này (xem bên dưới) đã được đưa ra như một thử thách chơi gôn mã trường trung học lập trình. Các mã ngắn nhất được gửi trong cuộc thi là: 177 byte trong Ruby, 212 byte trong Python 2.5, 265 byte trong C. Có ai có thể làm cho nó ngắn hơn không? Các ngôn ngữ lập trình khác cũng được cho phép.

Xây dựng bài toán : Cho 8 số nguyên: -1000 <x1, y1, x2, y2, x3, y3, x4, y4 <1000. Kiểm tra hình dạng của giao điểm của hai hình chữ nhật thẳng hàng trục: P1 = (x1, y1) , (x1, y2), (x2, y2), (x2, y1) và 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*. 

Đặc tả dữ liệu đầu vào : Dòng đầu tiên chứa số lượng trường hợp thử nghiệm t (1 <= t <1000). Mỗi dòng t sau đây chứa 8 số nguyên: x1, y1, x2, y2, x3, y3, x4, y4 (Diện tích của cả hai hình chữ nhật đều lớn hơn 0).

Bạn có thể kiểm tra giải pháp của bạn ở đây .


Tại sao tôi không thấy bất kỳ giải pháp được gửi cho vấn đề này?
Keith Randall

@Keith Randall Phiên thi đã kết thúc, kết quả cho các giải pháp đã gửi được tóm tắt tại đây
kuszi

Nếu tọa độ không tạo hình chữ nhật thì sao? Điều gì nếu các hình dạng chồng lên nhau để tạo thành một hình dạng khác với một hình chữ nhật?
0WJYxW9FMN

@ J843136028 bạn có thể giả sử rằng chúng tạo thành một hình chữ nhật. Đến phần thứ hai, tôi có thể thấy rằng bây giờ không đề cập đến việc hình chữ nhật được căn chỉnh theo trục (thiếu từ được thêm vào).
kuszi

Câu trả lời:


4

Con trăn, 200 ký tự

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 trả về:

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

3

OCaml, 265 ký tự

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

Sử dụng (lạm dụng) thực tế là so sánh trả về 0, 1 hoặc -1. Điều này không được đảm bảo theo tài liệu của nó nhưng đúng với OCaml 3.10.1.


Đẹp! Một đề xuất: Tôi sẽ viết Scanf.scanf "% d% d% d% d% d% d% d% d" (-1 char)
kuszi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.