Đếm các hình chữ nhật trong một lưới chéo


21

Để theo dõi thử thách này , giờ đây chúng tôi muốn đếm số lượng hình chữ nhật trong lưới với các hàng r và cột c trong đó có một đường thẳng đi qua mỗi đường chéo của một hình vuông trong lưới. Bây giờ, chúng ta vẫn đang đếm các hình chữ nhật giống như trước đây, nhưng lần này chúng ta cũng phải bao gồm các hình chữ nhật nghiêng 45 độ.

Mục tiêu của bạn là tạo ra một hàm hoặc chương trình cho số lượng hàng r và cột c xuất ra số lượng hình chữ nhật trong lưới đường chéo có kích thước ( r , c ).

Như một minh chứng, đây là một hình ảnh động lặp đi lặp lại qua tất cả 37 hình chữ nhật được hình thành bởi một lưới đường chéo (2 x 3).

Thí dụ

Các trường hợp thử nghiệm

Each case is [rows, columns] = # of rectangles
[0, 0] = 0
[0, 1] = 0
[1, 0] = 0
[1, 1] = 1
[3, 2] = 37
[2, 3] = 37
[6, 8] = 2183
[7, 11] = 5257
[18, 12] = 40932
[42, 42] = 2889558
[51, 72] = 11708274

Quy tắc

  • Đây là nên mã ngắn nhất sẽ thắng.
  • Nội dung giải quyết điều này không được phép.

7
Chỉ Mathicala mới có thể có bản dựng sẵn cho XD này
Conor O'Brien


5
Xem thử thách liên quan projecteuler.net/probols=147
Marcus Andrew

1
Tôi nghĩ rằng xây dựng nên được cho phép. Tôi thích nhìn thấy những câu trả lời.
mbomb007

Câu trả lời:


8

Ruby, 58 byte

Đây là một triển khai đơn giản của thuật toán trong việc phát hành câu trả lời C của Helium Nuclei's .

g=->m,n{n>m ?g[n,m]:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6}

Tôi đã nghiên cứu lý do tại sao công thức này hoạt động, với sự thành công hạn chế. Thật dễ dàng để xác nhận rằng số lượng hình chữ nhật thẳng đứng bằng (m+1)*m/2 * (n+1)*n/2, số lượng hình chữ nhật chéo là khó nắm bắt hơn một chút.

Neil đã khẳng định cho m==nrằng số lượng hình chữ nhật nghiêng trong một n*nvuông là (4*n**4-n*n-3*n)/6khi m>n bạn cần phải bổ sung thêm một (m-n)(n*(4*n*n-1)/3)(liên quan đến OEIS A000447 ), mặc dù điều này không giải thích nơi hai công thức đến từ đâu. Tôi đã tìm thấy một phần của câu trả lời.

Đối với m==n, hình dạng bên trong lưới là một viên kim cương Aztec .

Hình ảnh kim cương Aztec từ Wolfram Alpha

Số lượng các hình chữ nhật trong một viên kim cương Aztec là tổng số các hình chữ nhật lớn chồng lên để làm cho nó (đối với kim cương thứ tư, được tìm thấy trong một 5x5lưới, 2x8, 4x6, 6x4, và 8x2) trừ đi số của hình chữ nhật tính hai lần (số lượng hình chữ nhật trong viên kim cương Aztec trước đó ).

Công thức ở đây là (TeX sẽ được thêm vào sau):

# superimposed rectangles, 2x(2n-2), 4*(2n-4), ...
f = lambda n: sum( (2*k)*(2*k+1)/2 * (2*n-2*k)*(2*n-2*k+1)/2 for k in range(1, n) )
aztec_rect = f(n) - f(n-1)

Theo Wolfram Alpha, hình thức khép kín cho f1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)và hình thức khép kín cho aztec_rectlà, như Neil phát hiện, 1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n).

Tôi vẫn chưa khám phá lý do tại sao (m-n)(n*(4*n*n-1)/3)hoạt động, mặc dù tôi nghi ngờ rằng đó là vì một định nghĩa của A000447binomial(2*n+1, 3). Tôi sẽ giữ cho bạn được đăng.

Cập nhật: Tôi có lý do để tin rằng chức năng của số lượng hình chữ nhật trong một viên kim cương Aztec mở rộng m>ncó liên quan đến số lượng 2k*2(n-k)hình chữ nhật chồng lên nhau trong dấu trừ kim cương F(m-1,n-1). Kết quả nhiều hơn khi tôi có chúng.

Cập nhật: Tôi đã thử một tuyến đường khác và kết thúc với một công thức khác cho kim cương Aztec mở rộng hầu hết có thể giải thích được nhưng có một thuật ngữ mà tôi chưa hiểu. Huzzah! : D

def f(m,n):
 if n > m:
     return f(n,m)
 if n == 0:
     return 0
 else:
     return(m-n+1)*(4*n**4-n*n-3*n)/6-f(m-1,n-1)+(m-n)*2+(m-n)*(n-2)-(m-n-1)*f(n-1,n-1)

Phân tích nhanh công thức cuối cùng đó:

  • (m-n+1)*(4*n**4-n*n-3*n)/6là số lượng kim cương Aztec xếp chồng có kích thước ntrong cấu trúc, như f(n,n) = (4*n**4-n*n-3*n)/6. f(7,3)có 5 viên kim cương Aztec xếp chồng lên nhau 3, trong khi f(3,3)chỉ có 1 viên kim cương.
  • -f(m-1,n-1) loại bỏ một số hình chữ nhật trùng lặp ở giữa các viên kim cương chồng lên nhau.
  • +(m-n)*2chiếm 2 thêm 2-by- (2n-1)hình chữ nhật cho mỗi viên kim cương thêm.
  • +(m-n)*(n-2)chiếm một hình vuông nngoại cỡ ncho mỗi viên kim cương phụ.
  • -(m-n-1)*f(n-1,n-1)Đây là thuật ngữ khó hiểu mới. Rõ ràng tôi đã không tính đến một số hình vuông phụ trong số đếm của mình, nhưng tôi đã không tìm ra vị trí của chúng trong viên kim cương mở rộng.

Lưu ý: khi m==n,, m-n-1 = -1có nghĩa là thuật ngữ cuối cùng này thêm hình vuông vào số đếm. Tôi có thể thiếu một cái gì đó trong công thức thông thường của tôi. Tiết lộ đầy đủ, điều này chỉ có nghĩa là một bản vá cho một dự thảo trước đó của công thức này vừa xảy ra để làm việc. Rõ ràng, tôi vẫn cần phải tìm hiểu những gì đang diễn ra, và có thể là công thức của tôi có một số lỗi trong đó. Tôi sẽ giữ cho bạn được đăng.

Russell, Gary và Weisstein, Eric W. "Kim cương Aztec." Từ MathWorld - Tài nguyên web Wolfram. http://mathworld.wolfram.com/AztecDihua.html


Tôi thích cách câu trả lời này có nhiều lượt nâng cao hơn câu trả lời ban đầu và tiền thưởng +100 ...: P
HyperNeutrino

5

C, 71 64 byte

f(m,n){return n>m?f(n,m):m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6;}

Hãy thử nó trên Ideone


2
Tôi rất muốn biết những gì đang xảy ra ở đây và làm thế nào bạn đi đến giải pháp này.
Jordan

1
@Jordan Cho đến nay tôi đã xác minh nửa sau của công thức cho m==n: số lượng hình chữ nhật nghiêng trong một n*nhình vuông là (4*n*n*n*n-n*n-3*n)/6. Trình tự là 0, 9, 51, 166, 410, 855, 1589, 2716, 4356, 6645 nhưng nó không xuất hiện trong OEIS.
Neil

1
Bây giờ tôi đã xác minh rằng khi m>nbạn cần thêm một phần bổ sung (m-n)(n*(4*n*n-1)/3)(phần sau của công thức được lấy từ OEIS A000447). Sắp xếp lại và thêm cho công thức của @ betseg.
Neil

@Neil Làm thế nào bạn đến với các công thức?
Sherlock9

2
@ Sherlock9 Tôi đã tính toán thủ công số lượng hình chữ nhật nghiêng trong 10 hình vuông đầu tiên và đưa chuỗi vào công cụ tìm kiếm OEIS không nhận ra chuỗi nhưng tìm ra công thức phù hợp với công thức của OP m==n. Sau đó, tôi đã tính toán thủ công số lượng hình chữ nhật nghiêng trong hình chữ nhật nhỏ và nhận thấy việc tăng kích thước dài hơn luôn thêm cùng một lượng hình chữ nhật cho kích thước ngắn hơn cho trước. Tôi đã đưa số gia vào OEIS, kết quả tìm thấy trên A000447.
Neil

4

Python, 73 68 byte

x=lambda m,n:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6if m>n else x(n,m)

Và trong khi phiên bản sau có tỷ lệ cao hơn (75), thì đó là một bài tập hay trong việc tìm địa điểm để sử dụng ~:

def f(r,c):
 if r<c:r,c=c,r
 x=(4*c**3-c)/3
 return r*c*~r*~c/4+x*r--~x*c/2

68 byte nếu bạn sử dụng lambda:x=lambda m,n:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6if m>n else x(n,m)
GamrCorps

Ahh, vì một số lý do tôi cho rằng chúng tôi phải sử dụng def. Cảm ơn! Cập nhật.
Marcus Andrew

3

Lồi, 37 36 byte

__:)+×½½\~æ<{\}&:N\¦\-N¦¦N*(*3-N*6/+

Hãy thử trực tuyến!

Sử dụng thuật toán của betseg được sửa đổi và tối ưu hóa cho ngôn ngữ dựa trên ngăn xếp. Giải thích sẽ đến khi tôi có thêm thời gian rảnh. Tôi cá là điều này có thể rút ngắn nhưng tôi sẽ không bận tâm vào lúc này.


2

Mẻ, 82 byte

@if %2 gtr %1 %0 %2 %1
@cmd/cset/a%1*~%1*%2*~%2/4+((%1+%1-%2)*(%2*%2*4-1)-3)*%2/6
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.