นับสี่เหลี่ยมในเส้นทแยงมุม


21

จากการติดตามความท้าทายนี้เราต้องการนับจำนวนสี่เหลี่ยมในตารางด้วยแถวrและคอลัมน์cที่มีเส้นตรงข้ามผ่านเส้นทแยงมุมทุกตารางในตาราง ทีนี้เรายังคงนับสี่เหลี่ยมเหมือนเดิม แต่คราวนี้เราต้องรวมสี่เหลี่ยมที่เอียง 45 องศาด้วย

เป้าหมายของคุณคือการสร้างฟังก์ชั่นหรือโปรแกรมที่กำหนดจำนวนแถวrและคอลัมน์cส่งออกจำนวนสี่เหลี่ยมในตารางเส้นทแยงมุมที่มีขนาด ( r , c )

เป็นการสาธิตนี่เป็นแอนิเมชั่นที่วนซ้ำทั้ง 37 รูปที่เกิดจากเส้นทแยงมุม (2 x 3)

ตัวอย่าง

กรณีทดสอบ

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
เฉพาะ Mathematica เท่านั้นที่สามารถมี builtin สำหรับ XD นี้
Conor O'Brien

3
เอ้ยนี่มันยากกว่าตัวสี่เหลี่ยมผืนผ้าอื่น ๆ .....
GamrCorps


1
ฉันคิดว่าบิวด์อินควรได้รับอนุญาต ฉันชอบที่จะเห็นคำตอบเหล่านั้น
mbomb007

คำตอบ:


8

ทับทิม 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จำนวนของรูปสี่เหลี่ยมผืนผ้าในแนวทแยงนั้นดูเข้าใจยากขึ้นเล็กน้อย

นีลได้รับการยืนยันสำหรับ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รูปร่างภายในตารางเป็นเพชรแอซเท็ก

ภาพ Aztec Diamond จาก Wolfram Alpha

จำนวนสี่เหลี่ยมในเพชรแอซเทคคือผลรวมของจำนวนสี่เหลี่ยมที่มีขนาดใหญ่ทับจะทำให้มัน (สำหรับเพชรสี่ซึ่งพบใน5x5ตาราง2x8, 4x6, 6x4และ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 รูปแบบปิดสำหรับfคือ1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)และรูปแบบปิดสำหรับaztec_rectคือตามที่ Neil ค้นพบ, 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)คือ ฉันจะให้คุณโพสต์

ปรับปรุง:ฉันมีเหตุผลที่จะเชื่อว่าการทำงานของจำนวนสี่เหลี่ยมในเพชรแอซเท็กขยายm>nที่เกี่ยวข้องกับจำนวนทับสี่เหลี่ยมในลบเพชร2k*2(n-k) F(m-1,n-1)ผลลัพธ์เพิ่มเติมเมื่อฉันมีพวกเขา

อัปเดต:ฉันลองใช้เส้นทางที่แตกต่างและจบลงด้วยสูตรอื่นสำหรับเพชร Aztec แบบขยายซึ่งส่วนใหญ่สามารถอธิบายได้ แต่มีคำหนึ่งคำที่ฉันยังไม่เข้าใจ 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)

การแบ่งย่อยอย่างรวดเร็วของสูตรสุดท้าย:

  • (m-n+1)*(4*n**4-n*n-3*n)/6คือจำนวนทับเพชรแอซเท็กของขนาดในโครงสร้างที่เป็นn มีเพชร Aztec ซ้อนทับ 5 ขนาดในขณะที่มีเพียง 1 เพชรf(n,n) = (4*n**4-n*n-3*n)/6f(7,3)3f(3,3)
  • -f(m-1,n-1) ลบสี่เหลี่ยมที่ซ้ำกันบางส่วนออกจากตรงกลางของเพชรที่ซ้อนทับ
  • +(m-n)*2บัญชีสำหรับ 2 พิเศษ - 2by - (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, Eric W. "Aztec Diamond" จาก MathWorld - ทรัพยากรเว็บ Wolfram http://mathworld.wolfram.com/AztecDiamond.html


ฉันชอบวิธีที่คำตอบนี้มี upvotes มากกว่าคำตอบเดิมและค่าหัว +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
Neil

1
ฉันได้ตรวจสอบแล้วว่าเมื่อm>nคุณต้องการเพิ่มเพิ่มเติม(m-n)(n*(4*n*n-1)/3)(ส่วนหลังของสูตรที่นำมาจาก OEIS A000447) การจัดเรียงและการเพิ่มให้สูตรของ @ betseg
Neil

@Neil คุณมาถึงสูตรเหล่านั้นได้อย่างไร?
Sherlock9

2
@ Sherlock9 ผมคำนวณได้ด้วยตนเองจำนวนสี่เหลี่ยมเอียงใน 10 สี่เหลี่ยมแรกและเลี้ยงลำดับลงในเครื่องมือค้นหา OEIS ซึ่งไม่รู้จักลำดับ แต่ก็พบว่าสูตรสำหรับมันซึ่งตรงกับสูตรของ OP m==nสำหรับ จากนั้นฉันคำนวณจำนวนสี่เหลี่ยมมุมฉากเป็นสี่เหลี่ยมเล็ก ๆ ด้วยตนเองและสังเกตว่าการเพิ่มมิติที่ยาวขึ้นจะเพิ่มจำนวนสี่เหลี่ยมที่เท่ากันเสมอสำหรับมิติที่สั้นกว่านั้น ฉันป้อนส่วนเพิ่มใน OEIS ซึ่งพบว่าตรงกันใน A000447
Neil

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อ่าด้วยเหตุผลบางอย่างผมถือว่าเรามีการใช้ ขอบคุณ! Updated
Marcus Andrews

3

นูน37 36 ไบต์

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

ลองออนไลน์!

ใช้อัลกอริทึมของ betseg แก้ไขและปรับให้เหมาะสมสำหรับภาษาสแต็ก คำอธิบายมาเมื่อฉันมีเวลาว่าง ฉันพนันได้ว่าจะสั้นลง แต่ฉันจะไม่ไปรบกวนในขณะนี้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.