Çapraz bir ızgaradaki dikdörtgenleri say


21

Bir izlem Buna gibi meydan , şimdi ile ızgara dikdörtgenler sayısını saymak istediğiniz r satır ve c ızgarasında bir karenin her çaprazdaysa bir çizgi geçidi bulunduğu yerde sütunlar. Şimdi, yine de aynı dikdörtgenleri sayıyoruz, ancak bu sefer 45 derece eğilen dikdörtgenleri de içermeliyiz.

Amacınız, r ve sütun c sayıları verilen, köşeli bir ızgaradaki dikdörtgen sayısını ( r , c ) veren bir işlev veya program oluşturmaktır .

Gösteri olarak, bu (2 x 3) diyagonal bir ızgara tarafından oluşturulan 37 dikdörtgenin tamamında yinelenen bir animasyondur.

Örnek

Test Kılıfları

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

kurallar

  • Bu yani en kısa kod kazanır.
  • Bunu çözen yerleşiklere izin verilmez.

7
Sadece Mathematica bu XD için bir yerleşik oluşturabilirdi
Conor O'Brien

3
Tanrım, bu diğerlerine göre çok daha zor .....
GamrCorps

5
İlgili mücadeleye bakın projecteuler.net/problem=147
Marcus Andrews 19

1
Bence yerleşiklere izin verilmeli. Bu cevapları görmeyi seviyorum.
mbomb007

Yanıtlar:


8

Ruby, 58 bayt

Bu, Helyum Nuclei'nin C cevabını yayınlamadaki algoritmanın basit bir uygulamasıdır .

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

Bu formülün neden çalıştığını sınırlı bir başarı ile araştırıyordum. Dik dikdörtgenlerin sayısının eşit olduğunu (m+1)*m/2 * (n+1)*n/2, köşeli dikdörtgenlerin sayısının biraz daha zor olduğunu onaylamak kolaydır .

Neil etti teyit için m==nbir in eğik dikdörtgenler sayısı o n*nmeydanda olduğunu (4*n**4-n*n-3*n)/6ve bu zaman m>n ek bir eklemem gerekiyor (m-n)(n*(4*n*n-1)/3)(ilgili OEIS A000447 ), bu açıklamaz olsa bu iki formüller nereden geldiğini. Cevabın bir kısmını buldum.

Çünkü m==n, ızgaranın içindeki şekli bir Aztek elmasıdır .

Wolfram Alpha'dan Aztek elmas görüntü

Bir Aztec elmas dikdörtgenler sayısı büyük dikdörtgen sayısının toplamı, (a bulunan dördüncü elmas için yapmak üst üste biner 5x5ızgara, 2x8, 4x6, 6x4, ve 8x2eksi dikdörtgenler sayısı) sayılır iki kez (sayısı önceki Aztek elmasındaki dikdörtgenler ).

Buradaki formül (daha sonra eklenecek 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, kapalı forma göre fIS 1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)ve kapalı formda aztec_rectNeil keşfetti OLDUĞU GİBİ, 1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n).

Neden keşfetmek için henüz (m-n)(n*(4*n*n-1)/3)ben bir tanım çünkü olduğundan şüpheleniyorsanız olsa eserlerini A000447 olduğunu binomial(2*n+1, 3). Seni haberdar edeceğim.

Güncelleme: Uzatılmış bir Aztek elmasındaki dikdörtgen sayısının işlevinin , elmas eksi içindeki m>nbindirilmiş 2k*2(n-k)dikdörtgen sayısı ile ilişkili olduğuna inanmak için nedenlerim var F(m-1,n-1). Onlara sahipken daha fazla sonuç.

Güncelleme: Farklı bir rota denedim ve çoğunlukla açıklanabilen ancak henüz anlamadığım bir terimi olan genişletilmiş Aztek elmasları için başka bir formül kullandım. 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)

Bu son formülün hızlıca çözülmesi:

  • (m-n+1)*(4*n**4-n*n-3*n)/6nyapıdaki üst üste bindirilmiş Aztek elmaslarının sayısıdır f(n,n) = (4*n**4-n*n-3*n)/6. f(7,3)5 Aztec elmas için boyut üst üste olan 3ise, f(3,3)sadece 1 elmas sahiptir.
  • -f(m-1,n-1) yinelenen dikdörtgenlerin bir kısmını üst üste bindirilmiş elmasların ortasından çıkarır.
  • +(m-n)*2Her bir ekstra elmas için 2 ekstra 2- (2n-1)dikdörtgen.
  • +(m-n)*(n-2)İlave hesapları n-by- nfazladan her elmas için meydanda.
  • -(m-n-1)*f(n-1,n-1)Bu yeni şaşırtıcı terimdir. Görünüşe göre sayımdaki bazı fazladan kareleri hesaba katmadım, fakat uzatılmış elmasın neresinde olduklarını bulamadım.

Not: ne zaman m==n, m-n-1 = -1bu son terimin sayıma kareler eklediği anlamına gelir . Normal formülümde bir şeyler eksik olabilir. Tam açıklama, bu sadece işe yeni başlamış olan bu formülün daha önceki bir taslağı için bir yama olması demekti. Açıkçası, neler olup bittiğini araştırmaya ihtiyacım var ve formülümün içinde bazı böcekler olabilir. Seni haberdar edeceğim.

Russell, Gary ve Weisstein, Eric W. "Aztek Elmas." MathWorld'den - Bir Wolfram Web Kaynağı. http://mathworld.wolfram.com/AztecDiamond.html


Bu cevabın orijinal cevabından daha çok oyu olması ve bir +100
ödülünün olmasını seviyorum

5

C 71 64 bayt

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'da dene


2
Burada neler olup bittiğini ve bu çözüme nasıl ulaştığınızı bilmek isterim.
Ürdün

1
@Jordan Şimdiye kadar formülün ikinci yarısını doğruladım m==n: bir n*nkaredeki eğik dikdörtgenlerin sayısı (4*n*n*n*n-n*n-3*n)/6. Dizi 0, 9, 51, 166, 410, 855, 1589, 2716, 4356, 6645'tir, ancak OEIS'te görünmez.
Neil

1
Şimdi m>nek eklemek istediğinizde (m-n)(n*(4*n*n-1)/3)(OEIS A000447'den alınan formülün son kısmı) onayladım. Yeniden düzenleme ve ekleme @ betseg'in formülünü verir.
Neil

@Neil Bu formüllere nasıl ulaştınız?
Sherlock9

2
@ Sherlock9 İlk 10 karedeki eğik dikdörtgenlerin numaralarını manuel olarak hesapladım ve diziyi OEIS arama motoruna besledim, diziyi tanımayan ancak bunun için OP'nin formülüne uyan bir formül buldum m==n. Daha sonra, küçük dikdörtgenlerde eğik dikdörtgenlerin sayısını manuel olarak hesapladım ve daha uzun boyutun arttığını fark ettim, verilen daha kısa bir boyut için her zaman aynı miktarda dikdörtgen ekledim. Artışları A000447'de bir eşleşme bulunan OEIS'e besledim.
Neil

4

Python, 73 68 bayt

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)

Aşağıdaki sürüm daha yüksek bytecount'a (75) sahipken, kullanılacak yerleri bulmak için güzel bir egzersizdi ~:

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

Bir lambda kullanırsanız 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)
GamrCorps

Ahh, nedense kullanmak zorunda olduğumuzu sandım def. Teşekkürler! Güncellenmiş.
Marcus Andrews,

3

Dışbükey, 37 36 bayt

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

Çevrimiçi deneyin!

Yığın tabanlı bir dil için değiştirilmiş ve optimize edilmiş betseg algoritmasını kullanır. Biraz daha boş zamanım olduğunda geleceğim açıklama. Bahse girerim bu kısaltılabilir ama şu anda canını sıkmayacağım.


2

Toplu iş, 82 bayt

@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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.