Viết chương trình đếm vuông


8

Một câu đố nổi tiếng liên quan đến việc đếm có bao nhiêu hình vuông có thể được thực hiện bằng cách sử dụng các điểm trên lưới 3x3:

.  .  .
.  .  .
.  .  .

Câu trả lời là 6 - bốn hình vuông nhỏ, một hình vuông lớn và một hình vuông được hình thành từ các chốt trên cùng, bên trái, dưới cùng và bên phải, với các cạnh dọc theo các đường chéo của hình vuông.

Nhiệm vụ của bạn là xây dựng một chương trình đếm tổng số ô vuông có thể được hình thành từ một tập hợp các điểm.

Chương trình của bạn sẽ nhận đầu vào ở một trong hai định dạng (bạn chọn):

  • Một Mbởi Nlưới bao gồm .hoặc . .đại diện cho một điểm trên lưới mà hình vuông có thể là một góc và tất cả các không gian trên lưới chính xác cách nhau một đơn vị theo chiều ngang hoặc chiều dọc.

  • Một danh sách các cặp tọa độ biểu thị các điểm mà hình vuông có thể nằm trên.

và trả về số lượng hình vuông riêng biệt có thể được hình thành bằng cách sử dụng các điểm được cung cấp. Chương trình của bạn phải trả về một giải pháp chính xác cho mọi đầu vào có thể.


Ví dụ: lấy đầu vào ở trên nhưng thiếu hình vuông trung tâm:

...
. .
...

Chỉ có hai hình vuông có thể có ở đây (cái lớn và cái chéo), vì vậy chương trình sẽ trở lại 2.


Mã ngắn nhất để làm điều này trong bất kỳ ngôn ngữ nào sẽ thắng.


7
Tôi sẽ nâng cao bạn, nhưng danh tiếng của bạn là hoàn hảo. (6666) :-P
Doorknob

Miễn là tôi có tiếng tăm đó, tôi là ác quỷ :(
Joe Z.

Chúng ta đang nói về hình vuông hoặc hình chữ nhật ? Bạn nói đơn vị ngang và dọc là cả 1. Nhưng trong ví dụ của bạn, các chấm cách nhau một đơn vị theo chiều dọc nhưng cách nhau 3 đơn vị theo chiều ngang. Vậy những hình vuông đó như thế nào? Cũng có thể có khoảng trống trong đầu vào? Nếu vậy, bạn có thể cung cấp một ví dụ phức tạp hơn?
Martin Ender

Các dấu chấm trong câu hỏi chỉ được đặt rộng rãi hơn cho mục đích thẩm mỹ. Họ chỉ nên cách nhau một ký tự cho mục đích của câu hỏi thực tế.
Joe Z.

Giá trị tối đa có thể có của M và N là bao nhiêu và tổng số điểm tối đa là bao nhiêu? Và chúng ta có thể tự do nói có bao nhiêu điểm theo bất kỳ cách nào chúng ta muốn không? (Hoặc bằng cách lấy đầu vào lúc đầu hoặc bằng cách dừng lại khi đã đạt được một loại EOF nào đó.)
Level River St

Câu trả lời:


7

Con trăn, 95

Đưa ra một danh sách các tọa độ từ stdin.

l=input();print(sum((c-d+b,d+c-a)in l and(a-d+b,b+c-a)in l for a,b in l for c,d in l)-len(l))/4

Giải trình:

Đối với mỗi cặp điểm (a,b)(c,d), kiểm tra xem hình vuông có thêm điểm không (c-d+b,d+c-a)(a-d+b,b+c-a)có trong danh sách không. Điều này đếm mỗi hình vuông 4 lần và mỗi điểm một lần (khi (a,b) = (c,d)), vì vậy trừ đi số điểm và chia cho 4 sẽ cho số lượng hình vuông.


Khéo léo, súc tích.
primo
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.