เบอร์ Motzkin


30

หมายเลข Motzkin ที่ n คือจำนวนเส้นทางจาก (0, 0) ถึง (n, 0) โดยที่แต่ละขั้นตอนเป็นรูปแบบ (1, -1), (1, 0) หรือ (1, 1) และเส้นทาง ไม่เคยต่ำกว่า y = 0

นี่คือภาพประกอบของเส้นทางเหล่านี้สำหรับ n = 1, 2, 3, 4, จากลิงค์ด้านบน:

ตัวเลข Motzkin

ลำดับที่ต้องการเป็นOEIS A001006 OEIS มีลักษณะของลำดับอื่น ๆ


คุณจะได้รับจำนวนเต็มบวก n เป็นอินพุต คุณควรส่งออกหมายเลข Motzkin ที่ n

นี่คือหมายเลข Motzkin 1 ถึง 10:

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

อนุญาตให้ใช้วิธีการอินพุตและเอาต์พุตมาตรฐานทั้งหมด ช่องโหว่มาตรฐานใช้

นี่คือรหัสกอล์ฟ ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ


หมายเลข Motzkin ขั้นต่ำสุดที่เราต้องสร้างคืออะไร?
Addison Crump


@FlagAsSpam ทั้งหมดมีข้อ จำกัด เกี่ยวกับเวลา / หน่วยความจำ / ประเภทข้อมูล
isaacg

ฉันคิดว่าภาษาต้องการคำ Dyck ที่สร้างขึ้นในขณะนี้
lirtosiast

คำตอบ:


15

MATL , 13 14ไบต์

i-2/t.5+hH4Zh

ตัวอย่าง:

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

แก้ไข (16 มิถุนายน 2017): คุณสามารถลองออนไลน์ได้! โปรดทราบว่าในเวอร์ชันภาษาที่ทันสมัย ​​(ซึ่งภายหลังวันที่ความท้าทายนี้) iอาจถูกลบ

คำอธิบาย

ตรงไปตรงมาสวยใช้ความสมดุล (ดูสมการ (10)) กับฟังก์ชั่น hypergeometric :

ป้อนคำอธิบายรูปภาพที่นี่

จากคำจำกัดความของฟังก์ชัน hypergeometric

ป้อนคำอธิบายรูปภาพที่นี่

เป็นที่ชัดเจนว่าคำสั่งของสองอาร์กิวเมนต์แรกสามารถสลับซึ่งช่วยประหยัดหนึ่งไบต์

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
คำตอบนี้ถูกผูกไว้ให้สั้นที่สุดและแก่กว่าประมาณครึ่งชั่วโมงดังนั้นฉันจึงยอมรับ
isaacg

ขอบคุณ! ฉันแทบจินตนาการไม่ได้ว่า MATL จะผูกกับ Pyth มันเป็นภาษาที่ยากที่จะเอาชนะได้ดีมากที่ออกแบบมัน!
Luis Mendo

11

เรติน่า , 59 58 ไบต์

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

จะเข้าในเอก อินพุต 7 (เช่น1111111) ใช้เวลาสักครู่ แต่ก็ยังเสร็จสมบูรณ์ในเวลาไม่ถึงนาที ฉันจะไม่ไปไกลกว่านั้น

ลองออนไลน์

คำอธิบาย

การจำแนกลักษณะที่แตกต่างกันของตัวเลข Motzkin คือจำนวนสายอักขระสามตัวที่ต่างกันโดยที่สองตัวนั้นมีความสมดุลที่ถูกต้อง (ดังนั้นความสัมพันธ์ที่ใกล้ชิดกับหมายเลขคาตาลันซึ่งเหมือนกัน

.NET กลุ่มสมดุลจะสวยดีในการตรวจสอบอย่างถูกต้องสตริงจับคู่เพื่อให้เราเพียงแค่สร้างทั้งหมดสตริงของความยาวN(ใช้_, <และ>ขณะที่ทั้งสามตัวอักษร) และจากนั้นเรานับจำนวนของผู้ที่มีความสมดุลอย่างถูกต้อง เช่นสำหรับN = 4สตริงที่ถูกต้องคือ:

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

เมื่อเทียบกับความหมายในความท้าทายที่_สอดคล้องกับ(1,0)ขั้นตอน<การ(1,1)และการ>(1,-1)

สำหรับรหัสจริงนั้น:จะใช้เป็นตัวคั่นระหว่างสตริงที่แตกต่างกัน regex สองเป็นเพียงรูปแบบแข็งแรงเล่นกอล์ฟของ regex .NET มาตรฐานสำหรับสตริงสมดุล

สิ่งที่ควรทราบคือมีการ:แทรกเพียงครั้งเดียวระหว่างสตริงในแต่ละขั้นตอน แต่ regex ตัวที่สองตรงกับส่วนนำและส่วนท้าย:(และเนื่องจากการจับคู่ไม่สามารถทับซ้อนกันได้นั่นหมายความว่าสตริงที่อยู่ติดกันที่สร้างจากเทมเพลตเดียวในขั้นตอนสุดท้าย ) อย่างไรก็ตามนี่ไม่ใช่ปัญหาเพราะอย่างน้อยหนึ่งในสามนั้นสามารถจับคู่ได้:

  • หากสตริงที่ลงท้ายด้วยการ_จับคู่คำนำหน้าโดยไม่มีสิ่งนั้น_จะสมดุลกันอย่างถูกต้องแล้ว<หรือ>จะทำให้ยอดคงเหลือนั้นหมดไป
  • ถ้าสตริงสิ้นสุดใน>การแข่งขันสตริงจะมีความสมดุลกับที่>เพื่อให้_หรือ<จะโยนออกจากยอดเงินที่
  • สตริงที่ลงท้ายด้วย<ไม่มีความสมดุล

เป็นเรื่องน่าละอายที่ '\' มีความหมายพิเศษมิฉะนั้นการใช้อักขระ '_ / \' จะเหมาะกับวิญญาณของคำถาม
Neil

9

Python 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-th Motzkin Number ฉันคำนวณ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=

การสาธิตออนไลน์

ในฐานะที่เป็นชำเลืองไปที่ที่ระบุไว้ในการแสดงความคิดเห็นในคำถามนี้เป็นอย่างมากที่เกี่ยวข้องอย่างใกล้ชิดกับตัวเลขคาตาลัน: เปลี่ยน.5ไป1และชดเชยดัชนีโดยหนึ่ง (หรือเพียงแค่ลบ.5ทั้งหมดและปล่อยให้ดัชนีไม่เปลี่ยนแปลง) จะได้รับหมายเลขคาตาลัน

การเกิดซ้ำที่ใช้คือ

a (n + 2) - a (n + 1) = a (0) * a (n) + a (1) * a (n-1) + ... + a (n) * a (0) [Bernhart]

จากหน้า OEIS การเกิดซ้ำที่สอดคล้องกันสำหรับหมายเลขคาตาลันจะแสดงเป็น

a (n) = Sum_ {k = 0..n-1} a (k) a (n-1-k)


6

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

,;╗r`;τ╜█@;u@τ╣║\*`MΣ

ยืมรหัสบางส่วนจากโซลูชันหมายเลขคาตาลันของควินโทเรียโดยเฉพาะการปรับปรุงที่ฉันทำในความคิดเห็น

ฉันใช้สูตรต่อไปนี้:

สูตร 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)ทำอะไรตอนนี้
Addison Crump

@FlagAsSpam C(n,k) = nCkหรือจำนวนชุดค่าผสมของkรายการจากกลุ่มnรายการ
Mego

โอ้นั่นทำให้รู้สึกมากกว่าที่ฉันคิดว่ามันเป็น +1
Addison Crump

@FlagAsSpam ฉันไม่คิดว่าฉันต้องการรู้ว่าสิ่งที่คุณคิดว่ามันเป็น ...
Mego

5

R, 64 ไบต์

f=function(n)ifelse(n<2,1,f(n-1)+sum(rev(s<-sapply(2:n-2,f))*s))

ใช้สูตรยัง Mathworld ของ@ XNOR คำตอบของงูหลาม ขอขอบคุณที่กฎของความสำคัญเทียบเท่ากับ2:n-20:(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ị

นี้จะใช้ความสัมพันธ์เวียนเกิดจาก@ คำตอบของ ลองออนไลน์!

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

×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

Pari / GP , 38 36 26 ไบต์

n->(1+x+x^2)^n++/n\x^n++%x

ลองออนไลน์!

ใช้สมการ (11) จากMathWorld :

Mn=1n+1(n+11)2

ที่เป็นTrinomial ค่าสัมประสิทธิ์ ตามคำนิยามเป็นค่าสัมประสิทธิ์ของในการขยายตัวของ n(nk)2(nk)2xn+k(1+x+x2)n


14 ไบต์Samauฟังก์ชั่นการใช้ความหมายแรกของค่าสัมประสิทธิ์ );;7 2D$ⁿ$)╡$÷Trinomial: ฉันจะไม่โพสต์เป็นคำตอบเพราะภาษาใหม่กว่าคำถาม
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

Ÿเป็นช่วงความผันผวนในตัว หากมีตัวเลขที่ไม่ติดกันคู่ใด ๆ ก็จะกรอกตัวเลขที่หายไป (เช่น [0, 2] กลายเป็น [0, 1, 2]) เส้นทางทางกฎหมายเท่านั้นที่จะไม่มีการเปลี่ยนแปลง

วิธีที่ง่ายกว่านี้ในการตรวจสอบความลาดชันที่ผิดกฎหมายก็คือüαà(ยืนยันความแตกต่างสัมบูรณ์สูงสุดของจำนวนคู่เท่ากับ 1) อย่างไรก็ตามสิ่งนี้พลาดเส้นทางแบบแบน [0, 0, ... 0] ซึ่งมีค่าใช้จ่ายเพิ่มเติมหนึ่งไบต์ในการแก้ไข

สุดท้ายทราบว่าการใช้รหัสจริงที่ใช้คำอธิบายนี้ 0.øแทนที่จะล้อมรอบพา ธ ด้วย 0s สิ่งนี้ล้อมรอบอินพุตโดยนัยด้วยสองสำเนาของพา ธ สิ่งนี้จะเปลี่ยนระบบพิกัดกลับหัวและกลับหัวกลับด้าน แต่จะเทียบเท่ากัน


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

(([{}]<(())>)<{({}()<{<>([({})]({}[({})]({}<>{}<>)))<>}<>>)}>){({}()<{}>)}{}({}{}[{}{}]<>)

ลองออนไลน์!

คำนวณที่เป็นTrinomial ค่าสัมประสิทธิ์ ฉันไม่สามารถหาสูตรนี้ได้ทุกที่ดังนั้นฉันจึงไม่สามารถอ้างอิงได้ แต่สามารถพิสูจน์ได้ในลักษณะเดียวกับสูตร .(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)

พอร์ตที่ตรงไปตรงมาของโซลูชัน Python แบบเรียกซ้ำได้ของ @ xnor ความต้องการn<1?1:เพราะn<1||จะทำให้ผลตอบแทนf(0)true


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