Số Catalan


36

Các số Catalan ( OEIS ) là một chuỗi các số tự nhiên thường xuất hiện trong tổ hợp.

Số Catalan thứ n là số từ Dyck (chuỗi cân bằng của dấu ngoặc đơn hoặc dấu ngoặc như [[][]]; được định nghĩa chính thức là một chuỗi sử dụng hai ký tự a và b sao cho bất kỳ chuỗi con nào bắt đầu từ đầu có số ký tự lớn hơn hoặc bằng số gồm b ký tự và toàn bộ chuỗi có cùng số ký tự a và b) với độ dài 2n. Số Catalan thứ n (cho n> = 0) cũng được xác định rõ ràng là:

Bắt đầu từ n = 0, 20 số Catalan đầu tiên là:

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

Thử thách

Viết chương trình hoặc hàm đầy đủ lấy số nguyên n không âm qua STDIN hoặc một phương án thay thế chấp nhận được và xuất ra số Catalan thứ n. Chương trình của bạn phải hoạt động tối thiểu cho đầu vào 0-19.

Tôi / O

Đầu vào

Chương trình của bạn phải lấy đầu vào từ STDIN, đối số chức năng hoặc bất kỳ lựa chọn thay thế nào được chấp nhận cho mỗi bài đăng meta này. Bạn có thể đọc số được nhập dưới dạng số thập phân chuẩn, đại diện đơn nguyên hoặc byte.

  • Nếu (và chỉ nếu) ngôn ngữ của bạn không thể lấy đầu vào từ STDIN hoặc bất kỳ thay thế nào được chấp nhận, nó có thể lấy đầu vào từ một biến mã hóa cứng hoặc tương đương phù hợp trong chương trình.

Đầu ra

Chương trình của bạn phải xuất số Catalan thứ n sang STDOUT, kết quả chức năng hoặc bất kỳ lựa chọn thay thế nào được chấp nhận cho mỗi bài đăng meta này. Bạn có thể xuất số Catalan trong biểu diễn thập phân tiêu chuẩn, biểu diễn đơn hoặc byte.

Đầu ra phải bao gồm số Catalan bị khủng bố, tùy ý theo sau bởi một hoặc nhiều dòng mới. Không thể tạo đầu ra nào khác, ngoại trừ đầu ra không đổi của trình thông dịch ngôn ngữ của bạn không thể bị chặn (chẳng hạn như lời chào, mã màu ANSI hoặc thụt lề).


Đây không phải là tìm ngôn ngữ ngắn nhất. Đây là về việc tìm kiếm chương trình ngắn nhất trong mọi ngôn ngữ. Do đó, tôi sẽ không chấp nhận một câu trả lời.

Trong thử thách này, các ngôn ngữ mới hơn thử thách được chấp nhận miễn là chúng có triển khai. Được phép (và thậm chí được khuyến khích) tự viết trình thông dịch này cho một ngôn ngữ chưa được thực hiện trước đó. Ngoài ra, tất cả các quy tắc tiêu chuẩn của phải được tuân theo. Đệ trình trong hầu hết các ngôn ngữ sẽ được ghi bằng byte trong một mã hóa có sẵn từ trước (thường là UTF-8). Cũng lưu ý rằng các tích hợp để tính số Catalan thứ n được cho phép.

Mục lục

Đoạn trích đoạn ở cuối bài này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


Chúng ta có thể in / trả lại một float chứ không phải là một số nguyên?
Alex A.

@AlexA. Điều này được chấp nhận.
một spaghetto

Sẽ có một thẻ oeis ?
Vi.

1
@Vi. Có một cuộc thảo luận về việc đó một thời gian trước và chúng tôi đã đồng ý rằng oeis là không cần thiết
một spaghetto

@Vi. Đây là bài viết meta: meta.codegolf.stackexchange.com/a/5546/8478 . Đối với một số lý do, bạn có thể thấy các thách thức theo kiểu OEIS khá đáng tin cậy với trình tự và một trong số hoặc lý thuyết số . Cho dù chuỗi đã cho có thực sự nằm trong OEIS hay không, hoàn toàn không liên quan đến thử thách.
Martin Ender

Câu trả lời:


26

C, 78 52 39 34 33 byte

Thậm chí nhiều phép thuật C (cảm ơn xsot):

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

?: là một phần mở rộng GNU .


Lần này bằng cách mở rộng sự tái phát bên dưới (cảm ơn xnor và Thomas Kwa):

một đệ quy khác

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

-(n+1) được thay thế bởi ~n , tương đương trong hai phần bù và tiết kiệm 4 byte.


Một lần nữa như là một chức năng, nhưng lần này khai thác sự tái phát sau đây:

tái phát

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

c(n) đi vào một đệ quy vô hạn cho tiêu cực n , mặc dù nó không liên quan đến thử thách này.


Vì việc gọi một hàm có vẻ như là một sự thay thế chấp nhận được cho I / O của bàn điều khiển:

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

c(n) mất một int và trả lại một int.


Mục gốc:

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

Thay vì trực tiếp tính toán định nghĩa, công thức được viết lại thành:

viết lại

Công thức giả định n >= 2, nhưng mã tài khoản chon = 0n = 1quá.

Trong C lộn xộn ở trên, nkcó vai trò tương tự như trong công thức, trong khic tích lũy sản phẩm. Tất cả các tính toán được thực hiện trong dấu phẩy động bằng cách sử dụng double, điều này hầu như luôn là một ý tưởng tồi, nhưng trong trường hợp này, kết quả là chính xác ít nhất là n = 19, vì vậy nó ổn.

float sẽ tiết kiệm được 1 byte, tiếc là nó không đủ chính xác.


Tôi không thể kiểm tra điều này ngay bây giờ nhưng tôi nghĩ bạn có thể rút ngắn hơn nữa:c(n){return!n?:(4+6./~n)*c(n-1);}
xsot

Cảm ơn @xsot, tôi không biết ?:! Rõ ràng, đó là một phần mở rộng GNU C nhưng tôi nghĩ nó vẫn đủ điều kiện.
Stefano Sanfilippo

23

Thạch , 4 byte

Ḥc÷‘

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

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

Ḥc÷‘    Left argument: z

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

1
"Hook" nghĩa là gì? Làm thế nào để ccó được 2zznhư là đối số của nó?
xnor

@xnor Một hook có nghĩa là các hàm được đánh giá như f (x, g (x)). Khi có một hàm dyadic theo sau là một hàm dyadic khác, trình phân tích cú pháp sẽ đánh giá hàm đầu tiên là một hook.
lirtosiast

5
@Dennis Đó thực sự là 4 byte? Với những ký tự không phải ASCII đó, Mothereff.in/byte-corer nói 9 byte
Luis Mendo

@LuisMendo nó có thể là một bảng mã khác nhau
undergroundmonorail

3
@LuisMendo Jelly sử dụng mặc định mã hóa tùy chỉnh của riêng mình, trong đó mỗi ký tự là một byte đơn. Với UTF-8, mã nguồn thực sự dài 9 byte.
Dennis

11

CJam, 12 byte

ri_2,*e!,\)/

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

Ngoài đầu vào 11, bạn sẽ cần nói với máy ảo Java của mình sử dụng nhiều bộ nhớ hơn. Và tôi thực sự không khuyên bạn nên đi xa hơn 11. Về lý thuyết, nó hoạt động cho bất kỳ N nào, vì CJam sử dụng các số nguyên chính xác tùy ý.

Giải trình

CJam không tích hợp sẵn các hệ số nhị thức và việc tính toán chúng từ ba yếu tố cần rất nhiều byte ... vì vậy chúng ta sẽ phải làm gì đó tốt hơn thế. :)

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.

Điều này thực sự mát mẻ. +1
một spaghetto

Đây là thông minh. Tôi đã thử nó với tính toán các giai thừa. Chỉ mất hai trong số ba thông thường vì hai trong số chúng giống nhau. Nó vẫn sử dụng 17 byte ( ri_2*m!1$m!_*/\)/) trong triển khai của tôi. Điều tốt duy nhất là nó nhanh hơn nhiều. :)
Reto Koradi

11

Toán học, 16 13 byte

CatalanNumber

Được xây dựng, các amirite fellas: /

Phiên bản không dựng sẵn (21 byte):

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

Phiên bản không có nhị thức (25 byte):

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

10

TI-BASIC, 11 byte

(2Ans) nCr Ans/(Ans+1

Thật kỳ lạ, nCr có độ ưu tiên cao hơn phép nhân.


10

Python 3, 33 byte

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

Sử dụng tái phát

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

Trường hợp cơ bản của 0 được xử lý như 0**n or, dừng lại 1khi n==0và đánh giá biểu thức đệ quy ở bên phải. Toán tử bitwise ~n==-n-1rút ngắn mẫu số và lưu trên parens.

Python 3 được sử dụng để phân chia float. Python 2 có thể làm tương tự với một byte nữa để viết 6..


Tại sao không n<1phải là hơn 0**n?
frageum

@feersum Nó trả về Truecho n==0hơn 1. Tất nhiên, True == 1nhưng True is not 1nó in khác nhau. Tôi hy vọng điều này sẽ không được phép. Bạn có biết nếu chúng ta có một phán quyết về điều này?
xnor

Tôi tin rằng nó là tốt. isinstance(True, int) is Truesau tất cả
frageum

2
Tôi nghĩ đó vẫn là iffy trong trường hợp chung và ở đây, nơi thử thách chỉ định đầu ra là một con số hoặc đại diện của nó. Nhưng, lên tới @quartata
xnor

7

J, 8 byte

>:%~]!+:

Đây là một chuyến tàu đơn nguyên; nó sử dụng công thức (2x nCr x) / (x + 1). Hãy thử nó ở đây .


7

pl, 4 byte

☼ç▲÷

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

Giải trình

Trong pl, các hàm lấy các đối số của chúng ra khỏi ngăn xếp và đẩy kết quả trở lại vào ngăn xếp. Thông thường khi không có đủ đối số trên ngăn xếp, hàm sẽ đơn giản thất bại. Tuy nhiên, điều gì đó đặc biệt xảy ra khi số lượng đối số trên ngăn xếp là một trong số các hàm của hàm - biến đầu vào _được thêm vào danh sách đối số:

☼ç▲÷

☼      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

Trong thực tế, đây là mã giả:

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

6

Sesos , 94 86 68 byte

8 byte bằng cách thay đổi giai thừa từ phiên bản 1 sang phiên bản 2.

18 byte bằng cách tính toán n!(n+1)!trong một bước. Lấy cảm hứng chủ yếu từ thuật toán kiểm tra tính nguyên thủy của Dennis .

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

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

Sử dụng công thức a(n) = (2n)! / (n!(n+1)!).

  • The factorial-er: phiên bản 1 (tại chỗ, bộ nhớ không đổi), phiên bản 2 (tại chỗ, bộ nhớ tuyến tính)
  • Số nhân: tại đây (tại chỗ, bộ nhớ không đổi)
  • Dải phân cách: ở đây (không dừng lại nếu không chia hết)

Nhà lắp ráp

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 tương đương

Kịch bản Retina này được sử dụng để tạo tương đương brainfuck. Lưu ý rằng nó chỉ chấp nhận một chữ số làm đối số lệnh và không kiểm tra xem một lệnh có trong các nhận xét hay không.

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


5

Nghiêm túc, 9 byte

,;;u)τ╣E\

Bãi rác Hex:

2c3b3b7529e7b9455c

Dùng thử trực tuyến

Giải trình:

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

Bạn có thể lưu một byte bằng cách khai thác thực tế là các hàng của tam giác Pascal là đối xứng, vì vậy trung tuyến của 2nhàng thứ là C(2n,n). Do đó: ,;u@τ╣║/cho 8 byte.
Mego

Gì? Không phải là 2nCn tối đa của hàng thứ 2 sao?
quintopia

Vâng, và đó cũng là trung vị. Vì vậy, cả hai Msẽ làm việc.
Mego

@Mego Tôi lo lắng về việc bạn thực hiện trung vị nếu một cái gì đó có thể là trung bình và tối đa trong trường hợp danh sách không phải là cùng một số. Nếu bạn có nghĩa là "ở giữa danh sách" thì bạn có thể chọn một tên khác cho nó ...
quintopia

Vâng, đó là giữa danh sách. Đối với các danh sách được sắp xếp, đó là trung bình thống kê điển hình, nhưng đối với các danh sách chưa được sắp xếp, nó chỉ là phần giữa (hoặc trung bình của 2 phần tử ở giữa)
Mego

4

JavaScript (ES6), 24 byte

Dựa trên câu trả lời của Python .

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

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

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.

Tôi nghĩ rằng đây là ngắn nhất nó có thể nhận được, nhưng đề xuất được chào đón!


4

Julia, 23 byte

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

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một số float. Nó sử dụng công thức nhị thức cơ bản. Để gọi nó, đặt tên cho nó, vd f=n->....


4

Matlab, 35 25 byte

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

Octave, 23 byte

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

2
Bạn có thể sử dụng @(n)thay vì chức năng, chức năng ẩn danh là ok.
FryAmTheEggman

Tôi đã thấy một số câu trả lời ở đây trước khi có các biến không gian làm việc được truy cập (ngụ ý rằng chúng đã được đặt bởi người dùng ở nơi khác). Các tập lệnh trong MATLAB / Octave cũng có thể xuất hiện dưới dạng các đoạn đơn giản. Bây giờ tôi đã biến nó thành một chức năng ...
costrom 9/12/2015

1
Bạn có thể loại bỏ thêm 2 byte bằng cách tăng nsau:@(n)nchoosek(2*n,n++)/n
beaker

@beaker cảm ơn vì tiền boa! mặc dù nó chỉ hoạt động trong Octave chứ không phải Matlab, vì vậy tôi đã tách nó ra
costrom 9/12/2015

@costrom Điều đó thật thú vị. Tôi đoán .../++ncũng không hoạt động. : /
cốc


3

Haskell, 27 byte

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

Một công thức đệ quy. Phải có một cách để tiết kiệm ...

Trực tiếp lấy sản phẩm dài hơn 2 byte:

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

Trường hợp mã của bạn đọc từ stdin hoặc viết vào thiết bị xuất chuẩn?
dùng2845840

2
@ user2845840 Hàm là một trong những lựa chọn thay thế được chấp nhận được liên kết đến trong thông số kỹ thuật.
xnor

g(n-1)=> g$n-1lưu một byte. Chỉnh sửa: thực sự điều này không hoạt động vì sau đó công thức được hiểu là (...*g) (n-1).
Phục hồi lại

3

APL Dyalog, 9 byte

+∘1÷⍨⊢!+⍨

Đây là một chuyến tàu đơn nguyên; nó sử dụng công thức (2x nCr x) / (x + 1). Hãy thử trực tuyến tại đây .


3

C, 122 121 119 108 byte

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

I used gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) to compile in a windows cygwin environment. Input comes in on the command line. It's similar to Sherlock9's Python solution but the loops are combined into one to avoid overflow and get output up to the 20th Catalan number (n=19).


1
You can remove the space after the comma in the main definition to save a byte.
Alex A.

Nice, I'll edit the post now
cleblanc

You can save 2 more bytes with char**v rather than char *v[]. (The space before * is not needed, and the types are equivalent.)
Mat

Sure enough, that works great. Thanks Mat
cleblanc

This uses some stuff from the tips page to shorten it. Note though that for Ideone I hardcoded a value for n.
FryAmTheEggman

3

Javagony, 223 bytes

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

Fully expanded:

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 entry doesn't matter - as long as you use an interpreter made before the contest, it's all good and valid.
Addison Crump

Ain't gonna win anyway^^
flawr

It is java, so yeah.
Rɪᴋᴇʀ

1
@Riker Well, it's worse than Java.
Jakob

2

Japt, 16 bytes

Even Mathematica is shorter. :-/

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

Try it online!

Ungolfed and explanation

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

Alternate version, based on the recursive formula:

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

2

Vitsy, 13 Bytes

VV2*FVF/V1+F/
V              Capture the input as a final global variable.
 V             Push it back.
  2*           Multiply it by 2
    F          Factorial.
     VF        Factorial of the input.
       /       Divide the second to top by the first.
        V1+    1+input
           F   Factorial.
            /  Divide.

This is a function in Vitsy. How to make it a program that does this, you ask? Concatenate N. c:

Try it online!


2

Milky Way 1.5.14, 14 bytes

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

Explanation

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

or, alternatively, the much more efficient version:


Milky Way 1.5.14, 22 bytes

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

Explanation

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

Usage

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

2

Clojure/ClojureScript, 53 bytes

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

Clojure can be pretty frustrating to golf in. It's very pithy while still being very readable, but some of the niftier features are really verbose. (inc x) is more idiomatic than (+ x 1) and "feels" more concise, but doesn't actually save characters. And writing chains of operations is nicer as (->> x inc (/ 6) (- 4)), but it's actually longer than just doing it the ugly way.


2

Prolog, 42 bytes

Using recursion is almost always the way to go with Prolog.

Code:

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

Example:

19*X.
X = 1767263190.0

Try it online here


Are you redefining the * symbol here?
Paŭlo Ebermann

@PaŭloEbermann not exactly. I'm defining a new dyadic predicate called *. I can still use the regular arithmetic one. In the program above M*Y is my defined predicate while (4-6/(N+1))*Y is regular multiplication.
Emigna

It's slightly shorter than writing it as p(X,Y):- which is nice for code golf.
Emigna


2

Ceylon, 60 bytes

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

This works up to C30, as Ceylon's Integers are signed 64-bit numbers (C31 has overflow, will be calculated as -4050872099593203).

I don't know if Ceylon has any built-in higher mathematical functions, but then importing the right package would probably longer than just calculating this by foot.

// 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 bytes

numbers::catalan

Edit: Use numbers package builtin.


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