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 code-golf 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
où N
est 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
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 66127; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Réponses:
C,
7852393433 octetsEncore plus de magie C (merci xsot):
?:
est une extension GNU .Cette fois en augmentant la récurrence ci-dessous (merci xnor et Thomas Kwa):
-(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:
c(n)
entre une récursion infinie pour le négatifn
, 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)
prend unint
et retourne unint
.Entrée originale:
Au lieu de calculer directement la définition, la formule est réécrite comme suit:
La formule suppose
n >= 2
, mais le code représenten = 0
etn = 1
aussi.Dans le désordre C ci-dessus,
n
etk
ont le même rôle que dans la formule, tout enc
accumule le produit. Tous les calculs sont effectués en virgule flottantedouble
, 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.la source
c(n){return!n?:(4+6./~n)*c(n-1);}
?:
! Apparemment, c’est une extension GNU C mais je pense qu’elle est toujours qualifiée.Gelée , 4 octets
Essayez-le en ligne!
Comment ça marche
la source
c
get2z
etz
comme arguments?CJam, 12 octets
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. :)
la source
ri_2*m!1$m!_*/\)/
) dans mon implémentation. La seule bonne chose est que c'est beaucoup plus rapide. :)Mathematica,
16 à13 octetsBuilt-ins, les gars amirite: /
Version non intégrée (21 octets):
Une version sans binôme (25 octets):
la source
TI-BASIC, 11 octets
Curieusement, nCr a une priorité plus élevée que la multiplication.
la source
Python 3, 33 octets
Utilise la récurrence
Le cas de base de 0 est traité comme
0**n or
, ce qui stoppe comme1
lorsquen==0
et évaluera autrement l'expression récursive de droite. L'opérateur au niveau du bit~n==-n-1
raccourcit 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.
.la source
n<1
plutôt que0**n
?True
pourn==0
plutôt que1
. Bien sûr,True == 1
maisTrue is not 1
et cela imprime différemment. Je m'attendrais à ce que cela ne soit pas autorisé. Savez-vous si nous avons une décision à ce sujet?isinstance(True, int) is True
après tout.J, 8 octets
C'est un train monadique; il utilise la formule (2x nCr x) / (x + 1). Essayez ici .
la source
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:En effet, c'est le pseudocode:
la source
Sesos ,
948668 octets8 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:
Essayez-le en ligne!
Utilise la formule
a(n) = (2n)! / (n!(n+1)!)
.Assembleur
É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.
la source
Pyth, 8
Essayez-le en ligne ou lancez le suite de tests
Explication
la source
Sérieusement, 9 octets
Décharge Hex:
Essayez-le en ligne
Explication:
la source
2n
rangée estC(2n,n)
. Donc:,;u@τ╣║/
pour 8 octets.║
etM
fonctionneraient.JavaScript (ES6), 24 octets
Basé sur la réponse Python .
Comment ça marche
Je pense que c'est le plus court possible, mais les suggestions sont les bienvenues!
la source
Julia, 23 octets
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->...
.la source
Matlab,
35 à25 octetsOctave, 23 octets
la source
@(n)
au lieu de la fonction, les fonctions anonymes sont ok.n
:@(n)nchoosek(2*n,n++)/n
.../++n
ça ne marche pas non plus. : /, 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
Try it here (Firefox only).
Oui! 19ème octet!
Evalue en pseudo-ES6 comme:
la source
Haskell, 27 octets
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:
la source
g(n-1)
=>g$n-1
enregistre un octet. Edit: en réalité, cela ne fonctionne pas car la formule est interprétée comme(...*g) (n-1)
.Dyalog APL, 9 octets
C'est un train monadique; il utilise la formule (2x nCr x) / (x + 1). Essayez-le en ligne ici .
la source
C,
122121119108 octetsJ'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).
la source
main
définition pour enregistrer un octet.char**v
plutôt quechar *v[]
. (L'espace avant*
n'est pas nécessaire et les types sont équivalents.)n
.Javagony , 223 octets
Entièrement développé:
la source
Japt, 16 octets
Même Mathematica est plus court.
:-/
Essayez-le en ligne!
Ungolfed et explication
Version alternative, basée sur la formule récursive:
la source
Vitsy , 13 octets
Ceci est une fonction dans Vitsy . Comment en faire un programme qui fait cela, vous demandez? Concaténer
N
. c:Essayez-le en ligne!
la source
Voie lactée 1.5.14 , 14 octets
Explication
ou bien la version beaucoup plus efficace:
Voie lactée 1.5.14 , 22 octets
Explication
Usage
la source
Clojure / ClojureScript, 53 octets
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.la source
Prolog, 42 octets
Utiliser récursion est presque toujours la solution avec Prolog.
Code:
Exemple:
Essayez-le en ligne ici
la source
*
symbole ici?Octave, 22 octets
la source
Ceylan, 60 octets
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.
la source
R,
352816 octetsEdit: Utiliser le paquet de nombres intégré.
la source
MATL , 8 octets
Essayez-le en ligne!
Explication
la source
05AB1E, 6 bytes
Explanation:
la source
R, 28 bytes
Not using a package, so slightly longer than a previous answer
la source