Le nième numéro de Motzkin est le nombre de chemins de (0, 0) à (n, 0) où chaque étape est de la forme (1, -1), (1, 0) ou (1, 1), et le chemin ne descend jamais en dessous de y = 0.
Voici une illustration de ces chemins pour n = 1, 2, 3, 4, à partir du lien ci-dessus:
La séquence souhaitée est OEIS A001006 . OEIS a quelques autres caractérisations de la séquence.
Vous recevrez un entier positif n en entrée. Vous devez sortir le nième numéro Motzkin.
Voici les numéros de Motzkin 1 à 10:
1, 2, 4, 9, 21, 51, 127, 323, 835, 2188
Toutes les méthodes d'entrée et de sortie standard sont autorisées. Des échappatoires standard s'appliquent.
C'est le golf de code. Le moins d'octets gagne.
Réponses:
MATL , 13
14octetsExemple:
EDIT (16 juin 2017): vous pouvez l' essayer en ligne! Notez également que dans les versions modernes de la langue (postérieures à ce défi), le
i
pourrait être supprimé.Explication
Assez simple, en utilisant l'équivalence (voir l'équation (10)) avec la fonction hypergéométrique :
De la définition de la fonction hypergéométrique
il est clair que l'ordre des deux premiers arguments peut être échangé, ce qui économise un octet.
la source
Rétine ,
5958 octetsPrend entrée en unaire . L'entrée 7 (c'est-à-dire
1111111
) prend un certain temps mais se termine toujours en moins d'une minute. Je n'irais pas beaucoup plus loin que ça.Essayez-le en ligne.
Explication
Une caractérisation différente des nombres Motzkin est le nombre de chaînes de trois caractères différents, où deux d'entre eux sont correctement équilibrés (d'où la relation étroite avec les nombres catalans, qui sont les mêmes sans le troisième caractère indépendant de l'équilibrage).
Les groupes d' équilibrage de .NET sont très bonnes à détecter les chaînes correctement adaptées, de sorte que nous générons simplement toutes les chaînes de longueur
N
( à l' aide_
,<
et>
que les trois caractères) et on compte le nombre de ceux -ci sont correctement équilibrés. Par exemple pourN = 4
les chaînes valides sont:Par rapport à la définition du défi,
_
correspond à une(1,0)
étape,<
vers(1,1)
et>
vers(1,-1)
.Quant au code réel, le
:
est utilisé comme séparateur entre les différentes chaînes. La deuxième expression régulière n'est qu'une forme golfique de l'expression régulière .NET standard pour les chaînes équilibrées .Quelque chose à noter est qu'il n'y a qu'un seul
:
inséré entre les chaînes à chaque étape, mais le deuxième regex correspond à une première et à une fin:
(et puisque les correspondances ne peuvent pas se chevaucher, cela signifie que les chaînes adjacentes générées à partir d'un modèle à la dernière étape ne peuvent pas correspondre à la fois ). Cependant, ce n'est pas un problème, car tout au plus l'un de ces trois peut jamais correspondre:_
correspond, le préfixe sans celui-ci_
est déjà correctement équilibré et /<
ou>
annulerait cet équilibre.>
correspondances, la chaîne est équilibrée avec celle-ci>
, alors_
ou<
annulerait cet équilibre.<
ne peuvent jamais être équilibrées.la source
Python 2, 51 octets
Utilise la formule de Mathworld
Enregistre les caractères en mettant le
M[n-1]
terme dans la somme commek=n-1
, ce qui donneM[-1]*M[n-1]
, avecM[-1]=1
comme partie de la condition initiale.Edit: Un caractère plus court écrit la somme récursivement:
D'autres approches qui se sont révélées plus longues:
la source
Pyth, 15 octets
Cela définit une fonction
y
. Essayez-le en ligne: DémonstrationExplication:
Soit
y[n]
len
-ième nombre de Motzkin. Je calculey[n]
avec la formuleNotez que le premier vecteur est plus grand que le second (sauf lors du calcul
y[0]
). Dans ce cas, Pyth ignore automatiquement le 1 à la fin du premier vecteur, de sorte que les deux vecteurs sont de longueur égale.Cette formule est une variante de l'une des formules répertoriées sur OEIS. C'est peut-être un peu stupide. En raison du 1 à la fin du premier vecteur (qui rend les longueurs inégales), je n'ai pas vraiment à donner à la récursivité un cas de base. Et j'avais l'espoir que les deux
+...1
puissent être joués d'une manière ou d'une autre. Il s'avère que je ne peux pas.Vous pouvez définir une récursivité similaire avec un produit scalaire de vecteurs de longueur égale et définir le cas de base
y[0] = 1
avec le même nombre d'octets.la source
CJam (20 octets)
Démo en ligne
Comme Mego l'a noté dans les commentaires sur la question, cela est très étroitement lié aux nombres catalans: changez le
.5
en1
et compensez l'index par un (ou supprimez simplement.5
entièrement et laissez l'index inchangé) pour obtenir des nombres catalans.La récurrence utilisée est
à partir de la page OEIS. La récurrence correspondante pour les nombres catalans est répertoriée comme
la source
Sérieusement, 21 octets
Emprunte du code de la solution de numéros catalans de Quintopia , en particulier l'amélioration que j'ai apportée dans les commentaires.
J'utilise la formule suivante:
Puisque
nCk
est 0 pourk > n
, je fais la somme jusqu'àn-1
, car ces valeurs seront toutes égales à 0 et n'affecteront donc pas la somme.Essayez-le en ligne
Explication:
la source
C(n, 2*k)
fait quoi maintenant?C(n,k) = nCk
, ou le nombre de combinaisons d'k
éléments d'un pool d'n
éléments.R, 64 octets
Utilise également la formule Mathworld de la réponse python @ xnor . Merci aux règles de priorité,
2:n-2
est équivalent à0:(n-2)
.Cas de test:
la source
Mathematica,
3130 octetsPour le plaisir, voici une version de 37 octets
et version 52 octets
la source
Gelée ,
171413 octetsCela utilise la relation de récurrence de la réponse de @ PeterTaylor . Essayez-le en ligne!
Comment ça marche
la source
Mathematica,
444234 octetsUne version 35 octets:
la source
Pari / GP ,
383626 octetsEssayez-le en ligne!
En utilisant l'équation (11) de MathWorld :
où est un coefficient trinomial . Par définition, est le coefficient de dans l'expansion de . ( n(nk)2 xn+k(1+x+x2)n(nk)2 xn+k (1+x+x2)n
la source
);;7 2D$ⁿ$)╡$÷
. Je ne le posterai pas comme réponse car la langue est plus récente que la question.05AB1E ,
1312 octetsEssayez-le en ligne!
Bien que la plupart des réponses utilisent une formule ou une relation de récurrence, il s'agit d'une approche de comptage simple.
Chaque chemin possible à travers la grille est représenté par la liste de ses coordonnées y. Pour n segments, il y a un total de (n + 1) points, mais le premier et le dernier sont nécessairement 0, ce qui laisse (n-1) points à spécifier.
Nous avons maintenant une liste de chemins (n'incluant pas encore le 0 initial et le 0 final). Par construction, aucun d'entre eux ne descend jamais en dessous de 0. Cependant, certains d'entre eux ont des pentes illégales (par exemple sauter de 0 à 2), nous devons donc les filtrer.
Ÿ
est la plage de fluctuation intégrée. S'il y a une paire de nombres non adjacents, elle remplira les nombres manquants (par exemple [0, 2] devient [0, 1, 2]). Seuls les chemins légaux resteront inchangés.Une façon peut-être plus intuitive de vérifier les pentes illégales serait
üαà
(affirmer que le maximum de différences absolues par paire est égal à 1). Cependant, cela manque le chemin plat [0, 0, ... 0], qui coûte un octet supplémentaire à corriger.Enfin, notez que le code réel utilise
.ø
où cette explication utilise0.ø
. Au lieu d'entourer le chemin avec 0, cela entoure l'entrée implicite avec deux copies du chemin. Cela met le système de coordonnées à l'envers et à l'envers, mais est par ailleurs équivalent.la source
Stax , 12 octets
Exécuter et déboguer
Je ne sais pas comment faire une composition mathématique sophistiquée, mais cela repose essentiellement sur une construction de programmation dynamique
la source
Rubis, 50
mise en œuvre simple de la relation de récurrence.
la source
Brain-Flak , 90 octets
Essayez-le en ligne!
Calcule , où est un coefficient trinomial . Je n'ai pu trouver cette formule nulle part, donc je ne peux pas la référencer, mais elle peut être prouvée de la même manière que la formule analogue .(n0)2−(n2)2 (nk)2 Cn=(2nCn=(2nn)−(2nn+1)
la source
ES6, 44 octets
Port simple de la solution récursive Python @ xnor. Besoin
n<1?1:
carn<1||
feraitf(0)
retourtrue
.la source
Haskell , 55 octets
Implémentation simple de la récursivité.
Essayez-le en ligne!
la source