Sebagai tindak lanjut dari tantangan ini , kami sekarang ingin menghitung jumlah persegi panjang dalam grid dengan r baris dan kolom c di mana ada garis yang melintasi setiap diagonal dari sebuah persegi di grid. Sekarang, kami masih menghitung persegi panjang yang sama seperti sebelumnya, tapi kali ini kami juga harus memasukkan persegi panjang yang dimiringkan 45 derajat.
Tujuan Anda adalah membuat fungsi atau program yang memberikan jumlah baris r dan kolom c menghasilkan jumlah persegi panjang dalam kisi diagonal dengan dimensi ( r , c ).
Sebagai demonstrasi, ini adalah animasi yang diputar melalui semua 37 persegi panjang yang dibentuk oleh kisi diagonal (2 x 3).
Uji Kasus
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
Aturan
- Ini adalah kode-golf sehingga kode terpendek menang.
- Orang bawaan yang memecahkan masalah ini tidak diizinkan.
Jawaban:
Ruby, 58 byte
Ini adalah implementasi langsung dari algoritma dalam Melepaskan jawaban C Helium Nuclei .
Saya telah menyelidiki mengapa formula ini bekerja, dengan keberhasilan yang terbatas. Sangat mudah untuk mengkonfirmasi bahwa jumlah persegi panjang tegak sama dengan
(m+1)*m/2 * (n+1)*n/2
, jumlah persegi panjang diagonal sedikit lebih sulit dipahami.Neil punya dikonfirmasi untuk
m==n
bahwa jumlah persegi panjang miring dalamn*n
persegi(4*n**4-n*n-3*n)/6
dan bahwa ketikam>n
Anda perlu menambahkan tambahan(m-n)(n*(4*n*n-1)/3)
(terkait dengan Oei A000447 ), meskipun ini tidak menjelaskan di mana dua formula berasal. Saya telah menemukan bagian dari jawabannya.Sebab
m==n
, bentuk di dalam grid adalah berlian Aztec .Jumlah persegi panjang dalam berlian Aztec adalah jumlah dari jumlah persegi panjang besar ditumpangkan untuk membuatnya (untuk diamond keempat, yang ditemukan dalam
5x5
grid,2x8
,4x6
,6x4
, dan8x2
) dikurangi jumlah persegi panjang dihitung dua kali (jumlah persegi panjang di berlian Aztec sebelumnya ).Rumusnya di sini adalah (TeX akan ditambahkan nanti):
Menurut Wolfram Alpha, bentuk tertutup untuk
f
adalah1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)
dan bentuk tertutupaztec_rect
adalah, seperti yang ditemukan Neil1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)
,.Saya belum menemukan alasannya
(m-n)(n*(4*n*n-1)/3)
bekerja, meskipun saya curiga itu karena satu definisi A000447 adalahbinomial(2*n+1, 3)
. Saya akan membuat Anda tetap diposting.Memperbarui: Saya punya alasan untuk percaya bahwa fungsi jumlah persegi panjang pada berlian Aztec yang diperluas
m>n
terkait dengan jumlah2k*2(n-k)
persegi panjang yang dilapiskan pada minus berlianF(m-1,n-1)
. Lebih banyak hasil ketika saya memilikinya.Pembaruan: Saya mencoba rute yang berbeda dan berakhir dengan formula lain untuk berlian Aztec tambahan yang sebagian besar dapat dijelaskan tetapi memiliki satu istilah yang belum saya mengerti. Sabas! : D
Rincian cepat dari formula terakhir itu:
(m-n+1)*(4*n**4-n*n-3*n)/6
adalah jumlah berlian Aztec ditumpangkan ukurann
dalam struktur, sepertif(n,n) = (4*n**4-n*n-3*n)/6
.f(7,3)
memiliki 5 ukuran berlian Aztec3
, sementaraf(3,3)
hanya memiliki 1 berlian.-f(m-1,n-1)
menghapus beberapa duplikat persegi panjang dari tengah berlian yang dilapiskan.+(m-n)*2
menyumbang 2 ekstra-2
oleh-(2n-1)
persegi panjang untuk setiap berlian ekstra.+(m-n)*(n-2)
menyumbang tambahann
-by-n
persegi untuk setiap berlian ekstra.-(m-n-1)*f(n-1,n-1)
Ini adalah istilah baru yang membingungkan. Tampaknya saya belum menghitung beberapa kotak tambahan dalam penghitungan saya, tapi saya belum menemukan di mana mereka berada di berlian diperpanjang.Catatan: kapan
m==n
,,m-n-1 = -1
artinya istilah terakhir ini menambahkan kotak ke penghitungan. Saya mungkin kehilangan sesuatu dalam formula biasa saya. Pengungkapan penuh, ini hanya dimaksudkan sebagai tambalan untuk rancangan awal formula ini yang baru saja berfungsi. Jelas, saya masih perlu menggali apa yang terjadi, dan mungkin formula saya mengandung beberapa bug di dalamnya. Saya akan membuat Anda diposting.Russell, Gary dan Weisstein, Eric W. "Aztec Diamond." Dari MathWorld - Sumber Daya Web Wolfram. http://mathworld.wolfram.com/AztecDiamond.html
sumber
C,
7164 byteCobalah di Ideone
sumber
m==n
: jumlah persegi panjang miring dalamn*n
kotak adalah(4*n*n*n*n-n*n-3*n)/6
. Urutannya adalah 0, 9, 51, 166, 410, 855, 1589, 2716, 4356, 6645 tetapi tidak muncul di OEIS.m>n
Anda perlu menambahkan tambahan(m-n)(n*(4*n*n-1)/3)
(bagian terakhir dari rumus yang diambil dari OEIS A000447). Mengatur ulang dan menambahkan memberi rumus @ betseg.m==n
. Saya kemudian secara manual menghitung jumlah persegi panjang miring dalam persegi panjang kecil dan melihat peningkatan dimensi yang lebih panjang selalu menambahkan jumlah persegi panjang yang sama untuk dimensi yang diberikan lebih pendek. Saya memasukkan kenaikan ke OEIS yang menemukan kecocokan pada A000447.Python,
7368 byteDan sementara versi berikut memiliki bytecount yang lebih tinggi (75), itu adalah latihan yang bagus dalam menemukan tempat untuk digunakan
~
:sumber
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)
def
. Terima kasih! Diperbarui.Cembung,
3736 byteCobalah online!
Menggunakan algoritma betseg yang dimodifikasi dan dioptimalkan untuk bahasa berbasis stack. Penjelasan yang akan datang ketika saya memiliki waktu luang lagi. Saya yakin ini bisa dipersingkat tapi saya tidak akan repot saat ini.
sumber
Batch, 82 byte
sumber