모츠 킨 숫자


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 Number를 출력해야합니다.

Motzkin 번호 1 ~ 10은 다음과 같습니다.

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

모든 표준 입력 및 출력 방법이 허용됩니다. 표준 허점이 적용됩니다.

이것은 코드 골프입니다. 가장 적은 바이트가 이깁니다.


생성 할 수있는 최소 Motzkin 수는 무엇입니까?
애디슨 크럼


@FlagAsSpam 모두 시간 / 메모리 / 데이터 유형의 제한까지 있습니다.
isaacg

언어에는 기본적으로 Dyck 단어가 필요하다고 생각합니다.
lirtosiast

답변:


15

MATL , 13 14 바이트

i-2/t.5+hH4Zh

예:

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

편집 (2017 년 6 월 16 일) : 온라인으로 사용해 볼 수 있습니다! 또한 최신 버전의 언어 (이 과제 이후의 언어)에서는 i제거 할 수 있습니다.

설명

hypergeometric 함수등가 (식 10 참조)를 사용 하면 매우 간단 합니다 .

여기에 이미지 설명을 입력하십시오

초 기하 함수의 정의에서

여기에 이미지 설명을 입력하십시오

처음 두 인수의 순서를 서로 바꿔서 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 2016 년

감사! MATL이 심지어 Pyth와 연결될 것이라고는 거의 상상할 수 없었습니다. 이길 어려운 언어, 그것을 디자인하는 좋은 직업입니다!
루이스 멘도

11

망막 , 59 58 바이트

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

단항으로 입력을 받습니다. 입력 7 (즉 1111111)은 꽤 오래 걸리지 만 여전히 1 분 이내에 완료됩니다. 나는 그것보다 더 멀리 가지 않을 것입니다.

온라인으로 사용해보십시오.

설명

Motzkin 숫자의 다른 특성은 세 가지 문자의 문자열 수이며, 두 문자가 올바르게 균형을 이룹니다 (따라서 균형에 독립적 인 세 번째 문자없이 동일한 카탈로니아 어 숫자와 밀접한 관계가 있음).

.NET의 균형 그룹은 그래서 우리는 간단하게 생성, 정확하게 일치하는 문자열을 탐지 꽤 좋은 모든 길이의 문자열 N(사용을 _, <그리고 >세 개의 문자로) 그리고 우리는 그 많은이 제대로 균형을하는 방법을 계산합니다. 예를 N = 4들어 유효한 문자열은 다음과 같습니다.

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

과제의 정의와 비교하여, _(A)에 대응 (1,0)단계 <(1,1)>(1,-1).

실제 코드 :는 다른 문자열 사이의 구분 기호로 사용됩니다. 두 번째 정규식은 균형 잡힌 문자열에 대한 표준 .NET 정규식 의 골프 형식 입니다 .

주목해야 할 것은 :각 단계에서 문자열 사이에 하나의 삽입 만 있지만 두 번째 정규 표현식은 선행 후행 일치합니다 :(일치 할 수 없기 때문에 마지막 단계의 한 템플릿에서 생성 된 인접한 문자열은 모두 일치 할 수 없음을 의미합니다 ). 그러나이 세 가지 중 하나만 일치 할 수 있기 때문에 이것은 문제가되지 않습니다.

  • 끝나는 문자열이 _일치하면 접두사가없는 접두사 _가 이미 올바르게 균형 조정되어 <있거나 >해당 균형을 버리는 것입니다.
  • 로 끝나는 문자열 경우 >경기가 문자열이 균형 >때문에, _또는 <균형을 던질 것입니다.
  • 끝나는 문자열 <은 균형을 맞출 수 없습니다.

'\'가 특별한 의미를 가지면 '_ / \'문자를 사용하는 것이 질문의 정신에 더 적합하다는 것은 부끄러운 일입니다.
Neil

9

파이썬 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초기 상태의 일부로.

편집 : 하나의 짧은 문자가 재귀 적으로 합계를 작성합니다.

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)

첫 번째 벡터가 두 번째 벡터보다 큽니다 (계산시 제외 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어떻게 든 골프를 칠 수 있기를 희망했습니다 . 내가 할 수없는 것으로 밝혀졌습니다.

길이가 같은 벡터의 내적을 사용하여 유사한 재귀를 정의 y[0] = 1하고 동일한 바이트 수로 기본 사례 를 정의 할 수 있습니다.


8

CJam (20 바이트)

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

온라인 데모

Mego 질문에 대한 코멘트에 언급 한 바와 같이,이 매우 밀접하게 카탈루냐어 번호와 관련된 경우 : 변경 .51하나가 인덱스 오프셋 (또는 간단히 제거 .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 솔루션의 일부 코드 , 특히 주석에서 개선 된 코드를 차용 합니다.

다음 공식을 사용합니다.

motzkin 공식

이후 nCk에 0 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항목 조합 수입니다 .
Mego

아, 그건 내가 생각했던 것보다 더 의미가 있습니다. +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 's 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 's 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

매스 매 티카, 44 42 34 바이트

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

35 바이트 버전 :

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

2

Pari / GP , 38 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

잘 말하면, 언어가 질문보다 최신이기 때문에 제출이 이길 수 없다는 고지 사항을 추가해야합니다.
Alex A.

2

05AB1E , 13 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

Ÿ는 IS 변동 범위는 내장. 인접하지 않은 숫자 쌍이 있으면 누락 된 숫자를 채 웁니다 (예 : [0, 2]는 [0, 1, 2]가 됨). 법적 경로 만 변경되지 않습니다.

불법 슬로프를 확인하는 더 직관적 인 방법 üαà은 (페어 와이즈 절대 차의 최대 값이 1과 같다고 주장하는 것입니다 ). 그러나 플랫 [0, 0, ... 0] 경로를 놓치면 수정하는 데 1 바이트가 더 필요합니다.

마지막으로 실제 코드는 이 설명에서 사용 되는 위치를 사용합니다 0.ø. 경로를 0으로 둘러싸는 대신 암시 적 입력을 경로의 두 복사본으로 둘러 쌉니다. 좌표계를 거꾸로 뒤집거나 뒤집지 만 그렇지 않으면 동일합니다.


2

Stax , 12 바이트

îu¬@Y≤ÅÉÑ(πε

실행 및 디버깅

멋진 수학 조판을 수행하는 방법을 모르겠지만 동적 프로그래밍 구성에 의존합니다.

M(0) = 1
M(1) = 1
M(n + 1) = M(n) + sum(M(k) * M(n - k - 1) for k in [0..n-1])


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의 재귀 파이썬 솔루션의 간단한 포트. 요구가 n<1?1:있기 때문에 n<1||만들 것 f(0)반환을 true.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.