Chiffres catalans

36

Les nombres catalans ( OEIS ) sont une suite de nombres naturels apparaissant souvent en combinatoire.

Le nième numéro catalan est le nombre de mots Dyck (chaînes équilibrées de parenthèses ou de crochets tels que [[][]]; formellement défini comme une chaîne utilisant deux caractères a et b tels que toute sous-chaîne commençant à partir du début ait le nombre de caractères supérieur ou égal à nombre b, et la chaîne entière a le même nombre de caractères a et b) de longueur 2n. Le nième numéro catalan (pour n> = 0) est aussi explicitement défini comme:

À partir de n = 0, les 20 premiers chiffres en catalan sont:

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190...

Défi

Ecrivez un programme complet ou une fonction prenant un entier non négatif n via STDIN ou une alternative acceptable, et générant le nième numéro de catalan. Votre programme doit fonctionner au minimum pour les entrées 0-19.

I / O

Contribution

Votre programme doit recevoir les entrées de STDIN, des arguments de fonction ou l’une des alternatives acceptables selon cette méta-publication. Vous pouvez lire le nombre saisi sous forme de représentation décimale standard, de représentation unaire ou d'octets.

  • Si (et seulement si) votre langue ne peut pas prendre en charge l'entrée de STDIN ou toute autre alternative acceptable, elle peut prendre celle d'une variable à code fixe ou d'un équivalent approprié dans le programme.

Sortie

Votre programme doit sortir le nième numéro catalan dans STDOUT, le résultat de la fonction ou l’une des alternatives acceptables selon cette méta publication. Vous pouvez afficher le nombre catalan dans sa représentation décimale standard, une représentation unaire ou en octets.

La sortie doit comprendre le numéro catalan approprié, suivi facultativement par une ou plusieurs nouvelles lignes. Aucune autre sortie ne peut être générée, à l'exception de la sortie constante de l'interpréteur de votre langue qui ne peut pas être supprimée (message d'accueil, codes de couleur ANSI ou indentation, par exemple).


Il ne s'agit pas de trouver la langue la plus courte. Il s’agit de trouver le programme le plus court dans toutes les langues. Par conséquent, je n'accepterai pas de réponse.

Dans ce défi, les langues plus récentes que le défi sont acceptables tant qu'elles ont une mise en œuvre. Il est permis (et même encouragé) d’écrire cet interprète vous-même pour une langue non encore implémentée. En dehors de cela, toutes les règles standard du doivent être respectées. Les soumissions dans la plupart des langues seront notées en octets selon un codage préexistant approprié (généralement UTF-8). Notez également que les fonctions intégrées permettant de calculer le nième nombre catalan sont autorisées.

Catalogue

L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) sous forme de liste des solutions les plus courtes par langue et b) sous forme de classement global.

Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:

## Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:

## Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de langue un lien qui apparaîtra ensuite dans l'extrait de code:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

un spaghetto
la source
Pouvons-nous imprimer / retourner un float plutôt qu'un entier?
Alex A.
@Alexa. Ceci est acceptable
un spaghetto
Y aura-t-il une étiquette oeis ?
Vi.
1
@Vi. Il y a quelque temps, il y a eu une méta discussion à ce sujet et nous avons convenu que l' oeis n'était pas nécessaire
un spaghetto
@Vi. Voici le meta post: meta.codegolf.stackexchange.com/a/5546/8478 . Comme pour certains raisonnements, vous pouvez trouver des défis de style OEIS de manière assez fiable avec une séquence et un des nombres ou une théorie des nombres . Que la séquence donnée se trouve ou non dans OEIS est totalement hors de propos.
Martin Ender

Réponses:

26

C, 78 52 39 34 33 octets

Encore plus de magie C (merci xsot):

c(n){return!n?:(4+6./~n)*c(n-1);}

?: est une extension GNU .


Cette fois en augmentant la récurrence ci-dessous (merci xnor et Thomas Kwa):

yet another recursion

c(n){return n?(4+6./~n)*c(n-1):1;}

-(n+1)est remplacé par ~n, ce qui est équivalent en complément à deux et enregistre 4 octets.


Encore une fois en fonction, mais en exploitant cette fois la récurrence suivante:

recur

c(n){return n?2.*(2*n++-1)/n*c(n-2):1;}

c(n)entre une récursion infinie pour le négatif n, bien que ce ne soit pas pertinent pour ce défi.


Comme appeler une fonction semble une alternative acceptable à la console d'E / S:

c(n){double c=1,k=2;while(k<=n)c*=1+n/k++;return c;}

c(n)prend un intet retourne un int.


Entrée originale:

main(n){scanf("%d",&n);double c=1,k=2;while(k<=n)c*=1+n/k++;printf("%.0f",c);}

Au lieu de calculer directement la définition, la formule est réécrite comme suit:

rewrite

La formule suppose n >= 2, mais le code représente n = 0et n = 1aussi.

Dans le désordre C ci-dessus, net kont le même rôle que dans la formule, tout en caccumule le produit. Tous les calculs sont effectués en virgule flottante double, ce qui est presque toujours une mauvaise idée, mais dans ce cas, les résultats sont corrects jusqu’à n = 19 au moins, c’est donc correct.

float aurait économisé 1 octet, malheureusement ce n'est pas assez précis.

Stefano Sanfilippo
la source
Je ne peux pas tester cela maintenant, mais je pense que vous pouvez le raccourcir davantage:c(n){return!n?:(4+6./~n)*c(n-1);}
xsot
Merci @ xsot, je ne savais pas ?:! Apparemment, c’est une extension GNU C mais je pense qu’elle est toujours qualifiée.
Stefano Sanfilippo
23

Gelée , 4 octets

Ḥc÷‘

Essayez-le en ligne!

Comment ça marche

Ḥc÷‘    Left argument: z

Ḥ       Compute 2z.
 c      Hook; apply combinations to 2z and z.
  ÷‘    Divide the result by z+1.
Dennis
la source
1
Qu'est-ce que "crochet" signifie? Comment cget 2zet zcomme arguments?
xnor
@xnor Un crochet signifie des fonctions évaluées comme f (x, g (x)). Lorsqu'il existe une fonction dyadique suivie d'une autre fonction dyadique, l'analyseur évalue la première comme un crochet.
lirtosiast
5
@ Dennis Est-ce vraiment 4 octets? Avec les caractères non-ASCII, mothereff.in/byte-counter dit 9 octets
Luis Mendo
@LuisMendo c'est probablement un encodage différent
undergroundmonorail
3
@LuisMendo Jelly utilise son propre codage par défaut personnalisé, chaque caractère étant un octet unique. Avec UTF-8, le code source fait en effet 9 octets de long.
Dennis
11

CJam, 12 octets

ri_2,*e!,\)/

Essayez-le en ligne.

Au-delà de l'entrée 11, vous devez indiquer à votre machine virtuelle Java d'utiliser davantage de mémoire. Et je ne recommanderais pas vraiment d'aller au-delà de 11. En théorie, cela fonctionne pour tout N, car CJam utilise des entiers à précision arbitraire.

Explication

CJam n’a pas de fonction intégrée pour les coefficients binomiaux, et les calculer à partir de trois factorielles prend beaucoup d’octets ... nous devrons donc faire quelque chose de mieux que cela. :)

ri  e# Read input and convert it to integer N.
_   e# Duplicate.
2,  e# Push [0 1].
*   e# Repeat this N times, giving [0 1 0 1 ... 0 1] with N zeros and N ones.
e!  e# Compute the _distinct_ permutations of this array.
,   e# Get the number of permutations - the binomial. There happen to be 2n-over-n of
    e# of them. (Since 2n-over-n is the number of ways to choose n elements out of 2n, and
    e# and here we're choosing n positions in a 2n-element array to place the zeros in.)
\   e# Swap with N.
)/  e# Increment and divide the binomial coefficient by N+1.
Martin Ender
la source
C'est vraiment cool. +1
un spaghetto
C'est malin. Je l'ai essayé avec le calcul des factorielles. Cela ne prend que deux des trois habituels puisque deux d’entre eux sont identiques. Il utilisait encore 17 octets ( ri_2*m!1$m!_*/\)/) dans mon implémentation. La seule bonne chose est que c'est beaucoup plus rapide. :)
Reto Koradi
11

Mathematica, 16 à 13 octets

CatalanNumber

Built-ins, les gars amirite: /

Version non intégrée (21 octets):

Binomial[2#,#]/(#+1)&

Une version sans binôme (25 octets):

Product[(#+k)/k,{k,2,#}]&
un spaghetto
la source
10

TI-BASIC, 11 octets

(2Ans) nCr Ans/(Ans+1

Curieusement, nCr a une priorité plus élevée que la multiplication.

lirtosiast
la source
10

Python 3, 33 octets

f=lambda n:0**n or(4+6/~n)*f(n-1)

Utilise la récurrence

f(0) = 1
f(n) = (4-6/(n+1)) * f(n-1)

Le cas de base de 0 est traité comme 0**n or, ce qui stoppe comme 1lorsque n==0et évaluera autrement l'expression récursive de droite. L'opérateur au niveau du bit ~n==-n-1raccourcit le dénominateur et économise des parens.

Python 3 est utilisé pour sa division float. Python 2 pourrait faire la même chose avec un octet supplémentaire à écrire 6..

Xnor
la source
Pourquoi pas n<1plutôt que 0**n?
Feersum
@feersum Il retourne Truepour n==0plutôt que 1. Bien sûr, True == 1mais True is not 1et cela imprime différemment. Je m'attendrais à ce que cela ne soit pas autorisé. Savez-vous si nous avons une décision à ce sujet?
xnor
Je crois que ça va. isinstance(True, int) is Trueaprès tout.
Feersum
2
Je pense que c'est encore incertain dans le cas général et plus encore ici, où le défi spécifie la sortie en tant que nombre ou sa représentation. Mais jusqu'à @quartata
xnor
7

J, 8 octets

>:%~]!+:

C'est un train monadique; il utilise la formule (2x nCr x) / (x + 1). Essayez ici .

lirtosiast
la source
7

pl, 4 octets

☼ç▲÷

Essayez-le en ligne.

Explication

En pl, les fonctions retirent leurs arguments de la pile et repoussent le résultat dans la pile. Normalement, lorsqu'il n'y a pas assez d'arguments sur la pile, la fonction échoue simplement en silence. Cependant, quelque chose de spécial se produit lorsque le nombre d'arguments sur la pile est différent de l'arité de la fonction - la variable d'entrée _est ajoutée à la liste des arguments:

☼ç▲÷

☼      double: takes _ as the argument since there is nothing on the stack
 ç     combinations: since there is only one item on the stack (and arity is 2), it adds _ to the argument list (combinations(2_,_))
  ▲    increment last used var (_)
   ÷   divide: adds _ to the argument list again

En effet, c'est le pseudocode:

divide(combinations(double(_),_),_+1);
un spaghetto
la source
6

Sesos , 94 86 68 octets

8 octets en changeant le factorial-er de la version 1 à la version 2.

18 octets en calculant n!(n+1)!en une étape. Largement inspiré par algorithme de test de primalité Dennis .

Hexdump:

0000000: 16f8de a59f17 a0ebba 7f4cd3 e05f3f cf0fd0 a0ebde  ..........L.._?......
0000015: b1c1bb 76fe18 8cc1bb 76fe1c e0fbda 390fda bde3d8  ...v.....v.....9.....
000002a: 000fbe af9d1b b47bc7 cfc11c b47bc7 cff1fa e07bda  .......{.....{.....{.
000003f: 39e83e cf07                                       9.>..

Essayez-le en ligne!

Utilise la formule a(n) = (2n)! / (n!(n+1)!) .

  • Le factorial-er: version 1 (en place, mémoire constante), version 2 (en place, mémoire linéaire)
  • Le multiplicateur: ici (en place, mémoire constante)
  • Le diviseur: ici (ne s'arrête pas sinon divisible)

Assembleur

set numin
set numout
get
jmp,sub 1,fwd 1,add 1,fwd 2,add 2,rwd 3,jnz
fwd 1,add 1
jmp
  jmp,sub 1,rwd 1,add 1,rwd 1,add 1,rwd 1,add 1,fwd 3,jnz
  rwd 1,sub 1,rwd 1,sub 1,rwd 1
  jmp,sub 1,fwd 3,add 1,rwd 3,jnz
  fwd 1
jnz
fwd 3
jmp
  jmp
    sub 1,rwd 1
    jmp,sub 1,rwd 1,add 1,rwd 1,add 1,fwd 2,jnz
    rwd 2
    jmp,sub 1,fwd 2,add 1,rwd 2,jnz
    fwd 3
  jnz
  rwd 1
  jmp,sub 1,jnz
  rwd 1
  jmp,sub 1,fwd 2,add 1,rwd 2,jnz
  fwd 3
jnz 
fwd 1
jmp
  jmp,sub 1,fwd 1,add 1,fwd 1,add 1,rwd 2,jnz
  fwd 1,sub 1,fwd 1
  jmp,sub 1,rwd 2,add 1,fwd 2,jnz
  rwd 1
jnz
rwd 2
jmp
  jmp
    sub 1,fwd 1
    jmp,sub 1,fwd 1,add 1,fwd 1,add 1,rwd 2,jnz
    fwd 2
    jmp,sub 1,rwd 2,add 1,fwd 2,jnz
    rwd 3
  jnz
  fwd 1
  jmp,sub 1,jnz
  fwd 1
  jmp,sub 1,rwd 2,add 1,fwd 2,jnz
  rwd 3
jnz 
fwd 1
jmp
  fwd 1,add 1,rwd 3
  jmp,sub 1,fwd 1,add 1,fwd 1,sub 1,rwd 2,jnz
  fwd 1
  jmp,sub 1,rwd 1,add 1,fwd 1,jnz
  fwd 1
jnz
fwd 1
put

Équivalent Brainfuck

Ce script Retina est utilisé pour générer l’équivalent brainfuck. Notez qu'il accepte uniquement un chiffre en tant qu'argument de commande et ne vérifie pas si une commande est dans les commentaires.

[->+>>++<<<]>+
[[-<+<+<+>>>]<-<-<[->>>+<<<]>]>>>
[[-<[-<+<+>>]<<[->>+<<]>>>]<[-]<[->>+<<]>>>]>
[[->+>+<<]>->[-<<+>>]<]<<
[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>
[>+<<<[->+>-<<]>[-<+>]>]>
Fuite Nun
la source
5

Pyth, 8

/.cyQQhQ

Essayez-le en ligne ou lancez le suite de tests

Explication

/.cyQQhQ   ## implicit: Q = eval(input())
/     hQ   ## integer division by (Q + 1)
 .c        ## nCr
   yQ      ## use Q * 2 as n
     Q     ## use Q as r
FryAmTheEggman
la source
5

Sérieusement, 9 octets

,;;u)τ╣E\

Décharge Hex:

2c3b3b7529e7b9455c

Essayez-le en ligne

Explication:

,                   Read in evaluated input n
 ;;                 Duplicate it twice
   u)               Increment n and rotate it to bottom of stack
     τ╣             Double n, then push 2n-th row of Pascal's triangle
       E            Look-up nth element of the row, and so push 2nCn
        \           Divide it by the n+1 below it.
quintopie
la source
Vous pouvez sauvegarder un octet en exploitant le fait que les rangées du triangle de Pascal sont symétriques, de sorte que la médiane de la 2nrangée est C(2n,n). Donc: ,;u@τ╣║/pour 8 octets.
Mego
Quelle? 2nCn n'est-il pas le maximum de la 2ème rangée?
Quintopia
Oui, et c'est aussi la médiane. Donc, les deux et Mfonctionneraient.
Mego
@ Mego Je m'inquiète de votre mise en œuvre de la médiane si quelque chose peut être à la fois la médiane et le maximum dans le cas où la liste n'est pas identique. Si vous voulez dire "au milieu de la liste", choisissez un autre nom ...
quintopia
Oui, c'est le milieu de la liste. Pour les listes triées, il s'agit de la médiane statistique typique, mais pour les listes non triées, il s'agit simplement du milieu (ou de la moyenne de 2 éléments du milieu)
Mego
4

JavaScript (ES6), 24 octets

Basé sur la réponse Python .

c=x=>x?(4+6/~x)*c(x-1):1

Comment ça marche

c=x=>x?(4+6/~x)*c(x-1):1
c=x=>                     // Define a function c that takes a parameter x and returns:
     x?               :1  //  If x == 0, 1.
       (4+6/~x)           //  Otherwise, (4 + (6 / (-x - 1)))
               *c(x-1)    //  times the previous item in the sequence.

Je pense que c'est le plus court possible, mais les suggestions sont les bienvenues!

ETHproductions
la source
4

Julia, 23 octets

n->binomial(2n,n)/(n+1)

C'est une fonction anonyme qui accepte un entier et renvoie un float. Il utilise la formule binomiale de base. Pour l'appeler, donnez-lui un nom, par exemple f=n->....

Alex A.
la source
4

Matlab, 35 à 25 octets

@(n)nchoosek(2*n,n)/(n+1)

Octave, 23 octets

@(n)nchoosek(2*n,n++)/n
costrom
la source
2
Vous pouvez utiliser @(n)au lieu de la fonction, les fonctions anonymes sont ok.
FryAmTheEggman
J'ai déjà vu plusieurs réponses à ce sujet précédemment, où des variables d'espace de travail étaient consultées (impliquant qu'elles avaient déjà été définies par l'utilisateur ailleurs). Les scripts dans MATLAB / Octave peuvent également apparaître sous forme de simples extraits. Je l'ai transformé en fonction pour le moment ...
costrom
1
Vous pouvez supprimer 2 octets supplémentaires en post-incrémentation n:@(n)nchoosek(2*n,n++)/n
Beaker
@beaker merci pour le tuyau! ça ne marche que dans Octave, pas Matlab, donc je l'ai séparé
costrom
@ costrom C'est intéressant. Je suppose que .../++nça ne marche pas non plus. : /
gobelet
4

, 3 caractères / 6 octets

Мƅï

Try it here (Firefox only).

Construit en ftw! Je suis donc ravi d'avoir implémenté math.js dès le début.

Solution bonus, 12 caractères / 19 octets

Мơ 2*ï,ï)/⧺ï

Try it here (Firefox only).

Oui! 19ème octet!

Evalue en pseudo-ES6 comme:

nchoosek(2*input,input)/(input+1)
Maman Fun Roll
la source
3

Haskell, 27 octets

g 0=1
g n=(4-6/(n+1))*g(n-1)

Une formule récursive. Il doit y avoir un moyen d'économiser sur les parens ...

Prendre directement le produit a duré 2 octets de plus:

g n=product[4-6/i|i<-[2..n+1]]
Xnor
la source
Où votre code est-il lu à partir de stdin ou écrit sur stdout?
user2845840
2
@ user2845840 Les fonctions sont l'une des alternatives acceptables liées à la spéc.
xnor
g(n-1)=> g$n-1enregistre un octet. Edit: en réalité, cela ne fonctionne pas car la formule est interprétée comme (...*g) (n-1).
Rétablir Monica
3

Dyalog APL, 9 octets

+∘1÷⍨⊢!+⍨

C'est un train monadique; il utilise la formule (2x nCr x) / (x + 1). Essayez-le en ligne ici .

lirtosiast
la source
3

C, 122 121 119 108 octets

main(j,v)char**v;{long long p=1,i,n=atoi(v[1]);for(j=0,i=n+1;i<2*n;p=(p*++i)/++j);p=n?p/n:p;printf("%d",p);}

J'ai utilisé gcc (GCC) 3.4.4 (spécial cygming, gdc 0.12, utilisant dmd 0.125) pour compiler dans un environnement windows cygwin. L'entrée entre en ligne de commande. Elle est similaire à la solution Python de Sherlock9, mais les boucles sont combinées en une seule pour éviter les débordements et obtenir une sortie jusqu'au 20ème chiffre catalan (n = 19).

cleblanc
la source
1
Vous pouvez supprimer l'espace après la virgule dans la maindéfinition pour enregistrer un octet.
Alex A.
Nice, je vais éditer le post maintenant
cleblanc
Vous pouvez enregistrer 2 octets supplémentaires avec char**vplutôt que char *v[]. (L'espace avant *n'est pas nécessaire et les types sont équivalents.)
Mat
Effectivement, cela fonctionne très bien. Thanks Mat
cleblanc
Cela utilise des éléments de la page de conseils pour le raccourcir. Notez cependant que pour Ideone, j'ai codé en dur une valeur pour n.
FryAmTheEggman
3

Javagony , 223 octets

public class C{public static int f(int a,int b){try{int z=1/(b-a);}catch(Exception e){return 1;}return a*f(a+1,b);}public static void main(String[]s){int m=Integer.parseInt(s[0])+1;System.out.println(f(m,2*m-1)/f(1,m)/m);}}

Entièrement développé:

public class C {
    public static int f(int a,int b){
        try {
            int z=1/(b-a);
        } catch (Exception e){
            return 1;
        }
        return a*f(a+1,b);
    }
    public static void main(String[] s){
        int m=Integer.parseInt(s[0])+1;
        System.out.println(f(m,2*m-1)/f(1,m)/m);
    }
}
flawr
la source
L'entrée d'Esolang n'a pas d'importance - tant que vous utilisez un interprète créé avant le concours, tout est valable et valable.
Addison Crump
De toute façon, je ne gagnerai pas ^^
dimanche
C'est java, alors oui.
Rɪᴋᴇʀ
1
@Riker Eh bien, c'est pire que Java.
Jakob
2

Japt, 16 octets

Même Mathematica est plus court. :-/

U*2ª1 o àU l /°U

Essayez-le en ligne!

Ungolfed et explication

U*2ª 1 o àU l /° U
U*2||1 o àU l /++U

         // Implicit: U = input number
U*2||1   // Take U*2. If it is zero, take 1.
o àU     // Generate a range of this length, and calculate all combinations of length U.
l /++U   // Take the length of the result and divide by (U+1).
         // Implicit: output result

Version alternative, basée sur la formule récursive:

C=_?(4+6/~Z *C$(Z-1):1};$C(U
ETHproductions
la source
2

Vitsy , 13 octets

VV2*FVF/V1+F/
V              Capture the input as a final global variable.
 V             Push it back.
  2*           Multiply it by 2
    F          Factorial.
     VF        Factorial of the input.
       /       Divide the second to top by the first.
        V1+    1+input
           F   Factorial.
            /  Divide.

Ceci est une fonction dans Vitsy . Comment en faire un programme qui fait cela, vous demandez? Concaténer N. c:

Essayez-le en ligne!

Addison Crump
la source
2

Voie lactée 1.5.14 , 14 octets

':2K;*Ny;1+/A!

Explication

'               # read input from the command line
 :              # duplicate the TOS
  2      1      # push integer to the stack
   K            # push a Pythonic range(0, TOS) as a list
    ;   ;       # swap the TOS and the STOS
     *          # multiply the TOS and STOS
      N         # push a list of the permutations of the TOS (for lists)
       y        # push the length of the TOS
          +     # add the STOS to the TOS
           /    # divide the TOS by the STOS
            A   # push the integer representation of the TOS
             !  # output the TOS

ou bien la version beaucoup plus efficace:


Voie lactée 1.5.14 , 22 octets

'1%{;K£1+k1-6;/4+*}A!

Explication

'                      # read input from the command line
 1     1  1 6  4       # push integer to the stack
  %{  £           }    # for loop
    ;        ;         # swap the TOS and the STOS
     K                 # push a Pythonic range(0, TOS) as a list
        +       +      # add the TOS and STOS
         k             # push the negative absolute value of the TOS
           -           # subtract the STOS from the TOS
              /        # divide the TOS by the STOS
                 *     # multiply the TOS and the STOS
                   A   # push the integer representation of the TOS
                    !  # output the TOS

Usage

python3 milkyway.py <path-to-code> -i <input-integer>
Zach Gates
la source
2

Clojure / ClojureScript, 53 octets

(defn c[x](if(= 0 x)1(*(c(dec x))(- 4(/ 6(inc x))))))

Clojure peut être assez frustrant pour le golf en. C'est très conciliant tout en restant très lisible, mais certaines des fonctionnalités les plus intéressantes sont vraiment prolixes. (inc x)est plus idiomatique que (+ x 1)et "se sent" plus concis, mais ne sauve pas réellement les personnages. Et écrire des chaînes d'opérations est plus agréable (->> x inc (/ 6) (- 4)), mais c'est en réalité plus long que de le faire de manière laide.

MattPutnam
la source
2

Prolog, 42 octets

Utiliser récursion est presque toujours la solution avec Prolog.

Code:

0*1.
N*X:-M is N-1,M*Y,X is(4-6/(N+1))*Y.

Exemple:

19*X.
X = 1767263190.0

Essayez-le en ligne ici

Emigna
la source
Êtes-vous en train de redéfinir le *symbole ici?
Paŭlo Ebermann
@ PaŭloEbermann pas exactement. Je définis un nouveau prédicat dyadique appelé *. Je peux toujours utiliser l'arithmétique classique. Dans le programme ci-dessus, M * Y est mon prédicat défini tandis que (4-6 / (N + 1)) * Y est une multiplication régulière.
Emigna
C'est un peu plus court que de l'écrire en p (X, Y): - ce qui est bien pour le code golf.
Emigna
2

Octave, 22 octets

@(n)prod(4-6./(2:n+1))
Alephalpha
la source
2

Ceylan, 60 octets

Integer c(Integer n)=>(1:n).fold(1)((p,i)=>p*(n+i)/i)/(n+1);

Cela fonctionne jusqu’à C 30 , car les entiers de Ceylan sont des nombres 64 bits signés (C 31 a un dépassement de capacité, sera calculé comme suit: -4050872099593203).

Je ne sais pas si Ceylan a des fonctions mathématiques supérieures intégrées, mais importer le bon paquet serait probablement plus long que de le calculer à pied.

// Catalan number C_n
//
// Question:  http://codegolf.stackexchange.com/q/66127/2338
// My answer: http://codegolf.stackexchange.com/a/66425/2338

Integer c(Integer n) =>
        // sequence of length n, starting at 1.
        (1:n)
        // starting with 1, for each element i, multiply the result
        // of the previous step by (n+i) and then divide it by i.
    .fold(1)((p, i) => p * (n + i) / i)
        // divide the result by n+1.
        / (n + 1);
Paŭlo Ebermann
la source
2

R, 35 28 16 octets

numbers::catalan

Edit: Utiliser le paquet de nombres intégré.

couloir
la source
2

MATL , 8 octets

2*GXnGQ/

Essayez-le en ligne!

Explication

2*     % take number n as input and multiply by 2
G      % push input again
Xn     % compute "2*n choose n"
G      % push input again
Q      % add 1
/      % divide
Luis Mendo
la source
2

05AB1E, 6 bytes

Dxcr>/

Explanation:

Code:     Stack:               Explanation:

Dxcr>/

D         [n, n]               # Duplicate of the stack. Since it's empty, input is used.
 x        [n, n, 2n]           # Pops a, pushes a, a * 2
  c       [n, n nCr 2n]        # Pops a,b pushes a nCr b
   r      [n nCr 2n, n]        # Reverses the stack
    >     [n nCr 2n, n + 1]    # Increment on the last item
     /    [(n nCr 2n)/(n + 1)] # Divides the last two items
                               # Implicit, nothing has printed, so we print the last item
Adnan
la source
2

R, 28 bytes

Not using a package, so slightly longer than a previous answer

choose(2*(n=scan()),n)/(n+1)
Frédéric
la source