Motzkin Numaraları


30

N'inci Motzkin sayısı (n, 0), her bir aşama (-1 1) formda olan, (1, 0) ya da (1, 1) ve yol (0, 0) dan yolların sayısıdır asla y = 0 değerinin altına düşmez.

Yukarıdaki bağlantıdan n = 1, 2, 3, 4 için bu yolların gösterimi:

Motzkin sayıları

İstenilen dizi OEIS A001006'dır . OEIS, dizinin başka bazı karakteristiklerine sahiptir.


Girdi olarak size pozitif bir tamsayı n verilecektir. Mot Motzkin Numarası'nı vermelisin.

İşte 1'den 10'a kadar Motzkin sayıları:

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

Tüm standart giriş ve çıkış yöntemlerine izin verilir. Standart boşluklar uygulanır.

Bu kod golfü. En az bayt kazanır.


Üretebilmemiz gereken asgari Motzkin sayıları nedir?
Addison Crump


@FlagAsSpam Hepsi, zaman / bellek / veri tipi sınırlamalarına kadar.
isaacg

Dillerin şimdi yerleşik bir Dyck sözüne ihtiyacı olduğunu düşünüyorum.
lirtosiast

Yanıtlar:


15

Matl , 13 14 bayt

i-2/t.5+hH4Zh

Örnek:

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

EDIT (16 Haziran 2017): Çevrimiçi deneyebilirsiniz! Ayrıca dilin modern versiyonlarında (bu zorluğun bu tarihi sonrası) ikaldırılabileceğine dikkat edin.

açıklama

Hipergeometrik fonksiyonla denkliği (bkz. Denklem (10)) kullanarak oldukça basit :

görüntü tanımını buraya girin

Hipergeometrik fonksiyon tanımından

görüntü tanımını buraya girin

İlk iki argümanın sırasının değiştirilebileceği açıktır, bu da bir bayttan tasarruf sağlar.

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
Bu cevap, en kısa ve daha eski olanlara bir buçuk saat kadar bağlı, bu yüzden kabul ediyorum.
isaacg,

Teşekkürler! MATL'nin Pyth ile bile bağlanacağını hayal bile edemezdim. Yenmek için çok zor bir dil, onu tasarlamak iyi iş!
Luis Mendo

11

Retina , 59 58 bayt

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

İçinde girdi Alır tekli . Giriş 7 (yani 1111111) oldukça zaman alıyor ancak bir dakikadan daha kısa sürede tamamlanıyor. Bundan daha ileri gitmem.

Çevrimiçi deneyin.

açıklama

Motzkin sayılarının farklı bir karakterizasyonu, ikisinin doğru dengelendiği üç farklı karakterin karakter dizisi sayısıdır (bu nedenle, dengelemeden bağımsız olan üçüncü karakter olmadan aynı olan Katalan sayıları ile yakın ilişki).

NET'in dengeleme grupları yüzden biz sadece üretmek, doğru eşleşen dizeleri saptamada oldukça iyi tüm uzunluktaki dizeleri N(kullanarak _, <ve >üç karakter olarak) ve daha sonra biz onlardan pek doğru dengeli nasıl saymak. Örneğin N = 4, geçerli dizeler için:

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

Meydan tanımı ile karşılaştırıldığında, _bir karşılık gelir (1,0)adım <için (1,1)ve >için (1,-1).

Gerçek kod :ise, farklı dizeler arasında bir ayırıcı olarak kullanılır. İkinci regex, dengeli dizeler için standart .NET regex'in golflü bir halidir .

Nota şey tek bir olmasıdır :, her aşamada dizeleri arasına yerleştirilir, ancak ikinci normal ifade, bir eşler ve bir arka :değildir çünkü stoktaki olamaz örtüşme, bitişik şeritler, son aşamada bir şablondan üretilen bu araçlar (ve eşleşme her iki ). Bununla birlikte, bu bir problem değildir, çünkü bu üç kişiden en fazla biri eşleşebilir:

  • Eşleşen dize eşleşirse _, bu olmadan önek _zaten doğru bir şekilde dengelenir ve <veya >bu dengeyi bozar.
  • Biten dize halinde >maçların, dize dengeli olduğu ile bu >yüzden _ya <bu dengeyi atmak olacaktır.
  • Sona biten karakter dizileri <asla dengelenemez.

'\' Özel bir anlamı olması, aksi halde '_ / \' karakterlerini kullanmak, sorunun ruhuna daha iyi uyması çok yazık.
Neil,

9

Python 2, 51 bayt

M=lambda n:n<1or sum(M(k)*M(n-2-k)for k in range(n))

Mathworld'ün formülünü kullanır

görüntü tanımını buraya girin

Koyarak karakter kaydeder M[n-1]olarak toplamı içine terimi k=n-1verir M[-1]*M[n-1]ile, M[-1]=1başlangıç durumunda parçası olarak kullanılabilir.

Düzenleme: Toplamı özyinelemeyle yazan bir karakter daha kısa:

M=lambda n,k=0:n<1or k<n and M(k)*M(n-2-k)+M(n,k+1)

Daha uzun süren diğer yaklaşımlar:

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 bayt

Ls*V+KyMb1+t_K1

Bu bir işlevi tanımlar y. Çevrimiçi deneyin: Gösteri

Açıklama:

Let y[n]olmak noyunu bırakanların Motzkin sayısı. y[n]Formül ile hesaplarım

y[n] = dot product of (y[0], ..., y[n-1], 1) and (y[n-2], ..., y[0], 1)

İlk vektörün ikinciden daha büyük olduğuna dikkat edin (hesaplama hariç y[0]). Bu durumda, Pyth'den daha çok ilk vektörün sonundaki 1'i yoksayar, böylece her iki vektör de eşit uzunlukta olur.

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)

Bu formül, OEIS'te listelenen formüllerden birinin bir varyasyonudur. Biraz aptal olabilir. İlk vektörün sonundaki 1 (uzunlukları eşitsiz yapan) nedeniyle, özyinelemeye temel bir durum vermek zorunda değilim. Ve ümit ettim, ikisinin bir +...1şekilde golf oynayabileceğini. Yapamayacağım ortaya çıktı.

Benzer bir özyinelemeyi, eşit uzunluktaki vektörlere sahip bir nokta ürünü ile tanımlayabilir ve temel durumu y[0] = 1aynı bayt sayısıyla tanımlayabilirsiniz .


8

CJam (20 bayt)

.5X]{__W%.*:++}qi*W=

Çevrimiçi demo

Mego soru üzerine açıklamalarda belirtildiği gibi, bu çok yakından Katalan sayıları ile ilgilidir: değiştirmek .5için 1ve tek endeks offset (veya basitçe kaldırmak .5tamamen ve değişmeden endeksi bırakın) Katalan rakamları elde etmek.

Kullanılan yineleme

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

OEIS sayfasından. Katalanca sayılar için karşılık gelen yineleme ,

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


6

Cidden, 21 bayt

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

Quintopia'nın Katalanca Sayılar çözümünden bazı kodları ödünç aldım, özellikle yorumlarda yaptığım iyileştirmeyi.

Aşağıdaki formülü kullanıyorum:

motzkin formülü

O nCkiçin 0 olduğu için k > ntüm n-1değerleri toplayacağım, çünkü bu değerlerin tümü 0 olacaktır ve bu nedenle toplamı etkilemez.

Çevrimiçi deneyin

Açıklama:

,;╗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)şimdi ne yapıyor
Addison Crump

@FlagAsSpam C(n,k) = nCkveya kbir neşya havuzundaki eşyaların kombinasyon sayısı .
Mego

Oh, bu düşündüğümden daha anlamlı. +1.
Addison Crump

@FlagAsSpam Ne düşündüğünü bilmek istediğimi sanmıyorum ...
Mego

5

R, 64 bayt

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

Ayrıca @ xnor'ın python cevabının Mathworld formülünü kullanır . Öncelik kuralları sayesinde 2:n-2, eşdeğerdir 0:(n-2).

Test durumları:

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

AppellF1[-#/2,.5,-#/2,2,4,4]&

Eğlence için, işte 37 bayt sürümü

Hypergeometric2F1[(1-#)/2,-#/2,2,4]&

ve 52 bayt versiyonu

SeriesCoefficient[1-x-Sqrt[1-2x-3x^2],{x,0,#+2}]/2&

4

Jöle , 17 14 13 bayt

×US;
1;HÇƓ¡1ị

Bu @ PeterTaylor'un cevabındaki yineleme ilişkisini kullanır . Çevrimiçi deneyin!

Nasıl çalışır

×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

Mathematica, 44 42 34 bayt

Sum[#!/(i!(i+1)!(#-2i)!),{i,0,#}]&

35 bayt sürümü:

Coefficient[(1+x+1/x)^#,x]/#&[#+1]&

2

Pari / GP , 38 36 26 bayt

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

Çevrimiçi deneyin!

MathWorld'den (11) denklemini kullanarak :

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

(nk)2(nk)2xn+k(1+x+x2)n


Bir 14-bayt Samau terimli katsayısı birinci tanım kullanılarak fonksiyonu: );;7 2D$ⁿ$)╡$÷. Bir cevap olarak göndermeyeceğim, çünkü dil sorudan daha yeni.
alephalpha

Göndermek gayet iyi, sadece gönderim kazanmaya uygun olmadığına dair bir feragatname eklemelisiniz, çünkü dediğiniz gibi, dil sorudan daha yeni.
Alex A.

2

05AB1E , 13 12 bayt

ÝI<ãʒ.øDŸQ}g

Çevrimiçi deneyin!

Cevapların çoğu formül veya yineleme ilişkisini kullanırken, bu basit bir sayma yaklaşımıdır.

Izgaradaki her olası yol, y koordinatlarının listesiyle gösterilir. N segmentleri için toplam (n + 1) puan vardır, ancak birinci ve sonuncusu mutlaka 0'dır, böylece belirtmek için (n-1) puan bırakır.

Ý           # range [0..n]
 I<         # n - 1
   ã        # cartesian power

Şimdi yolların bir listesi var (henüz ilk ve son 0 dahil değil). Yapım gereği hiçbiri 0'ın altına düşmez. Ancak, bazılarının yasa dışı eğimleri vardır (örneğin, 0'dan 2'ye atlar), bu yüzden onları filtrelememiz gerekir.

ʒ      }g   # count how many paths satistfy the following condition
 0.ø        # surround with 0
      Q     # is equal to
    DŸ      # its own fluctuating range

Ÿolduğu dalgalanan aralığı yerleşik. Eğer bitişik olmayan sayılar çifti varsa, eksik sayıları doldurur (örneğin [0, 2], [0, 1, 2] olur). Yalnızca yasal yollar değiştirilmeyecek.

Yasadışı yamaçları kontrol etmenin belki de daha sezgisel bir yolu olacaktır üαà(çiftin mutlak farklılıklarının maksimumunun 1'e eşit olduğunu). Ancak, bu düzeltmek için bir ekstra bayta mal olan düz [0, 0, ... 0] yolunu özlüyor.

Son olarak, asıl kodun kullandığını unutmayın. bu açıklamanın kullanıldığı yeri0.ø . Yolu 0'larla çevrelemek yerine, örtük girişi, yolun iki kopyasıyla çevreler. Bu, koordinat sistemini baş aşağı ve baş aşağı döndürür, ancak başka türlü eşdeğerdir.


2

Stax , 12 bayt

îu¬@Y≤ÅÉÑ(πε

Koş ve hata ayıkla

Süslü matematik dizgisini nasıl yapacağımı bilmiyorum, ama bu aslında dinamik bir programlama yapısına dayanıyor.

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

Ruby, 50

yinelenme ilişkisinin basit bir şekilde uygulanması.

g=->n{n<2?1:(3*(n-1)*g[n-2]+(2*n+1)*g[n-1])/(n+2)}

1

Beyin Flak , 90 bayt

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

Çevrimiçi deneyin!

(n0)2(n2)2(nk)2Cn=(2nn)(2nn+1)


0

ES6, 44 bayt

f=(n,k=0)=>n<1?1:k<n&&f(k)*f(n-2-k)+f(n,k+1)

@ Xnor'ın özyinelemeli Python çözümünün basit bağlantı noktası. İhtiyaçlar n<1?1:çünkü n<1||yapacak f(0)dönüşü true.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.