対角グリッドの長方形を数える


21

この課題のフォローアップとして、グリッド内の正方形のすべての対角線を横切る線がある、rc列のグリッド内の長方形の数を数えたいと思います。今でも、以前と同じ長方形を数えていますが、今回は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に組み込みできるのはMathematicaのみ
コナーオブライエン

3
まあ、これは他の長方形のものよりもはるかに難しい
.....-GamrCorps

5
関連するチャレンジを参照してくださいprojecteuler.net/problem=147
マーカス・アンドリュース

1
組み込みが許可されるべきだと思います。私はそれらの答えを見るのが好きです。
mbomb007

回答:


8

ルビー、58バイト

これは、Releasing Helium NucleiのC answerのアルゴリズムの簡単な実装です。

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です、対角線の長方形の数はもう少しわかりにくいです。

ニールはいる確認のためm==nに傾斜矩形の数というn*nの正方形である(4*n**4-n*n-3*n)/6とことをするとき m>nは、追加追加する必要がある(m-n)(n*(4*n*n-1)/3)(に関連OEIS A000447)、これは説明しませんが、これらの2つの式はどこから来たのか。答えの一部を見つけました。

の場合m==n、グリッド内の形状はアステカのダイヤモンドです。

Wolfram AlphaのAztec Diamond画像

アステカダイヤモンドにおける矩形の数は、(に見出される第四のダイヤモンドのために作るために大きな矩形の数の和重畳される5x5グリッド、2x84x66x4、と8x2)マイナス矩形の数が二倍(の数を数え前のアステカダイヤモンドの四角形)。

ここでの式は次のとおりです(後で追加される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)機能するのかはまだわかっていませんが、A000447の定義の1 つがであるためと思われますbinomial(2*n+1, 3)。投稿し続けます。

更新:拡張されたAztecダイヤモンドの長方形の数の関数は、ダイヤモンドのマイナスの長方形m>nの重ね合わせに関係していると信じる理由があります。私がそれらを持っているときより多くの結果。2k*2(n-k)F(m-1,n-1)

更新:別のルートを試してみたところ、ほとんどが説明可能な拡張アステカダイヤモンドの別の公式になりましたが、まだ理解していない用語が1つあります。ハザ!: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)/6は、n構造内のサイズの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)*22つの余分を占め2行列の(2n-1)各余分なダイヤモンドのための長方形。
  • +(m-n)*(n-2)余分を占めn行列のn各余分なダイヤモンドのための正方形。
  • -(m-n-1)*f(n-1,n-1)これは新しい不可解な用語です。どうやら、カウントの際にいくつかの余分な正方形を考慮していないようですが、それらが拡張ダイヤモンドのどこにあるのかわかりません。

注:、、の場合m==nm-n-1 = -1この最後の項カウントに平方を追加することを意味します。通常の式で何かが足りないかもしれません。完全な開示。これは、たまたま機能したこの式の初期のドラフトへのパッチであることを意図したものです。明らかに、私はまだ何が起こっているのかを掘り下げる必要があり、私の式にはいくつかのバグがあるかもしれません。投稿し続けます。

ラッセル、ゲイリー、ワイスシュタイン、エリック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どうやってそれらの式にたどり着きましたか?
Sherlock9

2
@ Sherlock9最初の10個の正方形の傾斜した長方形の数を手動で計算し、シーケンスを認識しなかったがのOPの式と一致する式を見つけたOEIS検索エンジンにシーケンスを送りました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

ラムダを使用する場合は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)
GamrCorps

ああ、なんらかの理由でを使わなければならないと思いました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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.