n 번째 벨 번호 출력


13

벨 번호 ( OEIS는 A000110 ) N 표지 (구별) 요소의 세트를 분할하는 방법의 수이다. 0 번째 벨 번호는 1로 정의됩니다.

몇 가지 예를 살펴 보겠습니다 (대괄호를 사용하여 파티션의 하위 집합과 중괄호를 나타냅니다).

1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}

벨 번호를 계산하는 방법 에는 여러 가지 가 있으며 중 어느 것도 자유롭게 사용할 수 있습니다. 한 가지 방법은 다음과 같습니다.

벨 수를 계산하는 가장 쉬운 방법은 이항 계수에 파스칼의 삼각형과 유사한 숫자 삼각형을 사용하는 것입니다. 종의 숫자는 삼각형의 가장자리에 나타납니다. 1부터 시작하여 삼각형의 각 새 행은 이전 행의 마지막 항목을 첫 번째 항목으로 사용한 다음 각 새 항목을 왼쪽 이웃과 왼쪽 위 이웃으로 설정하여 구성됩니다.

1
1    2
2    3    5
5    7   10   15
15  20   27   37   52

0 인덱싱 또는 1 인덱싱을 사용할 수 있습니다. 0 인덱싱을 사용하는 경우 입력은 3should 출력 5이지만 21 인덱싱을 사용하는 경우 출력해야 합니다.

프로그램은 15 번째 벨 번호까지 작동해야합니다 1382958545. 이론적으로 프로그램은 더 큰 숫자를 처리 할 수 ​​있어야합니다 (즉, 솔루션을 하드 코딩하지 마십시오). 편집 : 삼각형 방법으로 계산되지 않으므로 0 (0 인덱싱) 또는 1 (1 인덱싱)의 입력을 처리 할 필요가 없습니다.

테스트 사례 (0- 인덱싱 가정) :

0 ->  1 (OPTIONAL)
1 ->  1 
2 ->  2 
3 ->  5 
4 ->  15 
5 ->  52 
6 ->  203 
7 ->  877 
8 ->  4140 
9 ->  21147 
10 -> 115975 
11 -> 678570 
12 -> 4213597 
13 -> 27644437 
14 -> 190899322 
15 -> 1382958545

Bell 번호를 직접 생성하는 내장 방법 (예 : Wolfram 언어의 BellB [n])을 사용하는 답변은 경쟁이되지 않습니다.

가장 짧은 코드 (바이트)가 이깁니다.


당신이 0 인덱싱을 사용하는 경우의 입력 3SHOULD 출력5 이 OUPUT 것 15오른쪽? 그리고 1- 인덱싱으로 출력됩니다5
Luis Mendo

그 이유는 0- 인덱싱에서는 인덱스 0으로, 0- 인덱싱에서는 인덱스 1로 0 번째 벨 번호를 계산하는 것이 었습니다. 당신의 길은 더 명확 할 수도 있지만 기존 답변은 그렇게 작동하므로 지금 변경할 수 없습니다. 난 그냥 몇 시간 전에이 사이트에 가입
리깅

그러나 1 인덱싱을 사용하면 input 3이 출력되어야 한다고 말합니다 2. 그렇다면 입력 1은 1 인덱싱으로 무엇을 줄 것 입니까?
루이스 멘도

0-> 1, 1-> 1, 2-> 2와 달리 1-> 1, 2-> 1, 3-> 2 (0, 1 및 2 벨 번호에 해당) 2 잘못 사용하고 있습니다. 용어
리깅

나는 그것을 얻는 것 같아요. 첫 번째 1은 예제 테이블과 출력에서 ​​누락되어 혼란 스럽습니다.
Luis Mendo

답변:


2

젤리 , 9 바이트

ṖµṀcæ.߀‘

이것은 공식을 사용합니다

공식

n <2 일 때마다 닫힙니다 .

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

작동 원리

ṖµṀcæ.߀‘  Main link. Argument: n

Ṗ          Pop; yield A := [1, ..., n-1].
 µ         Begin a new, monadic chain with argument A.
  Ṁ        Maximum; yield n-1.
   c       Combinatons; compute (n-1)C(k) for each k in A.
      ߀   Recursively map the main link over A.
    æ.     Take the dot product of the results to both sides.
        ‘  Increment; add 1 to the result.

8

자바 스크립트 (ES6), 47 바이트

f=(n,a=[b=1])=>n--?f(n,[b,...a.map(e=>b+=e)]):b
f=(n,a=[b=1])=>--n?f(n,[b,...a.map(e=>b+=e)]):b

첫 번째는 0 인덱싱되고 두 번째는 1 인덱싱됩니다.


8

하스켈, 36 바이트

head.(iterate(last>>=scanl(+))[1]!!)

삼각형 방법을 사용하여 0, 0 기반을 올바르게 처리합니다.



4

Mathematica, 24 바이트

Sum[k^#/k!,{k,0,∞}]/E&

@Kelly Lowder에서 -13 바이트!


Sum[k^#/k!,{k,0,∞}]/E&24 바이트입니다
Kelly Lowder


3

CJam (19 바이트)

Xa{X\{X+:X}%+}qi*0=

온라인 데모

해부

Xa         e# Start with an array [1]
{          e# Repeat...
  X\       e#   Put a copy of X under the current row
  {X+:X}%  e#   Map over x in row: push (X+=x)
  +        e#   Prepend that copy of last element of the previous row to get the next row
}
qi*        e# ... input() times
0=         e# Select the first element

3

MATL , 14 바이트

:dtEw1Zh1Ze/Yo

입력은 0을 기준으로합니다. 온라인으로 사용해보십시오!

설명

이것은 공식을 사용합니다

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

여기서 p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x )는 일반화 된 초 기하 함수 입니다.

:      % Implictly input n. Push array [1 2 ... n]
d      % Consecutive differences: array [1 ... 1] (n-1 entries)
tE     % Duplicate, multiply by 2: array [2 ... 2] (n-1 entries)
w      % Swap
1      % Push 1
Zh     % Hypergeometric function
1Ze    % Push number e
/      % Divide
Yo     % Round (to prevent numerical precision issues). Implicitly display

3

파이썬 , 42 바이트

f=lambda n,k=0:n<1or k*f(n-1,k)+f(n-1,k+1)

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

재귀 공식은 n요소를 파티션에 배치하는 데 있습니다. 차례로 각 요소에 대해 배치할지 여부를 결정합니다.

  • k선택할 수 있는 기존 파티션으로
  • k미래의 요소에 대한 선택 수가 증가하는 새 파티션을 시작하려면

어느 쪽이든 n배치 할 나머지 요소 수를 줄입니다. 그래서 우리는 재귀 공식을 가지고 f(n,k)=k*f(n-1,k)+f(n-1,k+1)f(0,k)=1함께, f(n,0)n 번째 벨 번호.


2

파이썬 2 , 91 바이트

s=lambda n,k:n*k and k*s(n-1,k)+s(n-1,k-1)or n==k
B=lambda n:sum(s(n,k)for k in range(n+1))

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

B (n)은 두 번째 종류의 스털링 수의 합으로 계산됩니다.


좋은 해결책입니다. 상기 두 번째 종류의 스털링 번호에 대한 내장 사용하여 해당 주 (티카 또는 유사한을 사용하는 경우) 벨 수를 계산하기 위해 허용 될 것입니다
리깅

s재귀 호출은 항상 줄어들고 첫 번째 용어 에서을 잃을 수는 n없기 때문에 정의에 2 바이트를 직접 저장할 수 있습니다 . k*k
피터 테일러

또는 전체 행에서 작업하면서 하나의 람다로 병합하여 무리를 절약 할 수 있습니다.B=lambda n,r=[1,0]:n and B(n-1,[k*r[k]+r[k-1]for k in range(len(r))]+[0])or sum(r)
Peter Taylor

함수 B가 재귀 적이 지 않고 최종 답변이므로 2 바이트B=절약
Felipe Nardi Batista

2

MATLAB, 128103 바이트

function q(z)
r(1,1)=1;for x=2:z
r(x,1)=r(x-1,x-1);for y=2:x
r(x,y)=r(x,y-1)+r(x-1,y-1);end
end
r(z,z)

꽤 자명하다. 줄 끝에서 세미콜론을 생략하면 결과가 인쇄됩니다.

Luis Mendo 덕분에 25 바이트가 절약되었습니다.




2

, 15 바이트

2°M^┼ⁿ^!/Σ;αê/≈

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

Dobinski의 forumla를 사용합니다 (B (0) yay 에서도 작동 ).

설명

2°M^┼ⁿ^!/Σ;αê/≈
2°        ;     # Push 100
  M             # Do 100 times...
   ^             # Push index of current iteration
    ┼ⁿ           # Take that to the power of the user input
      ^!         # Push index factorial
        /        # Divide
         Σ       # Sum stack together
           αê   # Push e (2.718...)
             /  # Divide
              ≈ # Round to nearest integer (Srsly why doesn't 05AB1E have this???)

2

파이썬 (79 바이트)

B=lambda n,r=[1]:n and B(n-1,[r[-1]+sum(r[:i])for i in range(len(r)+1)])or r[0]

Python 2의 온라인 데모 이지만 Python 3에서도 작동합니다.

이것은 골프 루프에 재귀 람다를 사용하여 Aitken의 삼각형을 만듭니다.



1

J, 17 바이트

0{]_1&({+/\@,])1:

삼각형 계산 방법을 사용합니다.

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

설명

0{]_1&({+/\@,])1:  Input: integer n
               1:  The constant 1
  ]                Identity function, get n
   _1&(       )    Call this verb with a fixed left argument of -1 n times
                   on itself starting with a right argument [1]
             ]       Get right argument
       {             Select at index -1 (the last item)
            ,        Join
        +/\@         Find the cumulative sums
0{                 Select at index 0 (the first item)


1

파이썬 3 , 68 60 바이트

삼각형의 단순한 재귀 구조이지만 실제 목적에는 비효율적입니다. 최대 15 번째 벨 번호를 계산하면 TIO가 시간 초과되지만 내 컴퓨터에서 작동합니다.

1- 인덱싱을 사용하고 1 True대신에 반환 합니다.

f=lambda r,c=0:r<1or c<1and f(r-1,r-1)or f(r-1,c-1)+f(r,c-1)

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


8 바이트를 절약 한 @FelipeNardiBatista에게 감사합니다!


60 바이트 . 파이썬에서는 숫자 (0,1) 대신 부울을 반환하는 것이 허용됩니다
Felipe Nardi Batista

1

PHP , 72 바이트

재귀 함수 1- 색인

function f($r,$c=0){return$r?$c?f($r-1,$c-1)+f($r,$c-1):f($r-1,$r-2):1;}

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

PHP , 86 바이트

0 인덱스

for(;$r++<$argn;)for($c=~0;++$c<$r;)$l=$t[$r][$c]=$c?$l+$t[$r-1][$c-1]:($l?:1);echo$l;

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

PHP , 89 바이트

재귀 함수 0 인덱스

function f($r,$s=NULL){$c=$s??$r-1;return$r>1?$c?f($r-1,$c-1)+f($r,$c-1):f($r-1,$r-2):1;}

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


1

Alice , 22 바이트

/oi
\1@/t&wq]&w.q,+k2:

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

이것은 삼각형 방법을 사용합니다. n = 0의 경우, 대신 B (1)을 계산하는데, 이는 편리하게 B (0)과 같습니다.

설명

서수 모드에서 입력을 받고 기수 모드로 처리하고 결과를 서수 모드로 출력하는 프로그램의 표준 템플릿입니다. 1입력 값 아래의 스택에 해당 값을 배치하기 위해 템플릿에 A 가 추가되었습니다.

프로그램은 스택을 확장 원형 대기열로 사용하여 삼각형의 각 행을 계산합니다. 첫 번째를 지난 각 반복 동안 스택 아래의 하나의 암시 적 0은 명시 적 0이됩니다.

1     Append 1 to the implicit empty string on top of the stack
i     Get input n
t&w   Repeat outer loop that many times (push return address n-1 times)
q     Get tape position (initially zero)
]     Move right on tape
&w    On iteration k, push this return address k-1 times
      The following inner loop is run once for each entry in the next row
.     Duplicate top of stack (the last number calculated so far)
q,    Move the entry k spaces down to the top of the stack: this is the appropriate entry
      in the previous row, or (usually) an implicit zero if we're in the first column
+     Add these two numbers
k     Return to pushed address: this statement serves as the end of two loops simultaneously
2:    Divide by two: see below
o     Output as string
@     Terminate

첫 번째 반복은 스택 맨 위에 필요한 1이 있음에도 불구하고 초기 스택 깊이 0을 효과적으로 가정합니다. 결과적으로 1은 그 자체에 더 해지고 삼각형 전체에 2가 곱해집니다. 최종 결과를 2로 나누면 정답이됩니다.


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