Como acompanhamento desse desafio , agora queremos contar o número de retângulos na grade com r linhas ec colunas onde existe uma linha cruzando todas as diagonais de um quadrado na grade. Agora, ainda estamos contando os mesmos retângulos de antes, mas desta vez também devemos incluir retângulos inclinados em 45 graus.
Seu objetivo é criar uma função ou programa que, dado o número de linhas r e colunas c, produz o número de retângulos em uma grade diagonal com dimensões ( r , c ).
Como demonstração, é uma animação que itera pelos 37 retângulos formados por uma grade diagonal (2 x 3).
Casos de teste
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
Regras
- Isso é código-golfe, então o código mais curto vence.
- Builtins que resolvem isso não são permitidos.
Respostas:
Ruby, 58 bytes
Esta é uma implementação direta do algoritmo na resposta C de liberação dos núcleos de hélio .
Tenho investigado por que essa fórmula funciona, com sucesso limitado. É fácil confirmar que o número de retângulos na vertical é igual a
(m+1)*m/2 * (n+1)*n/2
, o número de retângulos na diagonal é um pouco mais ilusório.Neil foi confirmada para
m==n
que o número de retângulos inclinados em uman*n
praça é(4*n**4-n*n-3*n)/6
e que quandom>n
você precisa adicionar um adicional(m-n)(n*(4*n*n-1)/3)
(relacionada com OEIS A000447 ), embora isso não explica onde essas duas fórmulas veio. Eu encontrei parte da resposta.Pois
m==n
, a forma dentro da grade é um diamante asteca .O número de rectângulos em um diamante asteca é a soma do número de grandes rectângulos sobrepostos para torná-la (para o quarto de diamante, que se encontra em uma
5x5
grade,2x8
,4x6
,6x4
, e8x2
) menos o número dos rectângulos contado duas vezes (o número de retângulos no diamante asteca anterior ).A fórmula aqui é (TeX a ser adicionado posteriormente):
De acordo com Wolfram Alpha, a forma fechada para
f
é1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)
e a forma fechada paraaztec_rect
é, como Neil descobriu1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)
,.Ainda estou para descobrir por que
(m-n)(n*(4*n*n-1)/3)
funciona, embora eu suspeite que seja porque uma definição de A000447 ébinomial(2*n+1, 3)
. Vou mantê-lo informado.Atualização: Tenho motivos para acreditar que a função do número de retângulos em um diamante asteca estendido
m>n
está relacionada ao número de2k*2(n-k)
retângulos sobrepostos no diamante menosF(m-1,n-1)
. Mais resultados quando eu os tiver.Atualização: Tentei uma rota diferente e acabei com outra fórmula para os diamantes astecas estendidos que são explicáveis principalmente, mas que têm um termo que ainda não entendi. Huzzah! : D
Um rápido resumo dessa última fórmula:
(m-n+1)*(4*n**4-n*n-3*n)/6
é o número de diamantes astecas sobrepostos de tamanhon
na estrutura, comof(n,n) = (4*n**4-n*n-3*n)/6
.f(7,3)
tem 5 diamantes astecas sobrepostos3
, enquantof(3,3)
tem apenas 1 diamante.-f(m-1,n-1)
remove alguns retângulos duplicados do meio dos diamantes sobrepostos.+(m-n)*2
responde por 2 extra2
-by-(2n-1)
retângulos para cada diamante extra.+(m-n)*(n-2)
representa um extran
-by-n
quadrado para cada diamante extra.-(m-n-1)*f(n-1,n-1)
Este é o novo termo intrigante. Aparentemente, eu não contei alguns quadrados extras na minha contagem, mas ainda não descobri onde eles estão no diamante estendido.Nota: quando
m==n
,m-n-1 = -1
significa que este último termo adiciona quadrados à contagem. Eu posso estar perdendo alguma coisa na minha fórmula regular. Divulgação completa, isso só deveria ser um patch para um rascunho anterior dessa fórmula que funcionava. Claramente, ainda preciso me aprofundar no que está acontecendo, e pode ser que minha fórmula tenha alguns bugs. Vou mantê-lo informado.Russell, Gary e Weisstein, Eric W. "Aztec Diamond". De MathWorld - um recurso da Web da Wolfram. http://mathworld.wolfram.com/AztecDiamond.html
fonte
C,
7164 bytesExperimente no Ideone
fonte
m==n
: o número de retângulos inclinados em umn*n
quadrado é(4*n*n*n*n-n*n-3*n)/6
. A sequência é 0, 9, 51, 166, 410, 855, 1589, 2716, 4356, 6645, mas não aparece no OEIS.m>n
você precisa adicionar um adicional(m-n)(n*(4*n*n-1)/3)
(última parte da fórmula extraída do OEIS A000447). Reorganizar e adicionar fornece a fórmula do @ betseg.m==n
. Depois calculei manualmente o número de retângulos inclinados em retângulos pequenos e notei que o aumento da dimensão mais longa sempre adicionava a mesma quantidade de retângulos para uma dada dimensão mais curta. Alimentei os incrementos no OEIS, que encontraram uma correspondência no A000447.Python,
7368 bytesE embora a versão a seguir tenha um número de bytes mais alto (75), foi um bom exercício para encontrar lugares para usar
~
:fonte
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
. Obrigado! Atualizada.Convexo,
3736 bytesExperimente online!
Usa o algoritmo da betseg modificado e otimizado para uma linguagem baseada em pilha. Explicação para vir quando tiver mais tempo livre. Aposto que isso pode ser reduzido, mas não vou incomodar no momento.
fonte
Lote, 82 bytes
fonte