モッツキン数


30

n番目のMotzkin番号は、(0、0)から(n、0)へのパスの数です。各ステップは(1、-1)、(1、0)、または(1、1)の形式で、パスはy = 0未満になることはありません。

上記のリンクからのn = 1、2、3、4のこれらのパスの例を次に示します。

モッツキン数

望ましいシーケンスはOEIS A001006です。OEISには、シーケンスの他のいくつかの特性があります。


入力として正の整数nが与えられます。n番目のMotzkin番号を出力する必要があります。

Motzkinの番号は1〜10です。

1, 2, 4, 9, 21, 51, 127, 323, 835, 2188

すべての標準入出力メソッドが許可されています。標準の抜け穴が適用されます。

これはコードゴルフです。最少バイトが勝ちます。


生成できるMotzkin数の最小セットは何ですか?
アディソンクランプ


@FlagAsSpam時間、メモリ、データ型の制限まで、それらすべて。
isaacg

言語には今、Dyckの言葉が組み込まれている必要があると思います。
リルトシアスト

回答:


15

MATL、13 14バイト

i-2/t.5+hH4Zh

例:

>> matl i-2/t.5+hH4Zh
> 6
51

編集(2017年6月16日):オンラインで試すことができます!また、言語の最新バージョン(このチャレンジより後の日付)では、この言語をi削除できることにも注意してください。

説明

超幾何関数で等価性(式(10)を参照)を使用すると、かなり簡単です

ここに画像の説明を入力してください

超幾何関数の定義から

ここに画像の説明を入力してください

最初の2つの引数の順序を入れ替えて1バイトを節約できることは明らかです。

i         % input                                                   
-2/       % divide by -2
t.5+      % duplicate and add 0.5
h         % horizontal concatenation into a vector                               
H         % number 2
4         % number literal                                          
Zh        % hypergeometric function with three inputs (first input is a vector)

1
この答えは最短で結び付けられており、約1時間半古いため、受け入れます。
-isaacg

ありがとう!MATLがPythに結び付けられることさえ想像できませんでした。それは打ち負かすのがとても難しい言語であり、それを設計する良い仕事です!
ルイスメンドー

11

網膜59 58バイト

+`(\D*)1(1*)
:$1<$2:$1>$2:$1_$2:
:(_|()<|(?<-2>)>)+:(?!\2)

入力を単項で受け取ります。入力7(つまり1111111)はかなり時間がかかりますが、1分以内に完了します。それ以上は進みません。

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

説明

モッツキン数の異なる特徴は、3つの異なる文字の文字列の数であり、そのうちの2つは正しくバランスが取られています(したがって、カタロニア語と密接な関係があります。

我々は単に生成して、.NETの分散グループは、正しくマッチした文字列の検出にかなり良いですすべての長さの文字列をN(使用_<および>3つの文字として)、その後、我々は正確にバランスされているどのように多くの人々のカウント。用などN = 4の有効な文字列は、次のとおりです。

____
__<>
_<_>
_<>_
<__>
<_>_
<>__
<<>>
<><>

チャレンジの定義と比較し_て、(1,0)ステップ、<to (1,1)および>に対応し(1,-1)ます。

実際のコードに関しては、:は異なる文字列間のセパレータとして使用されます。2番目の正規表現は、バランスの取れた文字列用の標準の.NET正規表現のゴルフ形式です

注意すべき点は:、各ステップの文字列の間に挿入されるのは1つだけですが、2番目の正規表現は先頭末尾に:一致することです(一致が重複できないため、最後のステップで1つのテンプレートから生成された隣接する文字列は両方一致できません)。ただし、これは問題ではありません。これらの3つのうち最大1つが一致する可能性があるためです。

  • で終わる文字列が_一致する場合、それなしの接頭辞_はすでに正しくバランスが取られている<か、または>そのバランスが崩れます。
  • 終わる文字列の場合は>一致が、文字列がバランスされいる>ので、_または<そのバランスを投げるでしょう。
  • で終わる文字列は<バランスを取ることができません。

「\」が特別な意味を持っているのは残念です。さもなければ「_ / \」文字を使用する方が質問の精神に合っていると思います。
ニール

9

Python 2、51バイト

M=lambda n:n<1or sum(M(k)*M(n-2-k)for k in range(n))

Mathworldの式を使用します

ここに画像の説明を入力してください

置くことによって文字を保存M[n-1]など合計に用語をk=n-1与え、M[-1]*M[n-1]と、M[-1]=1初期条件の一部として。

編集:合計を再帰的に書く1文字短い:

M=lambda n,k=0:n<1or k<n and M(k)*M(n-2-k)+M(n,k+1)

より長くなった他のアプローチ:

M=lambda n,i=0:n and(i>0)*M(n-1,i-1)+M(n-1,i)+M(n-1,i+1)or i==0
M=lambda n:+(n<2)or(3*~-n*M(n-2)+(n-~n)*M(n-1))/(n+2)

8

Pyth、15バイト

Ls*V+KyMb1+t_K1

これは関数を定義しますy。オンラインで試す:デモンストレーション

説明:

してみましょうy[n]ことがn目Motzkin数。私y[n]は式で計算します

y[n] = dot product of (y[0], ..., y[n-1], 1) and (y[n-2], ..., y[0], 1)

最初のベクトルが2番目のベクトルよりも大きいことに注意してください(計算時を除くy[0])。この場合、Pythは最初のベクトルの最後にある1を自動的に無視するため、両方のベクトルの長さが等しくなります。

Ls*V+KyMb1+t_K1
L                 define a function y(b), which returns:
      yMb            compute the list [y[0], y[1], ..., y[b-1]]
     K               assign it to K
  *V                 vectorized multiplication of
    +K   1             * K with a 1 at the end
          +t_K1        * reverse(K), remove the first element, and append 1
 s                   return the sum (dot product)

この式は、OEISにリストされている式の1つのバリエーションです。それは少し愚かかもしれません。最初のベクトルの最後に1があるため(長さが等しくなりません)、実際には再帰に基本ケースを指定する必要はありません。そして、私は2つ+...1のsが何とかゴルフできるという希望を持っていました。できません。

同じ長さのベクトルのドット積で同様の再帰を定義y[0] = 1し、同じバイトカウントで基本ケースを定義できます。


8

CJam(20バイト)

.5X]{__W%.*:++}qi*W=

オンラインデモ

Megoが質問のコメントで指摘したように、これはカタロニア語の番号と非常に密接に関連しています。カタロニア語の番号を取得するには、.5to 1を変更し、インデックスを1つオフセットし.5ます。

使用される繰り返しは

a(n + 2)-a(n + 1)= a(0)* a(n)+ a(1)* a(n-1)+ ... + a(n)* a(0)[ベルンハート]

OEISページから。カタロニア語番号に対応する繰り返しは、次のようにリストされます。

a(n)= Sum_ {k = 0..n-1} a(k)a(n-1-k)。


6

真剣に、21バイト

,;╗r`;τ╜█@;u@τ╣║\*`MΣ

quintopiaのCatalan Numbersソリューション(特にコメントで行った改善)からいくつかのコードを借用します。

次の式を使用します。

モッツキン式

以来nCk0であるk > n、私はすべての方法に合計n-1これらの値はすべて0になりますので、合計には影響しないので、。

オンラインで試す

説明:

,;╗r`;τ╜█@;u@τ╣║\*`MΣ
,;╗                    push input, dupe, store one copy in register 0
   r                   push range(0, n) ([0,n-1])
    `             `M   map the function:
     ;τ╜█@               dupe k, push C(n, 2*k), swap with k
          ;u@τ╣║\        push the kth Catalan number
                 *       multiply
                    Σ  sum

C(n, 2*k)今何をしていますか?
アディソンクランプ

@FlagAsSpam C(n,k) = nCk、またはkアイテムのプールからのアイテムの組み合わせの数n
メゴ

ああ、それは私が思っていたよりもはるかに理にかなっています。+1。
アディソンクランプ

...私はあなたがそれを思ったかを知りたいとは思わない@FlagAsSpam
MEGO

5

R、64バイト

f=function(n)ifelse(n<2,1,f(n-1)+sum(rev(s<-sapply(2:n-2,f))*s))

@xnorのpython answerの Mathworld式も使用します。優先順位規則のおかげで、2:n-2と同等0:(n-2)です。

テストケース:

> f(0)
[1] 1
> f(1)
[1] 1
> f(5)
[1] 21
> f(10)
[1] 2188
> sapply(0:20,f)
 [1]        1        1        2        4        9       21       51      127
 [9]      323      835     2188     5798    15511    41835   113634   310572
[17]   853467  2356779  6536382 18199284 50852019

5

Mathematica、31 30バイト

AppellF1[-#/2,.5,-#/2,2,4,4]&

楽しみのために、ここに37バイトのバージョンがあります

Hypergeometric2F1[(1-#)/2,-#/2,2,4]&

および52バイトバージョン

SeriesCoefficient[1-x-Sqrt[1-2x-3x^2],{x,0,#+2}]/2&

4

ゼリー17 14 13バイト

×US;
1;HÇƓ¡1ị

これは、@ PeterTaylorのanswerからの再帰関係を使用しますオンラインでお試しください!

使い方

×US;      Define a helper link. Left argument: a (list)

×U        Multiply (×) a by its reverse (U).
  S       Compute the sum of the resulting list.
   ;      Prepend it to a.
          Return the result.

1;HÇƓ¡1ị  Define the main link.

1         Set the left argument to 1.
 ;H       Append the half of 1 to 1. Result: [1, 0.5].
    Ɠ     Read an integer n from STDIN.
   Ç ¡    Call the helper link (Ç) n times.
      1ị  Retrieve the result at index 1.

2

Mathematica、44 42 34バイト

Sum[#!/(i!(i+1)!(#-2i)!),{i,0,#}]&

35バイトバージョン:

Coefficient[(1+x+1/x)^#,x]/#&[#+1]&

2

パリ/ GP38 36 26バイト

n->(1+x+x^2)^n++/n\x^n++%x

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

MathWorldの式(11)を使用します。

Mn=1n+1(n+11)2

ここで、は三項係数です。定義により、はの展開におけるの係数です。(nk)2(nk)2xn+k(1+x+x2)n


三項係数の最初の定義を使用した14バイトのSamau関数:);;7 2D$ⁿ$)╡$÷。言語は質問よりも新しいため、回答として投稿しません。
alephalpha

あなたが言ったように、言語は質問よりも新しいため、投稿することは問題ありません。
アレックスA.

2

05AB1E13 12バイト

ÝI<ãʒ.øDŸQ}g

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

ほとんどの回答では数式または繰り返しの関係を使用していますが、これは単純なカウント方法です。

グリッドを通る可能な各パスは、y座標のリストで表されます。nセグメントの場合、合計(n + 1)ポイントがありますが、最初と最後のポイントは必ず0であるため、(n-1)ポイントを指定します。

Ý           # range [0..n]
 I<         # n - 1
   ã        # cartesian power

これで、パスのリストが作成されました(最初と最後の0はまだ含まれていません)。構造上、それらのどれも0を下回ることはありません。しかし、それらのいくつかは違法な勾配(たとえば、0から2へのジャンプ)を持っているので、それらを除外する必要があります。

ʒ      }g   # count how many paths satistfy the following condition
 0.ø        # surround with 0
      Q     # is equal to
    DŸ      # its own fluctuating range

Ÿされる変動範囲は、内蔵します。隣接していない数字のペアがある場合、不足している数字を埋めます(たとえば、[0、2]は[0、1、2]になります)。有効なパスのみが変更されないままになります。

違法な傾斜をチェックするためのおそらくより直感的な方法は、üαà(ペアワイズ絶対差の最大値が1に等しいとアサートする)です。ただし、これはフラット[0、0、... 0]パスを見逃しており、修正に1バイト余分にかかります。

最後に、実際のコードでは、この説明で使用する場所を使用していることに注意してください0.ø。パスを0で囲む代わりに、これは暗黙的な入力をパスの2つのコピーで囲みます。これにより、座標系が上下逆さまになりますが、それ以外は同等です。




1

Brain-Flak、90バイト

(([{}]<(())>)<{({}()<{<>([({})]({}[({})]({}<>{}<>)))<>}<>>)}>){({}()<{}>)}{}({}{}[{}{}]<>)

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

計算しここで、は三項係数です。この式はどこにも見つからなかったので参照できませんが、類似の式と同じ方法で証明できます。(n0)2(n2)2(nk)2Cn=(2nn)(2nn+1)


0

ES6、44バイト

f=(n,k=0)=>n<1?1:k<n&&f(k)*f(n-2-k)+f(n,k+1)

@xnorの再帰的なPythonソリューションの簡単な移植版。戻るn<1?1:ために必要n<1||があります。f(0)true


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