Objetivo
O objetivo desse desafio é produzir uma função n
que calcule o número de maneiras de particionar a n X 1
grade em triângulos, onde todos os vértices dos triângulos estão em pontos da grade.
Exemplo
Por exemplo, existem 14 maneiras de particionar a grade 2 x 1, portanto, f(2) = 14
através das partições a seguir, nas
quais as partições possuem 2, 2, 2, 2, 4 e 2 orientações distintas, respectivamente.
Pontuação
Isso é código-golfe , então o código mais curto vence.
code-golf
geometry
combinatorics
grid
Peter Kagey
fonte
fonte
Respostas:
05AB1E , 13 bytes
Porto da resposta Jelly do @Bubbler .
Muito lento devido às permutações embutidas.
Experimente online ou verifique as quatro primeiras entradas .
Explicação:
fonte
Haskell ,
60 55 5452 bytesDepois de desenhar e programar muitos exemplos, ocorreu-me que isso é o mesmo que o problema das gralhas:
Basicamente, você tem a linha superior e inferior da grade1×n . Agora você deve preencher a linha não horizontal. Cada triângulo deve ter duas linhas não horizontais. Se um dos lados faz parte do topo ou da linha de fundo corresponde à direção e ao comprimento que você seguiria no problema das gralhas. Este é o OEIS A051708 . Como ilustração dessa correspondência, considere os seguintes exemplos. Aqui, a linha superior corresponde aos movimentos para cima, enquanto a linha inferior corresponde aos movimentos para a direita.
Obrigado @PeterTaylor por -6 bytes e @PostLeftGarfHunter por -2 bytes!
Experimente online!
fonte
A051708(n+1)
. Então, eu postei o primeiro correta resposta :-PHaskell , 42 bytes
Experimente online!
Uma implementação bastante direta que se repete mais de 2 variáveis.
Veja como podemos obter esta solução. Comece com o código implementando uma fórmula recursiva direta:
54 bytes
Experimente online!
Usando a interpretação de movimento da torre de flawr ,
a%b
é o número de caminhos que levam a torre de(a,b)
para(0,0)
, usando apenas os movimentos para diminuir uma coordenada. O primeiro movimento diminuia
ou diminuib
, mantendo o outro igual, daí a fórmula recursiva.49 bytes
Experimente online!
Podemos evitar a repetição
map(a%)[0..b-1]++map(b%)[0..a-1]
observando que as duas metades são iguaisa
eb
trocadas. A chamada auxiliara?b
conta os caminhos em que o primeiro movimento diminuia
e, portanto,b?a
conta aqueles em que o primeiro movimento diminuib
. Em geral, são diferentes e adicionam aa%b
.O somatório em
a?b
também pode ser escrito como uma compreensão da listaa?b=sum[a%i|i<-[0..b-1]]
.42 bytes
Experimente online!
Finalmente, nos livramos
%
e escrevemos a recursão em termos de?
substituindoa%i
pora?i+i?a
na chamada recursiva.O novo caso base faz com que isso
?
dê a saídas o dobro do da?
versão de 49 bytes, já que com0?0=1
nós teríamos0%0=0?0+0?0=2
. Isso permite definirf n=n?n
sem a metade que precisaríamos fazer.fonte
a%b
conta o número de partições usando os nós0,1,...,a
na linha superior e os acenos0,1,..,b
de cabeça na linha inferior. O operadora?b
conta o número de maneiras pelas quais você pode adicionar uma nova linha a partir do nó superior,a
se o nó inferiorb
já estiver em uso. (Você pode se conectara
a todos os nós[0,1,...,b-1]
, mas então você tem que recurse para cada um deles.)?
de 42 bytes que eu não conheço, e o que é particularmente curioso é que não é simétrico.map...
por uma compreensão da lista; na segunda, apenas inserimos a definição de%
:a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a
a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a
a?b=sum[a?i+i?a|i<-[0..b-1]]
CJam (24 bytes)
Demonstração online
Isso usa a abordagem de Bubbler de somar sobre permutações de
n
0s en
1s.Dissecação
Abordagem alternativa (28 bytes)
Demonstração online
Dissecação
Todos os triângulos têm uma aresta horizontal e duas arestas que vinculam as linhas horizontais. Rotule as arestas não horizontais por uma tupla de suas duas cordas x e classifique lexicograficamente. Então a primeira aresta é
(0,0)
, a última aresta é(n,n)
e duas arestas consecutivas diferem precisamente em uma das duas posições. Isso cria uma recursão simples, que eu implementei usando o operador de recursão memorizadoj
:Nota
Esta não é a primeira vez que desejo
fj
receber suporte no CJam. Aqui, a pontuação também seria reduzida para 24 bytes. Talvez eu devesse tentar escrever um patch ...fonte
Geléia ,
1514 bytesExperimente online!
-1 byte com base no comentário de Peter Taylor.
Usa a ilustração de flawr diretamente, em vez da fórmula resultante.
Como funciona
Pegue todas as rotas possíveis em uma grade quadrada. O número de maneiras de mover L unidades em uma direção como uma torre é
2**(L-1)
. Aplique isso a todas as rotas e some o número de maneiras de percorrer cada rota.fonte
Carvão ,
4431 bytesriscado 44 ainda é regular 44
Experimente online! Explicação: Funciona calculando o número de maneiras de particionar um trapézio de comprimentos laterais opostos
m,n
em triângulos, todos eles com desvios inteiros. Este é simplesmente um caso geral do retângulo de tamanhon
na pergunta. O número de partições é dado recursivamente como a soma dos números de partições para todos os ladosm,0..n-1
en,0..m-1
. Isso é equivalente ao problema generalizado das torres, OEIS A035002 . O código simplesmente calcula o número de partições trabalhando0,0
atén,n
usar os valores calculados anteriormente.Faça um loop sobre as linhas
0..n
.Comece com uma linha vazia.
Faça um loop sobre as colunas na linha
0..n
.Leve a linha até o momento e os valores nas linhas anteriores na coluna atual e adicione a soma total à linha atual. No entanto, se não houver valores, substitua
1
no lugar da soma.Adicione a linha finalizada à lista de linhas até agora.
Emita o valor final calculado.
fonte
JavaScript (ES6),
45 4442 bytesUsa a fórmula recursiva encontrada por Peter Taylor e flawr .
Experimente online!
fonte
Pari / GP , 43 bytes
De acordo com o OEIS , a função geradora dessa sequência é
Experimente online!
fonte
Python 3 , 51 bytes
Experimente online!
Resposta do porto de flawr
fonte