N-ta liczba Motzkina to liczba ścieżek od (0, 0) do (n, 0), gdzie każdy krok ma postać (1, -1), (1, 0) lub (1, 1), oraz ścieżka nigdy nie spada poniżej y = 0.
Oto ilustracja tych ścieżek dla n = 1, 2, 3, 4 z powyższego linku:
Pożądana sekwencja to OEIS A001006 . OEIS ma kilka innych charakterystyk sekwencji.
Jako dane wejściowe otrzymasz dodatnią liczbę całkowitą n. Powinieneś podać n-ty numer Motzkina.
Oto numery Motzkin od 1 do 10:
1, 2, 4, 9, 21, 51, 127, 323, 835, 2188
Wszystkie standardowe metody wejścia i wyjścia są dozwolone. Obowiązują standardowe luki .
To jest kod golfowy. Wygrywa najmniej bajtów.
Odpowiedzi:
MATL , 13
14bajtówPrzykład:
EDYCJA (16 czerwca 2017 r.): Możesz spróbować online! Należy również pamiętać, że we współczesnych wersjach języka (które stanowią wyzwanie po tej dacie)
i
można je usunąć.Wyjaśnienie
Całkiem proste, używając równoważności (patrz równanie (10)) z funkcją hipergeometryczną :
Z definicji funkcji hipergeometrycznej
jasne jest, że kolejność pierwszych dwóch argumentów może być zamieniona, co oszczędza jeden bajt.
źródło
Retina ,
5958 bajtówPobiera dane wejściowe jednoargumentowe . Wejście 7 (tj.
1111111
) Zajmuje sporo czasu, ale nadal kończy się w mniej niż minutę. Nie poszedłbym znacznie dalej.Wypróbuj online.
Wyjaśnienie
Inną charakterystyką liczb Motzkina jest liczba łańcuchów trzech różnych znaków, przy czym dwa z nich są odpowiednio zrównoważone (stąd ścisły związek z liczbami katalońskimi, które są takie same bez trzeciego znaku niezależnego od równoważenia).
Grupy równoważące .NET są całkiem dobre w wykrywaniu poprawnie dopasowanych ciągów, więc po prostu generujemy wszystkie ciągi długości
N
(używając_
,<
i>
jako trzy znaki), a następnie liczymy, ile z nich jest poprawnie zrównoważonych. Np. DlaN = 4
prawidłowych ciągów są:W porównaniu z definicją w wyzwaniu,
_
odpowiada(1,0)
kroku,<
do(1,1)
i>
z(1,-1)
.Jeśli chodzi o rzeczywisty kod,
:
jest on używany jako separator między różnymi łańcuchami. Drugie wyrażenie regularne to po prostu golfowa forma standardowego wyrażenia regularnego .NET dla zbalansowanych ciągów .Należy zauważyć, że
:
pomiędzy ciągami znaków na każdym kroku jest tylko jeden , ale drugi wyrażenie regularne pasuje do wiodącego i końcowego:
(a ponieważ dopasowania nie mogą się pokrywać, oznacza to, że sąsiednie ciągi wygenerowane z jednego szablonu w ostatnim kroku nie mogą się zgadzać ). Nie stanowi to jednak problemu, ponieważ co najwyżej jedna z tych trzech może się równać:_
dopasowaniami, prefiks bez tego_
jest już poprawnie zrównoważony i /<
lub>
zrzuciłby tę równowagę.>
dopasowaniami, zostanie zrównoważony z tym>
, tak_
lub<
zrzuci tę równowagę.<
nigdy nie mogą być zrównoważone.źródło
Python 2, 51 bajtów
Wykorzystuje formułę z Mathworld
Zapisuje znaki, umieszczając
M[n-1]
termin w podsumowaniu jakok=n-1
, co dajeM[-1]*M[n-1]
,M[-1]=1
jako część warunku początkowego.Edycja: O jeden znak krótszy zapis sumy rekurencyjnie:
Inne podejścia, które okazały się dłuższe:
źródło
Pyth, 15 bajtów
To definiuje funkcję
y
. Wypróbuj online: demonstracjaWyjaśnienie:
Niech
y[n]
będzien
-tym numerem Motzkina. Obliczamy[n]
według wzoruZauważ, że pierwszy wektor jest większy niż drugi (z wyjątkiem obliczeń
y[0]
). W takim przypadku Pyth automatycznie ignoruje 1 na końcu pierwszego wektora, więc oba wektory mają równą długość.Ta formuła jest odmianą jednej z formuł wymienionych w OEIS. To może być trochę głupie. Ze względu na 1 na końcu pierwszego wektora (co powoduje, że długości są nierówne), tak naprawdę nie muszę nadawać rekurencji podstawowego przypadku. Miałem nadzieję, że te dwa
+...1
można jakoś zagrać w golfa. Okazuje się, że nie mogę.Możesz zdefiniować podobną rekurencję za pomocą iloczynu kropkowego o wektorach o jednakowej długości i zdefiniować wielkość liter
y[0] = 1
przy użyciu tej samej liczby bajtów.źródło
CJam (20 bajtów)
Demo online
Jak zauważył Mego w komentarzach do pytania, jest to bardzo ściśle związane z liczbami katalońskimi: zmień indeks
.5
na1
i przesunąć indeks o jeden (lub po prostu usuń.5
całkowicie i pozostaw indeks bez zmian), aby uzyskać liczby katalońskie.Zastosowano powtarzalność
ze strony OEIS. Odpowiednie powtórzenie liczb katalońskich jest wymienione jako
źródło
Poważnie, 21 bajtów
Pożycza trochę kodu z rozwiązania Catalan Numbers firmy Quintopia , w szczególności ulepszenia, które wprowadziłem w komentarzach.
Używam następującej formuły:
Ponieważ
nCk
wynosi 0k > n
, sumuję do samego końcan-1
, ponieważ wszystkie te wartości będą równe 0, a zatem nie będą miały wpływu na sumę.Wypróbuj online
Wyjaśnienie:
źródło
C(n, 2*k)
robi co teraz?C(n,k) = nCk
lub liczba kombinacjik
przedmiotów z pulin
przedmiotów.R, 64 bajty
Wykorzystuje również formułę Mathworld w odpowiedzi na python @ xnor . Dzięki regułom pierwszeństwa
2:n-2
jest równoważne z0:(n-2)
.Przypadki testowe:
źródło
Mathematica,
3130 bajtówDla zabawy, oto 37-bajtowa wersja
i wersja 52-bajtowa
źródło
Galaretka ,
171413 bajtówWykorzystuje relację powtarzalności z odpowiedzi @ PeterTaylor . Wypróbuj online!
Jak to działa
źródło
Mathematica,
444234 bajtyA 35 bytes version:
źródło
Pari/GP,
383626 bytesTry it online!
Using equation (11) from MathWorld:
where(nk)2 is a trinomial coefficient. By definition, (nk)2 is the coefficient of xn+k in the expansion of (1+x+x2)n .
źródło
);;7 2D$ⁿ$)╡$÷
. I won't post it as an answer because the language is newer than the question.05AB1E,
1312 bytesTry it online!
While most answers use a formula or recurrence relation, this is a simple counting approach.
Each possible path through the grid is represented by the list of its y coordinates. For n segments, there are a total of (n+1) points, but the first and last one are necessarily 0, so that leaves (n-1) points to specify.
We now have a list of paths (not yet including the initial and final 0). By construction, none of them ever go below 0. However, some of them have illegal slopes (e.g. jump from 0 to 2), so we need to filter them out.
Ÿ
is the fluctuating range built-in. If there's any pair of non-adjacent numbers, it will fill in the missing numbers (e.g. [0, 2] becomes [0, 1, 2]). Only legal paths will be left unchanged.A perhaps more intuitive way to check for illegal slopes would be
üαà
(assert the maximum of pairwise absolute differences equals 1). However, this misses the flat [0, 0, ... 0] path, which costs one extra byte to fix.Finally, note that the actual code uses
.ø
where this explanation uses0.ø
. Instead of surrounding the path with 0s, this surrounds the implicit input with two copies of the path. This turns the coordinate system upside-down and inside-out, but is otherwise equivalent.źródło
Stax, 12 bytes
Run and debug it
I don't know how to do fancy math typesetting, but this essentially relies on a dynamic programming construction
źródło
Ruby, 50
straightforward implementation of the recurrence relation.
źródło
Brain-Flak, 90 bytes
Try it online!
Computes(n0)2−(n2)2 , where (nk)2 is a trinomial coefficient. I couldn't find this formula anywhere, so I can't reference it, but it can be proved in the same way as the analogous formula Cn=(2nn)−(2nn+1) .
źródło
ES6, 44 bytes
Straightforward port of @xnor's recursive Python solution. Needs
n<1?1:
becausen<1||
would makef(0)
returntrue
.źródło
Haskell, 55 bytes
Straightforward implementation of the recursion.
Try it online!
źródło