计算对角网格中的矩形


21

作为此挑战的后续措施,我们现在要计算具有r行和c列的网格中矩形的数量,其中有一条线穿过网格中正方形的每个对角线。现在,我们仍在计算与以前相同的矩形,但是这次我们还必须包括倾斜45度的矩形。

您的目标是创建一个给定行数r和列c输出尺寸为(rc)的对角网格中的矩形数的函数或程序。

作为演示,这是一个动画,它迭代了由(2 x 3)对角网格形成的所有37个矩形。

例

测试用例

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

规则

  • 这是因此最短的代码获胜。
  • 不允许使用解决此问题的内建函数。

7
只有数学可能对这个XD一个内建
康纳尔奥布莱恩

3
天哪,这比其他矩形要难得多.....
GamrCorps


1
我认为应该允许内置。我喜欢看到这些答案。
mbomb007'8

Answers:


8

Ruby,58个字节

这是释放氦核C答案中算法的直接实现。

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

我一直在研究为什么这个公式有效,但效果有限。很容易确认直立矩形的数量等于(m+1)*m/2 * (n+1)*n/2,对角矩形的数量则难以捉摸。

尼尔(Neil)已经确认m==n正方形中的倾斜矩形数量n*n(4*n**4-n*n-3*n)/6,并且 m>n您需要添加一个额外的矩形(m-n)(n*(4*n*n-1)/3)(与OEIS A000447有关),尽管这不能解释这两个公式的来源。我找到了答案的一部分。

因为m==n,网格内部的形状是阿兹台克人的钻石

Wolfram Alpha的Aztec Diamond图片

矩形的在阿兹特克金刚石的数量大的矩形的数目的总和叠加,使其(用于第四金刚石,这是在一发现5x5网格,2x84x66x4,和8x2)减去矩形的数目计数两次(数量前一个 Aztec菱形中的矩形)。

公式为(TeX将在以后添加):

# 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)

根据Wolfram Alpha的说法,fis 1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)的闭合形式和aztec_rectis 的闭合形式,如尼尔所发现的1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)

我还没有发现,为什么(m-n)(n*(4*n*n-1)/3)作品,但我怀疑这是因为一个定义A000447binomial(2*n+1, 3)。我会及时向大家发布。

更新:我有理由相信,扩展的Aztec钻石中矩形数目的函数与钻石负m>n号中重叠的2k*2(n-k)矩形数目有关F(m-1,n-1)。当我有它们时,会有更多结果。

更新:我尝试了一条不同的路线,并得出了另一种扩展阿兹台克人(Aztec)钻石的公式,该公式大部分是可以解释的,但其中一个术语我还不了解。头晕!: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)

最后一个公式的快速分解:

  • (m-n+1)*(4*n**4-n*n-3*n)/6n结构中大小重叠的Aztec钻石的数量,如f(n,n) = (4*n**4-n*n-3*n)/6f(7,3)有5颗重叠的阿兹台克人钻石3,而f(3,3)只有1颗钻石。
  • -f(m-1,n-1) 从叠加的菱形的中间删除一些重复的矩形。
  • +(m-n)*2占了2个额外的2-by- (2n-1)每个额外的钻石矩形。
  • +(m-n)*(n-2)占额外n-by- n每个额外的钻石广场。
  • -(m-n-1)*f(n-1,n-1)这是一个令人费解的新名词。显然,我在计算时没有考虑一些额外的平方,但是我还没有弄清楚它们在扩展菱形中的位置。

注意:m==n,,时m-n-1 = -1,表示此最后一项在计数中增加平方。我的常规公式中可能缺少一些内容。完全公开,这仅是对该公式的早期草稿的补丁,而该草稿恰好起作用。显然,我仍然需要深入了解发生了什么,这可能是我的公式中存在一些错误。我会及时向大家发布。

罗素(Russell),加里(Gary)和韦斯斯坦(Weisstein),埃里克·W(Eric W.)。来自MathWorld-Wolfram Web资源。http://mathworld.wolfram.com/AztecDiamond.html


我喜欢这个答案比原始答案具有更多的赞誉,并有+100赏金...:P
HyperNeutrino

5

C, 71 64字节

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

在Ideone上尝试


2
我很想知道这里发生了什么,以及您如何获得此解决方案。
约旦

1
@Jordan到目前为止,我已经验证了公式的后半部分m==n:正方形中倾斜矩形的数量n*n(4*n*n*n*n-n*n-3*n)/6。顺序为0、9、51、166、410、855、1589、2716、4356、6645,但未在OEIS中显示。
尼尔

1
我现在已经验证了,当m>n您需要添加其他内容时(m-n)(n*(4*n*n-1)/3)(公式的下半部分取自OEIS A000447)。重新排列并添加得出@betseg的公式。
尼尔

@Neil您是如何得出这些公式的?
Sherlock16年

2
@ Sherlock9我手动计算了前10个正方形中倾斜矩形的数量,并将序列输入到OEIS搜索引擎中,该引擎无法识别序列,但找到了与OP的公式匹配的公式m==n。然后,我手动计算了小矩形中倾斜矩形的数量,并注意到对于给定的较短尺寸,增加较长的尺寸总是会添加相同数量的矩形。我将增量输入到OEIS中,后者在A000447上找到了匹配项。
尼尔

4

Python,73 68字节

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)

虽然以下版本具有更高的字节数(75),但在查找使用位置时是一个不错的练习~

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

如果使用lambdax=lambda m,n:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6if m>n else x(n,m)
则为

啊,由于某种原因,我以为我们不得不使用def。谢谢!更新。
马库斯·安德鲁斯

3

凸面,37 36字节

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

在线尝试!

使用针对基于堆栈的语言修改和优化的betseg算法。我还有更多的空闲时间来解释。我敢打赌这可以缩短,但是我现在不打扰。


2

批次,82个字节

@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.