Os números catalães ( OEIS ) são uma sequência de números naturais que geralmente aparecem na combinatória.
O enésimo número catalão é o número de palavras dyck (cadeias equilibradas de parênteses ou colchetes, como [[][]]
; formalmente definido como uma cadeia usando dois caracteres aeb, de modo que qualquer substring iniciada no início tenha um número de caracteres maior ou igual ao número de caracteres b, e a sequência inteira tem o mesmo número de caracteres aeb) com o comprimento 2n. O enésimo número catalão (para n> = 0) também é definido explicitamente como:
Começando com n = 0, os 20 primeiros números catalães são:
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190...
Desafio
Escreva um programa ou função completo que use um número inteiro não negativo n via STDIN ou uma alternativa aceitável e emita o enésimo número catalão. Seu programa deve funcionar no mínimo para as entradas de 0 a 19.
I / O
Entrada
Seu programa deve receber informações de STDIN, argumentos de função ou qualquer uma das alternativas aceitáveis para esta meta post. Você pode ler o número inserido como sua representação decimal padrão, representação unária ou bytes.
- Se (e somente se) o seu idioma não puder receber informações do STDIN ou de qualquer alternativa aceitável, ele poderá receber informações de uma variável codificada permanentemente ou de um equivalente adequado no programa.
Saída
Seu programa deve gerar o enésimo número catalão em STDOUT, resultado da função ou qualquer uma das alternativas aceitáveis para esta meta postagem. Você pode imprimir o número catalão em sua representação decimal padrão, representação unária ou bytes.
A saída deve consistir no número catalão apropriado, opcionalmente seguido por uma ou mais novas linhas. Nenhuma outra saída pode ser gerada, exceto a saída constante do intérprete do seu idioma que não pode ser suprimida (como uma saudação, códigos de cores ANSI ou recuo).
Não se trata de encontrar o idioma mais curto. Trata-se de encontrar o programa mais curto em todos os idiomas. Portanto, não aceitarei uma resposta.
Nesse desafio, os idiomas mais novos que o desafio são aceitáveis desde que tenham uma implementação. É permitido (e até encorajado) escrever esse intérprete para um idioma anteriormente não implementado. Fora isso, todas as regras padrão do código-golfe devem ser obedecidas. Os envios na maioria dos idiomas serão pontuados em bytes em uma codificação preexistente apropriada (geralmente UTF-8). Observe também que os internos para o cálculo do enésimo número catalão são permitidos.
Catálogo
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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>
Respostas:
C,
7852393433 bytesAinda mais magia C (obrigado xsot):
?:
é uma extensão GNU .Desta vez, expandindo a recorrência abaixo (obrigado xnor e Thomas Kwa):
-(n+1)
é substituído por~n
, que é equivalente ao complemento de dois e salva 4 bytes.Novamente como uma função, mas desta vez explorando a seguinte recorrência:
c(n)
entra em uma recursão infinita para negativon
, embora não seja relevante para esse desafio.Como chamar uma função parece uma alternativa aceitável para a E / S do console:
c(n)
pega umint
e retorna umint
.Entrada original:
Em vez de calcular diretamente a definição, a fórmula é reescrita como:
A fórmula assume
n >= 2
, mas o código representan = 0
en = 1
também.Na bagunça C acima,
n
ek
tem o mesmo papel que na fórmula, enquantoc
acumula o produto. Todos os cálculos são realizados em vírgula flutuantedouble
, o que quase sempre é uma má ideia, mas, neste caso, os resultados estão corretos até n = 19, pelo menos, então está tudo bem.float
teria economizado 1 byte, infelizmente não é preciso o suficiente.fonte
c(n){return!n?:(4+6./~n)*c(n-1);}
?:
! Aparentemente, é uma extensão GNU C, mas acho que ainda se qualifica.Gelatina , 4 bytes
Experimente online!
Como funciona
fonte
c
obter2z
ez
como argumentos?CJam, 12 bytes
Experimente online.
Além da entrada 11, você precisará informar sua Java VM para usar mais memória. E eu realmente não recomendaria ir muito além do 11. Na teoria, funciona para qualquer N, pois o CJam usa números inteiros de precisão arbitrária.
Explicação
O CJam não possui coeficientes binomiais integrados, e computá-los a partir de três fatoriais leva muitos bytes ... então teremos que fazer algo melhor que isso. :)
fonte
ri_2*m!1$m!_*/\)/
) na minha implementação. A única coisa boa é que é muito mais rápido. :)Mathematica,
1613 bytesCompanheiros de amirita embutidos: /
Versão não integrada (21 bytes):
Uma versão sem binômio (25 bytes):
fonte
TI-BASIC, 11 bytes
Estranhamente, o nCr tem maior precedência que a multiplicação.
fonte
Python 3, 33 bytes
Usa a recorrência
O caso base de 0 é tratado como
0**n or
, que para como1
quandon==0
e avalia a expressão recursiva à direita. O operador bit a bit~n==-n-1
reduz o denominador e economiza em parênteses.O Python 3 é usado para sua divisão de flutuação. Python 2 poderia fazer o mesmo com mais um byte para escrever
6.
.fonte
n<1
e não0**n
?True
para emn==0
vez de1
. Claro,True == 1
masTrue is not 1
e imprime de forma diferente. Eu esperaria que isso não fosse permitido. Você sabe se temos uma decisão sobre isso?isinstance(True, int) is True
depois de tudo.J, 8 bytes
Este é um trem monádico; ele usa a fórmula (2x nCr x) / (x + 1). Experimente aqui .
fonte
pl, 4 bytes
Experimente online.
Explicação
Em pl, as funções retiram seus argumentos da pilha e enviam o resultado de volta para a pilha. Normalmente, quando não há argumentos suficientes na pilha, a função simplesmente falha silenciosamente. No entanto, algo especial acontece quando a quantidade de argumentos na pilha é diferente da área da função - a variável de entrada
_
é adicionada à lista de argumentos:Com efeito, este é o pseudocódigo:
fonte
Sesos ,
948668 bytes8 bytes, alterando o fatorial-er da versão 1 para a versão 2.
18 bytes computando
n!(n+1)!
em uma etapa. Em grande parte inspirado pelo algoritmo de teste de primalidade de Dennis .Hexdump:
Experimente online!
Usa a fórmula
a(n) = (2n)! / (n!(n+1)!)
.Montador
Equivalente a Brainfuck
Esse script da Retina é usado para gerar o equivalente do cérebro. Observe que ele aceita apenas um dígito como argumento de comando e não verifica se um comando está nos comentários.
fonte
Pitão, 8
Experimente online ou execute o Test Suite
Explicação
fonte
Sério, 9 bytes
Hex Dump:
Experimente online
Explicação:
fonte
2n
linha th éC(2n,n)
. Assim:,;u@τ╣║/
por 8 bytes.║
eM
iria funcionar.JavaScript (ES6), 24 bytes
Baseado na resposta do Python .
Como funciona
Acho que é o mais curto possível, mas sugestões são bem-vindas!
fonte
Julia, 23 bytes
Esta é uma função anônima que aceita um número inteiro e retorna um número flutuante. Ele usa a fórmula binomial básica. Para chamá-lo, dê um nome, por exemplo
f=n->...
.fonte
Matlab,
3525 bytesOitava, 23 bytes
fonte
@(n)
vez da função, funções anônimas estão ok.n
:@(n)nchoosek(2*n,n++)/n
.../++n
também não funciona. : /, 3 caracteres / 6 bytes
Try it here (Firefox only).
Builtins ftw! Estou tão feliz por ter implementado o math.js desde o início.
Solução de bônus, 12 caracteres / 19 bytes
Try it here (Firefox only).
Ay! 19 byte!
Avalia como pseudo-ES6 como:
fonte
Haskell, 27 bytes
Uma fórmula recursiva. Tem que haver uma maneira de economizar em parênteses ...
Tomar o produto diretamente era 2 bytes mais longo:
fonte
g(n-1)
=>g$n-1
salva um byte. Edit: na verdade, isso não funciona, porque a fórmula é interpretada como(...*g) (n-1)
.Dyalog APL, 9 bytes
Este é um trem monádico; ele usa a fórmula (2x nCr x) / (x + 1). Experimente online aqui .
fonte
C,
122121119108 bytesEu usei o gcc (GCC) 3.4.4 (cygming special, gdc 0.12, usando dmd 0.125) para compilar em um ambiente windows cygwin. A entrada entra na linha de comando. É semelhante à solução Python do Sherlock9, mas os loops são combinados em um para evitar transbordamentos e obter saída até o 20º número catalão (n = 19).
fonte
main
definição para salvar um byte.char**v
vez dechar *v[]
. (O espaço anterior*
não é necessário, e os tipos são equivalentes.) #n
.Javagony , 223 bytes
Totalmente expandido:
fonte
Japonês, 16 bytes
Até o Mathematica é mais curto.
:-/
Experimente online!
Ungolfed e explicação
Versão alternativa, com base na fórmula recursiva:
fonte
Vitsy , 13 bytes
Esta é uma função no Vitsy . Como torná-lo um programa que faz isso, você pergunta? Concatenar
N
. c:Experimente online!
fonte
Via Láctea 1.5.14 , 14 bytes
Explicação
ou, alternativamente, a versão muito mais eficiente:
Via Láctea 1.5.14 , 22 bytes
Explicação
Uso
fonte
Clojure / ClojureScript, 53 bytes
Clojure pode ser bastante frustrante para jogar golfe. É muito conciso e ainda é muito legível, mas alguns dos recursos mais interessantes são realmente detalhados.
(inc x)
é mais idiomático do que(+ x 1)
"parece" mais conciso, mas na verdade não salva os caracteres. E escrever cadeias de operações é mais agradável(->> x inc (/ 6) (- 4))
, mas na verdade é mais longo do que apenas fazê-lo da maneira feia.fonte
Prolog, 42 bytes
Usar a recursão é quase sempre o caminho a seguir com o Prolog.
Código:
Exemplo:
Experimente online aqui
fonte
*
símbolo aqui?Oitava, 22 bytes
fonte
Ceilão, 60 bytes
Isso funciona até C 30 , já que os números inteiros do Ceilão são assinados com números de 64 bits (C 31 está excedente, será calculado como -4050872099593203).
Não sei se o Ceilão tem funções matemáticas superiores, mas importar o pacote certo provavelmente seria mais longo do que apenas calcular isso a pé.
fonte
R,
352816 bytesEdit: Use o pacote de números embutido.
fonte
MATL , 8 bytes
Experimente online!
Explicação
fonte
05AB1E , 6 bytes
Explicação:
fonte
R, 28 bytes
Não está usando um pacote, então um pouco mais do que uma resposta anterior
fonte