El enésimo número de Motzkin es el número de rutas de (0, 0) a (n, 0) donde cada paso tiene la forma (1, -1), (1, 0) o (1, 1), y la ruta nunca va por debajo de y = 0.
Aquí hay una ilustración de estas rutas para n = 1, 2, 3, 4, desde el enlace anterior:
La secuencia deseada es OEIS A001006 . OEIS tiene algunas otras caracterizaciones de la secuencia.
Se le dará un entero positivo n como entrada. Debe generar el enésimo número de Motzkin.
Aquí están los números de Motzkin del 1 al 10:
1, 2, 4, 9, 21, 51, 127, 323, 835, 2188
Todos los métodos de entrada y salida estándar están permitidos. Se aplican lagunas estándar .
Este es el código de golf. Pocos bytes ganan.
Respuestas:
MATL , 13
14bytesEjemplo:
EDITAR (16 de junio de 2017): ¡puedes probarlo en línea! Tenga en cuenta también que en las versiones modernas del lenguaje (que datan de este desafío) se
i
podría eliminar.Explicación
Bastante sencillo, usando la equivalencia (ver ecuación (10)) con la función hipergeométrica :
De la definición de la función hipergeométrica
Está claro que el orden de los dos primeros argumentos puede intercambiarse, lo que ahorra un byte.
fuente
Retina ,
5958 bytesToma entrada en unario . La entrada 7 (es decir
1111111
) toma bastante tiempo pero aún se completa en menos de un minuto. No iría mucho más lejos que eso.Pruébalo en línea.
Explicación
Una caracterización diferente de los números de Motzkin es el número de cadenas de tres caracteres diferentes, donde dos de ellos están correctamente equilibrados (de ahí la estrecha relación con los números catalanes, que son iguales sin el tercer carácter que es independiente del equilibrio).
Grupos de equilibrio de .NET son bastante buenos en la detección cadenas que coincidan correctamente, así que simplemente generamos todas las cadenas de longitud
N
(usando_
,<
y>
como los tres caracteres) y luego contar cuántos de los que se equilibran correctamente. Por ejemplo,N = 4
las cadenas válidas son:En comparación con la definición en el desafío,
_
corresponde a un(1,0)
paso,<
a(1,1)
y>
para(1,-1)
.En cuanto al código real,
:
se utiliza como separador entre las diferentes cadenas. La segunda expresión regular es solo una forma de golf de la expresión regular .NET estándar para cadenas equilibradas .Algo a tener en cuenta es que solo hay una única
:
inserción entre las cadenas en cada paso, pero la segunda expresión regular coincide con un inicio y un final:
(y dado que las coincidencias no pueden superponerse, esto significa que las cadenas adyacentes generadas a partir de una plantilla en el último paso no pueden coincidir) ) Sin embargo, esto no es un problema, porque a lo sumo uno de esos tres puede coincidir:_
coincidencias, el prefijo sin eso_
ya está equilibrado correctamente, y /<
o>
eliminaría ese equilibrio.>
partidos, la cadena se equilibra con la que>
, por lo que_
o<
sería deshacerse de ese equilibrio.<
nunca se pueden equilibrar.fuente
Python 2, 51 bytes
Utiliza la fórmula de Mathworld
Guarda caracteres al poner el
M[n-1]
término en la suma comok=n-1
, lo que daM[-1]*M[n-1]
,M[-1]=1
como parte de la condición inicial.Editar: Un personaje más corto escribiendo la suma de forma recursiva:
Otros enfoques que resultaron más largos:
fuente
Pyth, 15 bytes
Esto define una función
y
. Pruébelo en línea: demostraciónExplicación:
Dejado
y[n]
ser eln
-th Número Motzkin. Calculoy[n]
con la formulaObserve que el primer vector es más grande que el segundo (excepto al calcular
y[0]
). Cuando este es el caso, Pyth ignora automáticamente el 1 al final del primer vector, de modo que ambos vectores tienen la misma longitud.Esta fórmula es una variación de una de las fórmulas enumeradas en OEIS. Puede ser un poco estúpido. Debido al 1 al final del primer vector (que hace que las longitudes sean desiguales), en realidad no tengo que darle a la recursión un caso base. Y tenía esperanzas de que los dos
+...1
s se puedan jugar de alguna manera. Resulta que no puedo.Puede definir una recursión similar con un producto de puntos de vectores de igual longitud y definir el caso base
y[0] = 1
con el mismo número de bytes.fuente
CJam (20 bytes)
Demostración en línea
Como señaló Mego en los comentarios sobre la pregunta, esto está muy relacionado con los números catalanes: cambie el ay
.5
para1
compensar el índice por uno (o simplemente elimine por.5
completo y deje el índice sin cambios) para obtener números catalanes.La recurrencia utilizada es
de la página de OEIS. La recurrencia correspondiente para los números catalanes aparece como
fuente
En serio, 21 bytes
Toma prestado algún código de la solución de números catalanes de quintopia , específicamente la mejora que hice en los comentarios.
Yo uso la siguiente fórmula:
Como
nCk
es 0 parak > n
, sumo hasta el finaln-1
, ya que todos esos valores serán 0 y, por lo tanto, no afectan la suma.Pruébalo en línea
Explicación:
fuente
C(n, 2*k)
¿Qué hace ahora?C(n,k) = nCk
, o el número de combinaciones dek
elementos de un grupo den
elementos.R, 64 bytes
Utiliza también la fórmula Mathworld de la respuesta python de @ xnor . Gracias a las reglas de precedencia,
2:n-2
es equivalente a0:(n-2)
.Casos de prueba:
fuente
Mathematica,
3130 bytesPor diversión, aquí hay una versión de 37 bytes
y versión de 52 bytes
fuente
Jalea ,
171413 bytesEsto utiliza la relación de recurrencia de la respuesta de @ PeterTaylor . Pruébalo en línea!
Cómo funciona
fuente
Mathematica,
444234 bytesUna versión de 35 bytes:
fuente
Pari / GP ,
383626 bytesPruébalo en línea!
Usando la ecuación (11) de MathWorld :
fuente
);;7 2D$ⁿ$)╡$÷
. No lo publicaré como respuesta porque el idioma es más nuevo que la pregunta.05AB1E ,
1312 bytesPruébalo en línea!
Si bien la mayoría de las respuestas usan una fórmula o relación de recurrencia, este es un enfoque de conteo simple.
Cada posible camino a través de la cuadrícula está representado por la lista de sus coordenadas y. Para n segmentos, hay un total de (n + 1) puntos, pero el primero y el último son necesariamente 0, de modo que deja (n-1) puntos para especificar.
Ahora tenemos una lista de rutas (sin incluir aún el 0 inicial y final). Por construcción, ninguno de ellos baja por debajo de 0. Sin embargo, algunos de ellos tienen pendientes ilegales (por ejemplo, saltan de 0 a 2), por lo que debemos filtrarlos.
Ÿ
es el rango fluctuante incorporado. Si hay algún par de números no adyacentes, completará los números que faltan (por ejemplo, [0, 2] se convierte en [0, 1, 2]). Solo los caminos legales se dejarán sin cambios.Quizás sería una forma más intuitiva de verificar pendientes ilegales
üαà
(afirmar que el máximo de diferencias absolutas por pares es igual a 1). Sin embargo, esto pierde la ruta plana [0, 0, ... 0], que cuesta arreglar un byte extra.Finalmente, tenga en cuenta que el código real se usa
.ø
donde se usa esta explicación0.ø
. En lugar de rodear la ruta con ceros, esto rodea la entrada implícita con dos copias de la ruta. Esto pone el sistema de coordenadas al revés y de adentro hacia afuera, pero por lo demás es equivalente.fuente
Stax , 12 bytes
Ejecutar y depurarlo
No sé cómo hacer una composición tipográfica matemática elegante, pero esto se basa esencialmente en una construcción de programación dinámica
fuente
Rubí, 50
Implementación directa de la relación de recurrencia.
fuente
Brain-Flak , 90 bytes
Pruébalo en línea!
fuente
ES6, 44 bytes
Puerto directo de la solución recursiva de Python de @ xnor. Necesita
n<1?1:
porquen<1||
haríaf(0)
volvertrue
.fuente
Haskell , 55 bytes
Implementación directa de la recursividad.
Pruébalo en línea!
fuente