Xuất số chuông thứ n


13

Một số Chuông ( OEIS A000110 ) là số cách để phân vùng một tập hợp của n nhãn yếu tố (riêng biệt). Số chuông 0 được định nghĩa là 1.

Hãy xem xét một số ví dụ (tôi sử dụng dấu ngoặc để biểu thị các tập hợp con và dấu ngoặc cho các phân vùng):

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

nhiều cách để tính toán số Bell và bạn có thể tự do sử dụng bất kỳ số nào trong số đó. Một cách sẽ được mô tả ở đây:

Cách dễ nhất để tính các số Bell là sử dụng một tam giác số giống với tam giác của Pascal cho các hệ số nhị thức. Các số Bell xuất hiện trên các cạnh của tam giác. Bắt đầu với 1, mỗi hàng mới trong tam giác được xây dựng bằng cách lấy mục cuối cùng trong hàng trước làm mục nhập đầu tiên, sau đó đặt từng mục mới cho hàng xóm bên trái của nó cộng với hàng xóm bên trái phía trên của nó:

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

Bạn có thể sử dụng lập chỉ mục 0 hoặc lập chỉ mục 1. Nếu bạn sử dụng lập chỉ mục 0, đầu vào của3 nên xuất 5, nhưng nên xuất 2nếu bạn sử dụng lập chỉ mục 1.

Chương trình của bạn phải hoạt động đến số Chuông thứ 15, xuất ra 1382958545. Về lý thuyết, chương trình của bạn sẽ có thể xử lý số lượng lớn hơn (nói cách khác, không mã hóa cứng các giải pháp). EDIT: Bạn không bắt buộc phải xử lý đầu vào bằng 0 (đối với chỉ mục 0) hoặc 1 (đối với chỉ mục 1) vì nó không được tính theo phương pháp tam giác.

Các trường hợp thử nghiệm (giả sử 0-indexing):

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

Câu trả lời sử dụng phương pháp tích hợp (như BellB [n] trong Ngôn ngữ Wolfram) trực tiếp tạo ra số Bell sẽ không cạnh tranh.

Mã ngắn nhất (tính bằng byte) thắng.


Nếu bạn sử dụng lập chỉ mục 0, một đầu vào 3nên xuất5 Nó sẽ xuất hiện 15, phải không? Và với việc lập chỉ mục 1, nó sẽ xuất ra5
Luis Mendo

Lý do đằng sau đó là đếm số chuông thứ 0 là chỉ số 0 trong chỉ mục 0 và chỉ số 1 trong chỉ mục 1. Cách của bạn có thể rõ ràng hơn, nhưng các câu trả lời hiện có hoạt động như vậy, vì vậy tôi không thể thay đổi nó ngay bây giờ. Tôi mới tham gia trang này vài giờ trước
lận

Nhưng bạn nói rằng với 1 chỉ mục, đầu vào 3nên đầu ra 2. Sau đó, những gì đầu vào sẽ 1cung cấp với 1-indexing?
Luis Mendo

1 -> 1, 2 -> 1, 3 -> 2 (tương ứng với các số Chuông 0, 1 và 2) trái ngược với 0 -> 1, 1 -> 1, 2 -> 2 Có thể tôi đang sử dụng sai thuật ngữ
lận

Tôi nghĩ rằng tôi nhận được nó. Cái đầu tiên bị thiếu trong bảng ví dụ và đầu ra của bạn, khiến tôi bối rối
Luis Mendo

Câu trả lời:


2

Thạch , 9 byte

ṖµṀcæ.߀‘

Điều này sử dụng công thức

công thức

được đóng bất cứ khi nào n <2 .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ṖµṀ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

JavaScript (ES6), 47 byte

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

Đầu tiên là 0 chỉ mục, thứ hai là 1 chỉ mục.





3

Thạch , 14 12 11 byte

ṫ0;⁸+\
1Ç¡Ḣ

Hãy thử trực tuyến!

Không chính xác đạt điểm mạnh của Jelly với đầu vào động ¡, luôn sửa đổi mảng và thiếu nguyên tử chuẩn bị (một byte ;@hoặc đảo ngược- ).


3

CJam (19 byte)

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

Bản demo trực tuyến

Mổ xẻ

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 byte

:dtEw1Zh1Ze/Yo

Đầu vào là 0 dựa trên. Hãy thử trực tuyến!

Giải trình

Điều này sử dụng công thức

nhập mô tả hình ảnh ở đây

Trong đó p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) là hàm siêu bội tổng quát .

:      % 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

Python , 42 byte

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

Hãy thử trực tuyến!

Công thức đệ quy xuất phát từ việc đặt ncác phần tử vào các phân vùng. Đối với từng yếu tố lần lượt, chúng tôi quyết định có đặt nó không:

  • Trong một phân vùng hiện có, trong đó có các klựa chọn
  • Để bắt đầu một phân vùng mới, làm tăng số lượng lựa chọn kcho các yếu tố trong tương lai

Một trong hai cách làm giảm số lượng nphần tử còn lại để đặt. Vì vậy, chúng tôi có công thức đệ quy f(n,k)=k*f(n-1,k)+f(n-1,k+1)f(0,k)=1, với f(n,0)số Bell thứ n.


2

Python 2 , 91 byte

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

Hãy thử trực tuyến!

B (n) được tính bằng tổng số Stirling của loại thứ hai.


Đó là một giải pháp tốt. Lưu ý rằng việc sử dụng một số Stirling tích hợp của loại thứ hai sẽ được phép tính các số Chuông (nếu sử dụng Mathicala hoặc tương tự)
lận vào

Bạn có thể lưu hai byte trực tiếp theo định nghĩa s: vì các cuộc gọi đệ quy luôn giảm nvà không có sự phân chia nào của kbạn có thể mất *ktrong nhiệm kỳ đầu tiên.
Peter Taylor

Hoặc bạn có thể lưu một bó bằng cách làm phẳng thành một lambda, làm việc trên toàn bộ các hàng: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

vì chức năng của bạn Bkhông được đệ quy và đó là câu trả lời cuối cùng của bạn, bạn có thể bỏ qua B=để lưu 2 byte
Felipe Nardi Batista

2

MATLAB, 128 103 byte

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)

Khá tự giải thích. Bỏ dấu chấm phẩy ở cuối dòng in kết quả.

25 byte được lưu nhờ Luis Mendo.




2

, 15 byte

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

Hãy thử trực tuyến!

Sử dụng forumla của Dobinski (thậm chí hoạt động cho B (0) yay ).

Giải trình

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

Python (79 byte)

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]

Bản demo trực tuyến trong Python 2, nhưng nó cũng hoạt động trong Python 3.

Điều này xây dựng tam giác của Aitken bằng cách sử dụng lambda đệ quy cho một vòng golf.



1

J, 17 byte

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

Sử dụng phương pháp tính tam giác.

Hãy thử trực tuyến!

Giải trình

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

Python 3 , 78 byte

from math import*
f=lambda n:ceil(sum(k**n/e/factorial(k)for k in range(2*n)))

Tôi quyết định thử và đi một con đường khác để tính toán. Công cụ này sử dụng công thức của Dobinski, được lập chỉ mục 0, không hoạt động cho 0.

Hãy thử trực tuyến!


1
vì chức năng của bạn fkhông được đệ quy, bạn có thể bỏ qua f=lưu 2 byte
Felipe Nardi Batista

1

Con trăn 3 , 68 60 byte

Xây dựng đệ quy đơn giản của tam giác, nhưng nó cực kỳ không hiệu quả cho các mục đích thực tế. Tính toán đến số Chuông thứ 15 khiến TIO hết thời gian, nhưng nó hoạt động trên máy của tôi.

Điều này sử dụng lập chỉ mục 1 và trả về Truethay vì 1.

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

Hãy thử trực tuyến!


Cảm ơn @FelipeNardiBatista vì đã lưu 8 byte!


60 byte . booleans trả về thay vì số (0,1) được chấp nhận ở trăn
Felipe Nardi Batista


1

Alice , 22 byte

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

Hãy thử trực tuyến!

Điều này sử dụng phương pháp tam giác. Với n = 0, điều này sẽ tính B (1) thay vào đó, thuận tiện bằng B (0).

Giải trình

Đây là một mẫu tiêu chuẩn cho các chương trình lấy đầu vào ở chế độ thứ tự, xử lý nó ở chế độ chính và xuất kết quả ở chế độ thứ tự. Một1 đã được thêm vào mẫu để đặt giá trị đó vào ngăn xếp bên dưới đầu vào.

Chương trình sử dụng ngăn xếp như một hàng đợi tròn mở rộng để tính toán từng hàng của tam giác. Trong mỗi lần lặp qua lần đầu tiên, một số 0 ẩn dưới ngăn xếp sẽ trở thành số không rõ ràng.

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

Lặp lại đầu tiên có hiệu quả giả định độ sâu ngăn xếp ban đầu bằng 0, mặc dù yêu cầu 1 ở đầu ngăn xếp. Kết quả là, 1 kết thúc được thêm vào chính nó và toàn bộ tam giác được nhân với 2. Chia kết quả cuối cùng cho 2 cho câu trả lời đúng.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.