หมายเลขคาตาลัน


36

หมายเลขคาตาลัน ( OEIS ) มีลำดับของตัวเลขธรรมชาติมักจะปรากฏใน combinatorics

หมายเลขคาตาลันที่ n คือจำนวนคำ Dyck (สตริงที่สมดุลของวงเล็บหรือวงเล็บเช่น[[][]]; กำหนดอย่างเป็นทางการเป็นสตริงโดยใช้อักขระสองตัวคือ a และ b เช่นว่าสตริงย่อยใด ๆ ที่เริ่มต้นจากจุดเริ่มต้นมีจำนวนอักขระมากกว่าหรือเท่ากับตัวเลข อักขระ b และสตริงทั้งหมดมีจำนวนอักขระ a และ b เท่ากัน) ที่มีความยาว 2n หมายเลขคาตาลันที่ n (สำหรับ n> = 0) ถูกกำหนดอย่างชัดเจนด้วยเช่น:

เริ่มต้นจาก n = 0 หมายเลข 20 คาตาลันแรกคือ:

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

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่รับจำนวนเต็ม n ที่ไม่เป็นลบผ่านทาง STDIN หรือทางเลือกที่ยอมรับได้และส่งออกหมายเลขคาตาลันที่ n โปรแกรมของคุณจะต้องทำงานอย่างน้อยที่สุดสำหรับอินพุต 0-19

I / O

อินพุต

โปรแกรมของคุณต้องรับอินพุตจาก STDIN อาร์กิวเมนต์ของฟังก์ชันหรือตัวเลือกใด ๆ ที่ยอมรับได้สำหรับเมตาโพสต์นี้ คุณสามารถอ่านตัวเลขที่ป้อนเข้าเป็นการแทนทศนิยมมาตรฐานการแทนค่าแบบยูนารีหรือไบต์

  • หาก (และเฉพาะในกรณี) ภาษาของคุณไม่สามารถรับข้อมูลจาก STDIN หรือทางเลือกที่ยอมรับได้มันอาจรับข้อมูลจากตัวแปร hardcoded หรือเทียบเท่าที่เหมาะสมในโปรแกรม

เอาท์พุต

โปรแกรมของคุณจะต้องส่งออกหมายเลขคาตาลันที่ n ไปยัง STDOUT ผลการทำงานหรือตัวเลือกที่ยอมรับได้ต่อเมตาโพสต์นี้ คุณสามารถส่งออกหมายเลขคาตาลันในการแทนทศนิยมมาตรฐานการเป็นตัวแทนเอกหรือไบต์

ผลลัพธ์ควรประกอบด้วยหมายเลขคาตาลันที่น่ากลัวตามด้วยตัวเลือกตามด้วยบรรทัดใหม่อย่างน้อยหนึ่งบรรทัด ไม่สามารถสร้างเอาต์พุตอื่นได้ยกเว้นเอาท์พุทคงที่ของล่ามภาษาของคุณที่ไม่สามารถระงับได้ (เช่นคำทักทายรหัสสี ANSI หรือการเยื้อง)


นี่ไม่เกี่ยวกับการค้นหาภาษาที่สั้นที่สุด นี่คือการค้นหาโปรแกรมที่สั้นที่สุดในทุกภาษา ดังนั้นฉันจะไม่ยอมรับคำตอบ

ในความท้าทายนี้ภาษาที่ใหม่กว่าความท้าทายจะยอมรับได้ตราบใดที่มีการใช้งาน ได้รับอนุญาต (และสนับสนุนให้) เขียนล่ามนี้ด้วยตัวคุณเองสำหรับภาษาที่ยังไม่ได้ใช้งานมาก่อน นอกจากนั้นต้องปฏิบัติตามกฎมาตรฐานทั้งหมดของการส่งในภาษาส่วนใหญ่จะได้คะแนนเป็นไบต์ในการเข้ารหัสที่มีมาก่อน (ปกติคือ UTF-8) โปรดทราบว่าอนุญาตให้ใช้บิวด์อินเพื่อคำนวณหมายเลขคาตาลันที่ n

แค็ตตาล็อก

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

คุณสามารถทำให้ชื่อภาษาเป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

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


เราสามารถพิมพ์ / คืนค่าทศนิยมแทนที่จะเป็นจำนวนเต็มได้หรือไม่?
Alex A.

@AlexA นี่เป็นที่ยอมรับ
สปาเก็ตตี้

จะมีแท็กoeisไหม?
วิ

1
@Vi มีการอภิปรายเกี่ยวกับเมตาดาต้าสักครู่แล้วและเราเห็นพ้องต้องกันว่าoeisนั้นไม่จำเป็น
สปาเก็ตตี

@Vi นี่คือการโพสต์เมตา: meta.codegolf.stackexchange.com/a/5546/8478 สำหรับเหตุผลบางอย่างที่คุณสามารถค้นหาความท้าทาย OEIS สไตล์ค่อนข้างน่าเชื่อถือกับลำดับและเป็นหนึ่งในจำนวนหรือจำนวนทฤษฎี ไม่ว่าจะเป็นลำดับที่แท้จริงอยู่ใน OEIS หรือไม่นั้นไม่เกี่ยวข้องกับความท้าทายอย่างสมบูรณ์
Martin Ender

คำตอบ:


26

C, 78 52 39 34 33 ไบต์

เวทมนตร์ C มากยิ่งขึ้น (ขอบคุณ xsot):

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

?: เป็นส่วนขยายของ GNU


เวลานี้โดยขยายการเกิดซ้ำด้านล่าง (ขอบคุณ xnor และ Thomas Kwa):

ยังเรียกซ้ำอีก

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

-(n+1)จะถูกแทนที่ด้วย~nซึ่งเทียบเท่ากับส่วนเติมเต็มของสองและบันทึก 4 ไบต์


เป็นฟังก์ชันอีกครั้ง แต่คราวนี้ใช้ประโยชน์จากการเกิดซ้ำดังต่อไปนี้:

การกลับ

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

c(n)ป้อนการสอบถามซ้ำแบบไม่มีที่สิ้นสุดสำหรับค่าลบnแม้ว่าจะไม่เกี่ยวข้องกับความท้าทายนี้


เนื่องจากการเรียกใช้ฟังก์ชันดูเหมือนเป็นทางเลือกที่ยอมรับได้สำหรับคอนโซล I / O:

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

c(n)ใช้เวลาและการส่งกลับintint


ข้อความต้นฉบับ:

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

แทนที่จะคำนวณคำจำกัดความโดยตรงสูตรจะถูกเขียนใหม่เป็น:

เขียน

สูตรสันนิษฐานว่าn >= 2แต่รหัสบัญชีสำหรับn = 0และn = 1เกินไป

ในระเบียบ C ข้างต้นnและkมีบทบาทเช่นเดียวกับในสูตรในขณะที่cสะสมผลิตภัณฑ์ การคำนวณทั้งหมดดำเนินการโดยใช้จุดลอยตัวdoubleซึ่งเกือบจะเป็นความคิดที่ไม่ดีเสมอไป แต่ในกรณีนี้ผลลัพธ์ถูกต้องสูงสุดถึง n = 19 อย่างน้อยมันก็โอเค

float น่าจะบันทึกได้ 1 ไบต์ แต่น่าเสียดายที่มันไม่แม่นยำพอ


ฉันไม่สามารถทดสอบได้ในตอนนี้ แต่ฉันคิดว่าคุณสามารถย่อให้สั้นลงได้อีก:c(n){return!n?:(4+6./~n)*c(n-1);}
xsot

ขอบคุณ @ xsot ฉันไม่รู้?:! เห็นได้ชัดว่ามันเป็นส่วนขยาย GNU C แต่ฉันคิดว่ามันยังคงมีคุณสมบัติ
Stefano Sanfilippo

23

เยลลี่ขนาด 4 ไบต์

Ḥc÷‘

ลองออนไลน์!

มันทำงานอย่างไร

Ḥc÷‘    Left argument: z

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

1
"hook" หมายถึงอะไรได้อย่างไรและcได้รับเป็นข้อโต้แย้งอย่างไร2zz
xnor

@xnor A hook หมายถึงฟังก์ชั่นที่ประเมินเช่น f (x, g (x)) เมื่อมีฟังก์ชัน dyadic ตามด้วยฟังก์ชัน dyadic อื่นโปรแกรมวิเคราะห์คำจะประเมินค่าฟังก์ชันแรกเป็นตะขอ
lirtosiast

5
@Dennis นั่นคือ 4 ไบต์จริงเหรอ? ด้วยอักขระที่ไม่ใช่ ASCII นั้นmothereff.in/byte-counterพูดว่า 9 bytes
Luis Mendo

@ LuisMendo อาจเป็นรหัสที่แตกต่างกัน
undergroundmonorail

3
@LuisMendo Jelly ใช้ค่าเริ่มต้นการเข้ารหัสที่กำหนดเองโดยที่อักขระแต่ละตัวเป็นไบต์เดียว ด้วย UTF-8 ซอร์สโค้ดมีความยาว 9 ไบต์
Dennis

11

CJam, 12 ไบต์

ri_2,*e!,\)/

ลองออนไลน์

นอกเหนือจากอินพุต 11 คุณจะต้องแจ้งให้ Java VM ของคุณใช้หน่วยความจำเพิ่มเติม และฉันจะไม่แนะนำให้ไปมากไปกว่า 11 ในทางทฤษฎีมันใช้ได้กับ N ใด ๆ เนื่องจาก CJam ใช้จำนวนเต็มความแม่นยำโดยพลการ

คำอธิบาย

CJam ไม่มีค่าสัมประสิทธิ์ทวินามในตัวและการคำนวณจากสามแฟคทอเรียลนั้นใช้เวลานานหลายไบต์ ... ดังนั้นเราจะต้องทำอะไรที่ดีกว่านั้น :)

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.

นี่มันเจ๋งจริงๆ +1
ปาเก็ตตี้

นี่คือฉลาด ฉันลองด้วยการคำนวณแฟคทอเรียล ใช้เวลาเพียงสองในสามปกติเนื่องจากทั้งสองจะเหมือนกัน มันยังคงใช้ 17 ไบต์ ( ri_2*m!1$m!_*/\)/) ในการใช้งานของฉัน สิ่งเดียวที่ดีคือมันเร็วกว่ามาก :)
Reto Koradi

11

Mathematica, 16 13 ไบต์

CatalanNumber

บิวด์อิน

รุ่นที่ไม่ได้สร้างขึ้น (21 ไบต์):

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

รุ่น binomial-less (25 ไบต์):

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


10

Python 3, 33 ไบต์

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

ใช้การเกิดซ้ำ

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

กรณีพื้นฐานของ 0 จะถูกจัดการเป็น0**n orซึ่งจะหยุด1เมื่อใดn==0และประเมินการแสดงออกเวียนซ้ำทางด้านขวา ผู้ประกอบการระดับบิต~n==-n-1จะทำให้ตัวส่วนสั้นลงและประหยัดค่า parens

Python 3 ใช้สำหรับการแบ่งส่วนแบบลอย งูหลาม 2 6.สามารถทำเช่นเดียวกันกับอีกหนึ่งไบต์ในการเขียน


ทำไมไม่n<1มากกว่า0**n?
feersum

@feersum ก็จะส่งกลับTrueสำหรับมากกว่าn==0 1แน่นอนTrue == 1แต่True is not 1และมันพิมพ์ต่างออกไป ฉันคาดหวังว่าสิ่งนี้จะไม่ได้รับอนุญาต คุณรู้หรือไม่ว่าเรามีคดีนี้?
xnor

ฉันเชื่อว่ามันดี isinstance(True, int) is Trueหลังจากนั้น.
feersum

2
ฉันคิดว่ามันยังคงไม่แน่นอนในกรณีทั่วไปและ moreso ที่นี่ซึ่งความท้าทายระบุผลลัพธ์เป็นตัวเลขหรือการแสดง แต่ถึง @quartata
xnor

7

J, 8 ไบต์

>:%~]!+:

นี่คือรถไฟขบวนเดียว มันใช้สูตร (2x nCr x) / (x + 1) ลองมันนี่


7

pl, 4 ไบต์

☼ç▲÷

ลองออนไลน์

คำอธิบาย

ใน PL ฟังก์ชั่นจะเอาอาร์กิวเมนต์ออกจากสแต็กและส่งผลลัพธ์กลับไปยังสแต็ก โดยปกติเมื่อมีอาร์กิวเมนต์ไม่เพียงพอบนสแต็กฟังก์ชันจะล้มเหลวอย่างเงียบ ๆ อย่างไรก็ตามมีบางสิ่งที่พิเศษเกิดขึ้นเมื่อจำนวนอาร์กิวเมนต์บนสแต็กเป็นหนึ่งจาก arity ของฟังก์ชัน - ตัวแปรอินพุต_ถูกเพิ่มเข้าในรายการอาร์กิวเมนต์:

☼ç▲÷

☼      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

ผลก็คือนี่คือ pseudocode:

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

6

Sesos , 94 86 68 ไบต์

8 ไบต์โดยเปลี่ยน factorial-er จากเวอร์ชัน 1 เป็นเวอร์ชัน 2

18 ไบต์โดยการคำนวณn!(n+1)!ในขั้นตอนเดียว แรงบันดาลใจส่วนใหญ่มาจากอัลกอริทึมการทดสอบแบบดั้งเดิมของเดนนิส

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

ลองออนไลน์!

a(n) = (2n)! / (n!(n+1)!)ใช้สูตร

  • แฟคทอเรียลเอ้อ: รุ่น 1 (แทนที่, หน่วยความจำคงที่), รุ่น 2 (แทนที่, หน่วยความจำเชิงเส้น)
  • ตัวคูณ: ที่นี่ (ในสถานที่หน่วยความจำคงที่)
  • ตัวแบ่ง: ที่นี่ (ไม่หยุดถ้าไม่หาร)

ผู้ประกอบ

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 เทียบเท่า

สคริปต์ Retinaนี้ใช้เพื่อสร้างสิ่งที่เทียบเท่ากับ brainfuck โปรดทราบว่ามันยอมรับเพียงหนึ่งหลักเป็นอาร์กิวเมนต์คำสั่งและไม่ตรวจสอบว่าคำสั่งอยู่ในความคิดเห็น

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


5

อย่างจริงจัง 9 ไบต์

,;;u)τ╣E\

ฐานสิบหก:

2c3b3b7529e7b9455c

ลองออนไลน์

คำอธิบาย:

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

คุณสามารถบันทึกไบต์โดยการใช้ประโยชน์จากความจริงที่ว่าแถวของสามเหลี่ยมปาสคาลที่มีสมมาตรดังนั้นค่ามัธยฐานของ2nแถว TH C(2n,n)คือ ดังนั้น: ,;u@τ╣║/สำหรับ 8 ไบต์
Mego

อะไร? ไม่ใช่ 2nCn สูงสุดของแถวที่ 2 หรือไม่
quintopia

ใช่และมันก็เป็นค่ามัธยฐาน ดังนั้นทั้งสองและMจะทำงาน
Mego

@Mego ฉันกังวลเกี่ยวกับการใช้งานค่ามัธยฐานของคุณหากบางสิ่งอาจเป็นค่ามัธยฐานและค่าสูงสุดในกรณีที่รายการไม่ได้เป็นจำนวนเดียวกันทั้งหมด ถ้าคุณหมายถึง "ในช่วงกลางของรายการ" แล้วคุณอาจเลือกชื่อที่แตกต่างกันมัน ...
quintopia

ใช่มันอยู่ตรงกลางของรายการ สำหรับรายการที่เรียงลำดับแล้วมันเป็นค่ามัธยฐานทางสถิติทั่วไป แต่สำหรับรายการที่ไม่เรียงลำดับมันเป็นแค่ตรงกลาง (หรือค่าเฉลี่ยขององค์ประกอบกลาง 2 ตัว)
Mego

4

JavaScript (ES6), 24 ไบต์

ขึ้นอยู่กับคำตอบของงูหลาม

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

มันทำงานอย่างไร

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.

ฉันคิดว่านี่สั้นที่สุดที่จะได้รับ แต่ยินดีต้อนรับคำแนะนำ!


4

Julia, 23 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่รับจำนวนเต็มและส่งคืนค่าทศนิยม มันใช้สูตรทวินามพื้นฐาน f=n->...เรียกว่าให้มันชื่อเช่น


4

Matlab, 35 25 ไบต์

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

อ็อกเทฟ 23 ไบต์

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

2
คุณสามารถใช้@(n)แทนฟังก์ชั่นฟังก์ชั่นที่ไม่ระบุชื่อก็โอเค
FryAmTheEggman

ฉันเห็นคำตอบหลายข้อก่อนหน้านี้ว่ามีการเข้าถึงตัวแปรพื้นที่ทำงาน (หมายความว่าผู้ใช้อื่นถูกตั้งค่าไว้แล้ว) สคริปต์ใน MATLAB / Octave ยังสามารถปรากฏเป็นตัวอย่างง่ายๆได้ ฉันได้ทำให้มันกลายเป็นฟังก์ชั่นใหม่ตอนนี้ ...
costrom

1
คุณสามารถปิดเพิ่มเติมอีก 2 ไบต์โดยการเพิ่มภายหลังn:@(n)nchoosek(2*n,n++)/n
บีกเกอร์

@beaker ขอบคุณสำหรับเคล็ดลับ! มันใช้งานได้ใน Octave เท่านั้นไม่ใช่ Matlab ดังนั้นฉันจึงแยกมันออกจากกัน
costrom

@costrom นั่นน่าสนใจ ฉันเดาว่า.../++nไม่ทำงานเช่นกัน : /
บีกเกอร์

4

𝔼𝕊𝕄𝕚𝕟, 3 ตัวอักษร / 6 ไบต์

Мƅï

Try it here (Firefox only).

Builtins ftw! ดีใจมากที่ฉันติดตั้ง math.js ตั้งแต่ต้น

โบนัสทางออก 12 ตัวอักษร / 19 ไบต์

Мơ 2*ï,ï)/⧺ï

Try it here (Firefox only).

เฮลโล! 19 ไบต์!

ประเมินเป็นหลอก ES6 เป็น:

nchoosek(2*input,input)/(input+1)

3

Haskell, 27 ไบต์

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

สูตรเรียกซ้ำ จะต้องมีวิธีการประหยัด parens ...

การถ่ายผลิตภัณฑ์โดยตรงมีความยาว 2 ไบต์:

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

รหัสของคุณอ่านจาก stdin หรือเขียนถึง stdout ที่ไหน
2845840

2
@ user2845840 ฟังก์ชั่นเป็นหนึ่งในตัวเลือกที่ยอมรับได้ซึ่งเชื่อมโยงกับข้อมูลจำเพาะ
xnor

g(n-1)=> g$n-1บันทึกหนึ่งไบต์ แก้ไข: (...*g) (n-1)จริงนี้ไม่ได้ทำงานแล้วเพราะสูตรถูกตีความว่าเป็น
ความลับของโซโลมอนอฟ

3

Dyalog APL ขนาด 9 ไบต์

+∘1÷⍨⊢!+⍨

นี่คือรถไฟขบวนเดียว มันใช้สูตร (2x nCr x) / (x + 1) ลองออนไลน์ได้ที่นี่


3

C, 122 121 119 108 ไบต์

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

ฉันใช้ gcc (GCC) 3.4.4 (พิเศษ cygming, gdc 0.12 โดยใช้ dmd 0.125) เพื่อรวบรวมในสภาพแวดล้อม windows cygwin อินพุตเข้ามาในบรรทัดคำสั่ง มันคล้ายกับโซลูชัน Python ของ Sherlock9 แต่มีการรวมลูปเข้าด้วยกันเพื่อหลีกเลี่ยงการโอเวอร์โฟลว์และรับเอาท์พุทได้ถึงหมายเลขคาตาลันที่ 20 (n = 19)


1
คุณสามารถลบช่องว่างหลังเครื่องหมายจุลภาคในmainคำนิยามเพื่อบันทึกไบต์
Alex A.

ดีฉันจะแก้ไขโพสต์ตอนนี้
cleblanc

คุณสามารถบันทึก 2 ไบต์มากขึ้นด้วยมากกว่าchar**v char *v[](พื้นที่ก่อนที่จะ*ไม่จำเป็นต้องใช้และประเภทที่มีเทียบเท่า.)
จ้า

แน่นอนว่าใช้งานได้ดี ขอขอบคุณ Mat
cleblanc

สิ่งนี้ใช้บางสิ่งจากหน้าคำแนะนำเพื่อย่อให้สั้นลง หมายเหตุแม้ว่าว่าสำหรับ Ideone ฉัน hardcoded nค่าสำหรับ
FryAmTheEggman

3

Javagonyขนาด 223 ไบต์

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

ขยายอย่างเต็มที่:

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 ไม่สำคัญ - ตราบใดที่คุณใช้ล่ามที่ทำขึ้นก่อนการแข่งขันทุกอย่างดีและถูกต้อง
Addison Crump

จะไม่ชนะอีกเลย ^^
ข้อผิดพลาด

มันเป็นจาวาดังนั้นใช่
Rɪᴋᴇʀ

1
@Riker มันแย่กว่า Java
จา

2

Japt, 16 ไบต์

แม้แต่ Mathematica ก็สั้นกว่า :-/

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

ลองออนไลน์!

Ungolfed และคำอธิบาย

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

รุ่นสำรองขึ้นอยู่กับสูตรแบบเรียกซ้ำ:

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

2

Vitsyขนาด 13 ไบต์

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.

นี้เป็นฟังก์ชั่นในVitsy คุณจะทำอย่างไรให้เป็นโปรแกรมที่ทำสิ่งนี้ เรียงNต่อกัน C:

ลองออนไลน์!


2

ทางช้างเผือก 1.5.14 , 14 ไบต์

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

คำอธิบาย

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

หรือผลัดที่มากรุ่นที่มีประสิทธิภาพมากขึ้น:


ทางช้างเผือก 1.5.14 , 22 ไบต์

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

คำอธิบาย

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

การใช้

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

2

Clojure / ClojureScript, 53 ไบต์

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

Clojure ค่อนข้างน่าหงุดหงิดกับการเล่นกอล์ฟค่ะมันมีสาระสำคัญมากในขณะที่ยังอ่านได้ง่าย (inc x)มีสำนวนมากกว่า(+ x 1)และ "รู้สึก" รัดกุมมากกว่า แต่จริงๆแล้วจะไม่บันทึกตัวละคร และการเขียนกลุ่มปฏิบัติการก็ดีกว่า(->> x inc (/ 6) (- 4))แต่จริงๆแล้วมันนานกว่าการทำแบบน่าเกลียด


2

Prolog ขนาด 42 ไบต์

การใช้การเรียกซ้ำเป็นวิธีที่จะไปกับ Prolog เกือบตลอดเวลา

รหัส:

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

ตัวอย่าง:

19*X.
X = 1767263190.0

ลองออนไลน์ได้ที่นี่


คุณกำลังกำหนด*สัญลักษณ์ใหม่ที่นี่หรือไม่
Paŭlo Ebermann

@ PaŭloEbermannไม่ถูกต้อง ฉันกำลังกำหนดเพรดิเคตใหม่ที่เรียกว่า * ฉันยังคงสามารถใช้เลขคณิตปกติได้ ในโปรแกรมด้านบน M * Y เป็นคำกริยาที่กำหนดไว้ของฉันในขณะที่ (4-6 / (N + 1)) * Y เป็นการคูณปกติ
Emigna

มันสั้นกว่าการเขียนเล็กน้อยในฐานะ p (X, Y): - ซึ่งเหมาะสำหรับการตีกอล์ฟ
Emigna


2

Ceylon, 60 ไบต์

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

ใช้งานได้ถึง C 30เนื่องจาก Integers ของ Ceylon ลงนามหมายเลข 64 บิต (C 31มีจำนวนมากเกินจะถูกคำนวณเป็น -4050872099593203)

ฉันไม่รู้ว่า Ceylon มีฟังก์ชันทางคณิตศาสตร์ในตัวที่สูงขึ้นหรือไม่ แต่การนำเข้าแพ็คเกจที่ถูกต้องอาจนานกว่าการคำนวณด้วยการเดินเท้า

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

05AB1E , 6 ไบต์

Dxcr>/

คำอธิบาย:

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 ไบต์

ไม่ใช้แพคเกจนานกว่าคำตอบก่อนหน้าเล็กน้อย

choose(2*(n=scan()),n)/(n+1)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.