カタロニア語番号


36

カタロニア番号OEISは)多くの場合、組み合わせ論に登場する自然数の列です。

n番目のカタロニア語番号は、Dyckの単語の数です(括弧または括弧のようなバランスの取れた文字列 [[][]]です;形式的には、2文字aとbを使用して、先頭から始まる部分文字列の数がnumber以上の文字列として定義されます長さ2nで、文字列全体が同じ数のaおよびb文字を持ちます。n番目のカタロニア語番号(n> = 0の場合)も、次のように明示的に定義されます。

n = 0から始めて、最初の20個のカタロニア語番号は次のとおりです。

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

チャレンジ

STDINまたは受け入れ可能な代替手段を介して負でない整数nを取り、n番目のカタロニア語番号を出力する完全なプログラムまたは関数を作成します。プログラムは、入力0〜19に対して少なくとも機能する必要があります。

I / O

入力

プログラムは、STDIN、関数の引数、またはこのメタ投稿ごとに受け入れ可能な代替のいずれかから入力を受け取る必要があります入力した数値は、標準の10進数表現、単項表現、またはバイトとして読み取ることができます。

  • 言語がSTDINまたは受け入れ可能な代替から入力を取得できない場合(のみ)、ハードコーディングされた変数またはプログラム内の適切な同等物から入力を取得できます。

出力

プログラムは、n番目のカタロニア語番号をSTDOUT、関数結果、またはこのメタ投稿ごとに受け入れ可能な代替物に出力する必要があります標準の10進数表現、単項表現、またはバイトでカタロニア語番号を出力できます。

出力は適切なカタロニア語番号で構成され、オプションで1つ以上の改行が続きます。抑制できない言語のインタープリターの一定の出力(挨拶、ANSIカラーコード、インデントなど)を除き、他の出力は生成できません。


これは、最短の言語を見つけることではありません。これは、すべての言語で最短のプログラムを見つけることです。したがって、私は答えを受け入れません。

この課題では、実装されている限り、課題より新しい言語は受け入れられます。以前に未実装の言語用にこのインタープリターを自分で作成することは許可されています(推奨されます)。それ以外は、すべての標準ルールに従わなければなりません。ほとんどの言語での提出は、適切な既存のエンコーディング(通常はUTF-8)でバイト単位でスコア付けされます。また、n番目のカタロニア語番号を計算するための組み込み関数が許可されていることに注意してください。

カタログ

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


整数ではなく浮動小数点数を出力/返すことができますか?
アレックスA.

@AlexA。これは許容範囲です。
spaghetto

タグoeisがありますか?
Vi。

1
@Vi。我々は合意されたバックながら、そのことについてのメタ議論がありましたoeisは不要だった
spaghettoは

@Vi。ここでメタポストはある:meta.codegolf.stackexchange.com/a/5546/8478。いくつかの理由については、シーケンスnumberまたはnumber-theoryのいずれかを使用すると、OEISスタイルの課題を非常に確実に見つけることができます。所定の配列が実際にいるかどうかである OEISで、チャレンジに完全に無関係です。
マーティンエンダー

回答:


26

C、78 52 39 34 33バイト

さらに多くのCマジック(xsotに感謝):

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

?: はGNU拡張です。


今回は、以下の繰り返しを展開して(xnorとThomas Kwaに感謝します):

yet another recursion

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

-(n+1)~n、2の補数で同等であり、4バイトを節約します。


再び関数としてですが、今回は次の繰り返しを利用します。

recur

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

c(n)これは、nこの課題には関係ありませんが、negativeの無限再帰に入ります。


関数の呼び出しは、コンソールI / Oの代替として受け入れられるように思われます。

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

c(n)を取り、intを返しますint


元のエントリ:

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

定義を直接計算する代わりに、式は次のように書き換えられます。

rewrite

数式はを前提n >= 2としていますが、コードはn = 0それn = 1も考慮しています。

上記Cの混乱にn及びkながら、式と同じ役割を有するc生成物を蓄積します。すべての計算はを使用して浮動小数点で実行されますがdouble、これはほとんど常に悪い考えですが、この場合、結果は少なくともn = 19までは正しいので問題ありません。

float 残念ながら1バイトを節約できたでしょうが、残念ながら十分ではありません。


今はこれをテストできませんが、さらに短縮できると思います。c(n){return!n?:(4+6./~n)*c(n-1);}
xsot

@xsotに感謝、私は知りませんでした?:!どうやら、それはGNU Cの拡張ですが、私はそれがまだ資格があると思います。
ステファノサンフィリッポ

23

ゼリー、4バイト

Ḥc÷‘

オンラインでお試しください!

使い方

Ḥc÷‘    Left argument: z

Ḥ       Compute 2z.
 c      Hook; apply combinations to 2z and z.
  ÷‘    Divide the result by z+1.

1
?平均フック」どのように」何をしてcもらう2zz?その引数として
XNOR

@xnorフックとは、f(x、g(x))のように評価される関数を意味します。二項関数の後に別の二項関数がある場合、パーサーは最初の関数をフックとして評価します。
リルトシアスト

5
@Dennisそれは本当に4バイトですか?これらの非ASCII文字では、mothereff.in / byte
ルイスメンドー

それはおそらく別のエンコーディングだ@LuisMendo
undergroundmonorail

3
@LuisMendo Jellyは、独自のカスタムエンコーディングのデフォルトを使用します。各文字は1バイトです。UTF-8では、ソースコードは実際に9バイト長です。
デニス

11

CJam、12バイト

ri_2,*e!,\)/

オンラインでお試しください。

入力11を超えて、より多くのメモリを使用するようJava VMに指示する必要があります。また、実際には11を超えることはお勧めしません。理論上は、CJamは任意精度の整数を使用するため、どのNでも機能します。

説明

CJamには二項係数の組み込み機能がないため、3つの階乗からそれらを計算するには多くのバイトが必要になります。:)

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.

これは本当にクールです。1
spaghetto

これは賢いです。階乗を計算して試してみました。2つは同じであるため、通常の3つのうち2つしか必要ありません。ri_2*m!1$m!_*/\)/私の実装では、まだ17バイト()を使用していました。唯一の良い点は、はるかに高速であることです。:)
レトコラディ

11

Mathematica、16 13バイト

CatalanNumber

ビルトイン、アミライトフェラ:/

非組み込みバージョン(21バイト):

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

二項なしバージョン(25バイト):

Product[(#+k)/k,{k,2,#}]&

10

TI-BASIC、11バイト

(2Ans) nCr Ans/(Ans+1

奇妙なことに、nCrは乗算よりも優先順位が高くなっています。


10

Python 3、33バイト

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

繰り返しを使用します

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

0のベースケースはとして処理されます0**n or。これは、1いつ停止しn==0、そうでない場合は右側の再帰式を評価します。ビット単位演算子~n==-n-1は分母を短縮し、括弧を節約します。

Python 3は浮動小数点除算に使用されます。Python 2はもう1バイト書くことで同じことができます6.


なぜではn<1なく0**n
feersum

@feersumそれは返すTrueためにn==0ではなく1。もちろんですTrue == 1True is not 1、印刷方法は異なります。私はこれが許可されないと予想しています。これについて裁定があるかどうか知っていますか?
xnor

大丈夫だと思います。isinstance(True, int) is True結局。
feersum

2
私はそれが一般的なケースではまだ不確かだと思います、さらにここではチャレンジが出力を数値またはその表現として指定していると思います。しかし、最大@quartata
xnor


7

pl、4バイト

☼ç▲÷

オンラインでお試しください。

説明

plでは、関数は引数をスタックから取り出し、結果をスタックにプッシュします。通常、スタックに十分な引数がない場合、関数は単純に失敗します。ただし、スタック上の引数の量が関数のアリティから1つ外れている場合、入力変数_が引数リストに追加されると、何か特別なことが起こります。

☼ç▲÷

☼      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

実際には、これは擬似コードです。

divide(combinations(double(_),_),_+1);

6

Sesos94 86 68バイト

factorial-erをバージョン1からバージョン2に変更して8バイト。

n!(n+1)!1ステップで計算して18バイト。主にデニスの素数性テストアルゴリズムに触発されました。

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.>..

オンラインでお試しください!

式を使用しa(n) = (2n)! / (n!(n+1)!)ます。

  • factorial-er:バージョン1(インプレース、コンスタントメモリ)、バージョン2(インプレース、リニアメモリ)
  • 乗数:ここ(所定の場所に、一定のメモリ)
  • 分割線:ここ(分割できない場合は停止しません)

アセンブラ

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

Brainfuckと同等

このRetinaスクリプトは、同等のBrainfuckを生成するために使用されます。コマンド引数として1桁のみを受け入れ、コマンドがコメント内にあるかどうかをチェックしないことに注意してください。

[->+>>++<<<]>+
[[-<+<+<+>>>]<-<-<[->>>+<<<]>]>>>
[[-<[-<+<+>>]<<[->>+<<]>>>]<[-]<[->>+<<]>>>]>
[[->+>+<<]>->[-<<+>>]<]<<
[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>
[>+<<<[->+>-<<]>[-<+>]>]>


5

真剣に、9バイト

,;;u)τ╣E\

六角ダンプ:

2c3b3b7529e7b9455c

オンラインで試す

説明:

,                   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.

パスカルの三角形の行が対称であるという事実を活用することで、バイトを節約できます。したがって、2nth行の中央値はC(2n,n)です。したがって:,;u@τ╣║/8バイト。
メゴ

何?2nCnは2n行目の最大値ではありませんか?
キントピア

はい、それは中央値でもあります。だから、両方M動作します。
メゴ

@Megoリストがすべて同じ数ではない場合に、中央値と最大値の両方が可能な場合、中央値の実装が心配です。あなたは「リストの途中で」意味なら、あなたは...それのために別の名前を選択する可能性があります
quintopia

はい、それはリストの中央です。ソートされたリストの場合、これは一般的な統計上の中央値ですが、ソートされていないリストの場合は中央(または2つの中間要素の平均)に過ぎません
Mego

4

JavaScript(ES6)、24バイト

Pythonの回答に基づきます

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

使い方

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.

これは最短時間だと思いますが、提案は大歓迎です!


4

ジュリア、23バイト

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

これは、整数を受け入れ、floatを返す匿名関数です。基本的な二項式を使用します。呼び出すには、名前を付けf=n->...ます。


4

Matlab、35 25バイト

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

オクターブ、23バイト

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

2
@(n)関数の代わりに使用できますが、匿名関数は問題ありません。
FryAmTheEggman

ワークスペース変数にアクセスする前に、ここでいくつかの回答を見ました(それらは既に他のユーザーによって設定されていたことを意味します)。MATLAB / Octaveのスクリプトも単純なスニペットとして表示できます。私は...今の機能にそれを再作った
costrom

1
あなたは、ポストインクリメントすることにより2つの以上のバイトをオフにノックすることができますn@(n)nchoosek(2*n,n++)/n
ビーカー

@beaker先端をありがとう!私は離れて、それを分割してきたので、それだけではなく、Matlabの、けれどもオクターブで働く
costrom

@costromそれは面白いです。.../++nどちらも機能しないと思います。:/
ビーカー


3

Haskell、27バイト

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

再帰的な数式。括弧を節約する方法がなければなりません...

製品を直接摂取すると、2バイト長くなりました。

g n=product[4-6/i|i<-[2..n+1]]

あなたのコードはどこからstdinを読んだり、stdoutに書いたりしますか?
user2845840

2
@ user2845840関数は、仕様でリンクされている許容可能な代替の 1つです。
XNOR

g(n-1)=> g$n-11バイト節約します。編集:実際にはこれは機能しません。なぜなら式はとして解釈されるから(...*g) (n-1)です。
モニカを復活させる


3

C、122 121 119 108バイト

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);}

gcc(GCC)3.4.4(cygming special、gdc 0.12、dmd 0.125を使用)を使用して、Windows cygwin環境でコンパイルしました。入力はコマンドラインから入力します。Sherlock9のPythonソリューションに似ていますが、ループを1つにまとめてオーバーフローを回避し、20番目のカタロニア番号(n = 19)まで出力します。


1
main定義内のコンマの後のスペースを削除して、バイトを保存できます。
アレックスA.

ニースは、私は今のポストを編集します
cleblanc

char**vではなく、さらに2バイト節約できますchar *v[]。(前のスペース*は不要であり、タイプは同等です。)
2015

案の定、それはうまくいきます。おかげでマット
cleblanc

これは、ヒントページの一部を使用して短縮します。ただし、Ideoneではの値をハードコーディングしたことに注意してくださいn
FryAmTheEggman

3

Javagony、223バイト

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);}}

完全に展開:

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);
    }
}

Esolangsのエントリーは重要ではありません-コンテストの前に作成されたインタープリターを使用する限り、それはすべて有効で有効です。
アディソンクランプ

とにかく勝つつもりはありません^^
flawr

Javaなので、そうです。
Rɪᴋᴇʀ

1
@Rikerまあ、それはJavaよりも悪いです。
ヤコブ

2

Japt、16バイト

Mathematicaでも短いです。 :-/

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

オンラインでお試しください!

非ゴルフと説明

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

再帰式に基づく代替バージョン:

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


2

天の川1.5.14、14バイト

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

説明

'               # 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

あるいは、多くのより効率的なバージョン:


天の川1.5.14、22バイト

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

説明

'                      # 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

使用法

python3 milkyway.py <path-to-code> -i <input-integer>

2

Clojure / ClojureScript、53バイト

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

Clojureは、ゴルフをするのにかなりイライラすることがあります。非常に読みやすいのに非常に簡潔ですが、いくつかのすばらしい機能は本当に冗長です。 (inc x)(+ x 1)、より簡潔であり、より簡潔に「感じ」ますが、実際にはキャラクターを保存しません。そして(->> x inc (/ 6) (- 4))、一連の操作を記述するのはのように優れていますが、実際にはjustい方法で行うよりも長くなります。


2

プロローグ、42バイト

再帰を使用することは、ほとんど常にPrologを使用する方法です。

コード:

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

例:

19*X.
X = 1767263190.0

こちらからオンラインでお試しください


*ここでシンボルを再定義していますか?
パエロエベルマン

@PaŭloEbermann正確ではありません。*と呼ばれる新しい2項述語を定義しています。まだ通常の算術演算を使用できます。上記のプログラムでは、M * Yは定義済みの述語ですが、(4-6 /(N + 1))* Yは通常の乗算​​です。
エミグナ

p(X、Y):-と書くよりもわずかに短く、コードゴルフに適しています。
エミグナ


2

セイロン、60バイト

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

これはCeylonの整数が64ビット符号付きであるため、C 30まで機能します(C 31にはオーバーフローがあり、-4050872099593203として計算されます)。

Ceylonに高度な数学関数が組み込まれているかどうかはわかりませんが、適切なパッケージをインポートすると、単に徒歩で計算するよりも長くなるでしょう。

// 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);

2

R、35 28 16バイト

numbers::catalan

編集:組み込みの数字パッケージを使用します。


2

MATL, 8 bytes

2*GXnGQ/

Try it online!

Explanation

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

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

2

R, 28 bytes

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

choose(2*(n=scan()),n)/(n+1)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.