Objetivo
El objetivo de este desafío es producir una función n
que calcule el número de formas de dividir la n X 1
cuadrícula en triángulos donde todos los vértices de los triángulos se encuentran en los puntos de la cuadrícula.
Ejemplo
Por ejemplo, hay 14 formas de particionar la cuadrícula de 2 x 1, por lo que a f(2) = 14
través de las siguientes particiones,
las particiones tienen 2, 2, 2, 2, 4 y 2 orientaciones distintas, respectivamente.
Puntuación
Este es el código de golf , por lo que gana el código más corto.
code-golf
geometry
combinatorics
grid
Peter Kagey
fuente
fuente
Respuestas:
05AB1E , 13 bytes
Puerto de la respuesta Jelly de @Bubbler .
Muy lento debido a las permutaciones incorporadas.
Pruébelo en línea o verifique las primeras cuatro entradas .
Explicación:
fuente
Haskell ,
60 55 5452 bytesDespués de dibujar y programar muchos ejemplos, se me ocurrió que esto es lo mismo que el problema de las torres:
Básicamente tiene la línea superior e inferior de la cuadrícula1 × n . Ahora debe completar la línea no horizontal. Cada triángulo debe tener dos líneas no horizontales. Si uno de sus lados es parte de la línea superior o inferior corresponde a la dirección y la longitud que tomaría en el problema de las torres. Este es OEIS A051708 . Como ilustración de esta correspondencia, considere los siguientes ejemplos. Aquí la línea superior corresponde a los movimientos hacia arriba, mientras que la línea inferior corresponde a los movimientos hacia la derecha.
¡Gracias @PeterTaylor por -6 bytes y @PostLeftGarfHunter por -2 bytes!
Pruébalo en línea!
fuente
A051708(n+1)
. Así que publiqué la primera respuesta correcta :-PHaskell , 42 bytes
Pruébalo en línea!
Una implementación bastante directa que recurre a más de 2 variables.
Así es como podemos obtener esta solución. Comience con el código que implementa una fórmula recursiva directa:
54 bytes
Pruébalo en línea!
Usando la interpretación de movimiento de torre de flawr ,
a%b
es el número de caminos que llevan la torre de(a,b)
a(0,0)
, usando solo movimientos para disminuir una coordenada. El primer movimiento disminuyea
o disminuyeb
, manteniendo el otro igual, de ahí la fórmula recursiva.49 bytes
Pruébalo en línea!
Podemos evitar la repetición
map(a%)[0..b-1]++map(b%)[0..a-1]
al notar que las dos mitades son igualesa
eb
intercambiadas. La llamada auxiliara?b
cuenta las rutas donde disminuye el primer movimientoa
, y asíb?a
cuenta aquellas donde disminuye el primer movimientob
. En general, estos son diferentes, y se suman aa%b
.La suma en
a?b
también se puede escribir como una lista de comprensióna?b=sum[a%i|i<-[0..b-1]]
.42 bytes
Pruébalo en línea!
Finalmente, nos deshacemos
%
y simplemente escribimos la recursión en términos de?
reemplazandoa%i
cona?i+i?a
en la llamada recursiva.El nuevo caso base hace que esto
?
dé el doble de salidas que?
en la versión de 49 bytes, ya que con0?0=1
, tendríamos0%0=0?0+0?0=2
. Esto permite definirf n=n?n
sin la reducción a la mitad que otros necesitaríamos hacer.fuente
a%b
cuenta el número de particiones usando los nodos0,1,...,a
en la línea superior y los guiños0,1,..,b
en la línea inferior. El operadora?b
cuenta la cantidad de formas en que puede agregar una nueva línea desde el nodo superiora
si el nodo inferiorb
ya está en uso. (Puede conectarsea
a todos los nodos[0,1,...,b-1]
, pero luego tiene que recurrir para cada uno de ellos.)?
de 42 bytes que no tengo, y lo que es particularmente curioso es que no es simétrico.map...
con una comprensión de la lista, en el segundo paso simplemente conectamos la definición 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)
Demostración en línea
Esto usa el enfoque de Bubbler de Bubbler de sumar sobre permutaciones de
n
0s yn
1s.Disección
Enfoque alternativo (28 bytes)
Demostración en línea
Disección
Todos los triángulos tienen un borde horizontal y dos bordes que unen las líneas horizontales. Etiquete los bordes no horizontales con una tupla de sus dos coordenadas x y ordene lexicográficamente. Entonces, el primer borde es
(0,0)
, el último es(n,n)
, y dos bordes consecutivos difieren exactamente en una de las dos posiciones. Esto lo convierte en una recursión simple, que he implementado utilizando el operador de recursión memorizadoj
:Nota
Esta no es la primera vez que quiero
fj
recibir soporte en CJam. Aquí también reduciría la puntuación a 24 bytes. Quizás debería intentar escribir un parche ...fuente
Jalea ,
1514 bytesPruébalo en línea!
-1 byte basado en el comentario de Peter Taylor.
Utiliza la ilustración de flawr directamente, en lugar de la fórmula resultante.
Cómo funciona
Tome todas las rutas posibles en una cuadrícula cuadrada. El número de formas de mover unidades L en una dirección como torre es
2**(L-1)
. Aplique esto a cada ruta y sume la cantidad de formas de atravesar cada ruta.fuente
Carbón ,
4431 bytestachado 44 sigue siendo regular 44
Pruébalo en línea! Explicación: funciona calculando el número de formas de dividir un trapecio de longitudes de lados opuestos
m,n
en triángulos que se encuentran en desplazamientos enteros. Este es simplemente un caso general del rectángulo de tamañon
en la pregunta. El número de particiones se da de forma recursiva como las sumas de los números de particiones para todos los ladosm,0..n-1
yn,0..m-1
. Esto es equivalente al problema generalizado de las torres, OEIS A035002 . El código simplemente calcula el número de particiones que funcionan desde0,0
hasta eln,n
uso de los valores calculados previamente a medida que avanza.Pase sobre las filas
0..n
.Comience con una fila vacía.
Pase sobre las columnas de la fila
0..n
.Lleve la fila hasta el momento y los valores en las filas anteriores en la columna actual, y agregue la suma total a la fila actual. Sin embargo, si no hay ningún valor, sustitúyalo
1
en lugar de la suma.Agregue la fila terminada a la lista de filas hasta ahora.
Salida del valor final calculado.
fuente
JavaScript (ES6),
45 4442 bytesUtiliza la fórmula recursiva encontrada por Peter Taylor y flawr .
Pruébalo en línea!
fuente
Pari / GP , 43 bytes
Según OEIS , la función generadora de esta secuencia es
Pruébalo en línea!
fuente
Python 3 , 51 bytes
Pruébalo en línea!
Respuesta del puerto de flawr
fuente