Cel
Celem tego wyzwania jest stworzenie funkcji, n
która oblicza liczbę sposobów podziału n X 1
siatki na trójkąty, w których wszystkie wierzchołki trójkątów znajdują się w punktach siatki.
Przykład
Na przykład istnieje 14 sposobów podziału siatki 2 x 1, więc f(2) = 14
za pomocą następujących partycji, w
których partycje mają odpowiednio 2, 2, 2, 2, 4 i 2 różne orientacje.
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod.
code-golf
geometry
combinatorics
grid
Peter Kagey
źródło
źródło
Odpowiedzi:
05AB1E , 13 bajtów
Port odpowiedzi galaretki @Bubbler .
Bardzo wolny ze względu na wbudowane permutacje.
Wypróbuj online lub sprawdź pierwsze cztery dane wejściowe .
Wyjaśnienie:
źródło
Haskell ,
60 55 5452 bajtówPo narysowaniu i zaprogramowaniu wielu przykładów przyszło mi do głowy, że jest to to samo, co problem wież:
Dzięki @PeterTaylor za -6 bajtów i @PostLeftGarfHunter za -2 bajty!
Wypróbuj online!
źródło
A051708(n+1)
. Więc opublikowałem pierwszą poprawną odpowiedź :-PHaskell , 42 bajty
Wypróbuj online!
Dość bezpośrednia implementacja, która powtarza ponad 2 zmienne.
Oto, w jaki sposób możemy uzyskać to rozwiązanie. Zacznij od kodu implementującego bezpośrednią rekurencyjną formułę:
54 bajty
Wypróbuj online!
Korzystanie interpretację gawron ruch flawr jest ,
a%b
to liczba ścieżek uzyskać wieżę od(a,b)
celu(0,0)
, przy użyciu jedynie przesuwa spadek współrzędnych. Pierwszy ruch albo maleje,a
albo malejeb
, pozostawiając ten sam drugi, stąd formuła rekurencyjna.49 bajtów
Wypróbuj online!
Możemy uniknąć powtórzeń
map(a%)[0..b-1]++map(b%)[0..a-1]
, zauważając, że dwie połówki są takie samea
ib
zamieniły się. Wywołanie pomocniczea?b
liczy ścieżki, w których zmniejsza się pierwszy rucha
, a więcb?a
liczy te, w których zmniejsza się pierwszy ruchb
. Są one ogólnie różne i dodają się doa%b
.Podsumowanie
a?b
można również napisać w formie listya?b=sum[a%i|i<-[0..b-1]]
.42 bajty
Wypróbuj online!
Wreszcie pozbywamy się
%
i po prostu piszemy rekursję pod względem?
zastępowaniaa%i
jąa?i+i?a
w wywołaniu rekurencyjnym.Nowy przypadek podstawowy powoduje, że
?
daje to wynik podwójny?
w porównaniu z wersją 49-bajtową, ponieważ z0?0=1
, mielibyśmy0%0=0?0+0?0=2
. Pozwala to na użycie funkcji Definiujf n=n?n
bez zmniejszania o połowę tego, co chcielibyśmy zrobić w innym przypadku.źródło
a%b
zlicza liczbę partycji za pomocą węzłów0,1,...,a
w górnym wierszu i węzłów w0,1,..,b
dolnym wierszu. Operatora?b
liczy liczbę sposobów dodania nowej linii z górnego węzła,a
jeśli dolny węzełb
jest już w użyciu. (Możesz połączyć sięa
ze wszystkimi węzłami[0,1,...,b-1]
, ale musisz powtórzyć dla każdego z nich.)?
42-bajtowy, którego nie znam, a szczególnie ciekawe jest to, że nie jest symetryczny.map...
zrozumienie listy, w drugim kroku po prostu wprowadzamy definicję%
:a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a
a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a
a?b=sum[a?i+i?a|i<-[0..b-1]]
CJam (24 bajty)
Demo online
Wykorzystuje to podejście Bubblera do sumowania przez permutacje
n
zer in
jedynek.Sekcja
Alternatywne podejście (28 bajtów)
Demo online
Sekcja
Wszystkie trójkąty mają jedną poziomą krawędź i dwie krawędzie, które łączą poziome linie. Oznacz nie-poziome krawędzie krotką ich dwóch współrzędnych x i posortuj leksykograficznie. Zatem pierwsza krawędź to
(0,0)
, ostatnia krawędź jest(n,n)
, a dwie kolejne krawędzie różnią się dokładnie w jednej z dwóch pozycji. To zapewnia prostą rekurencję, którą zaimplementowałem za pomocą zapamiętanego operatora rekurencjij
:Uwaga
Nie po raz pierwszy chciałem
fj
być wspierany w CJam. Tutaj sprowadziłoby to również wynik do 24 bajtów. Być może powinienem spróbować napisać łatkę ...źródło
Galaretka ,
1514 bajtówWypróbuj online!
-1 bajt na podstawie komentarza Petera Taylora.
Wykorzystuje ilustrację flawr bezpośrednio , zamiast wynikowej formuły.
Jak to działa
Wybierz każdą możliwą trasę na kwadratowej siatce. Liczba sposobów przesuwania jednostek L w jednym kierunku, jak na wieży
2**(L-1)
. Zastosuj to do każdej trasy i zsumuj liczbę sposobów przemierzania każdej trasy.źródło
Węgiel drzewny ,
4431 bajtówprzekreślone 44 jest nadal regularne 44
Wypróbuj online! Objaśnienie: Działa poprzez obliczenie liczby sposobów podziału trapezu o przeciwnych długościach boków
m,n
na trójkąty, które wszystkie leżą na przesunięciach liczb całkowitych. Jest to po prostu ogólny przypadek prostokąta wielkościn
w pytaniu. Liczba partycji jest podawana rekurencyjnie jako suma liczb partycji dla wszystkich stronm,0..n-1
in,0..m-1
. Jest to równoważne z uogólnionym problemem wież , OEIS A035002 . Kod po prostu oblicza liczbę partycji roboczych od0,0
góry don,n
stosując uprzednio obliczonych wartości, jak to idzie.Pętla nad rzędami
0..n
.Zacznij od pustego rzędu.
Pętlę nad kolumnami w rzędzie
0..n
.Weź dotychczasowy wiersz i wartości z poprzednich wierszy w bieżącej kolumnie i dodaj sumę do bieżącego wiersza. Jeśli jednak nie ma żadnych wartości, zamień
1
zamiast sumy.Dodaj gotowy wiersz do listy dotychczasowych wierszy.
Podaj obliczoną wartość końcową.
źródło
JavaScript (ES6),
45 4442 bajtówWykorzystuje rekurencyjną formułę znalezioną przez Petera Taylora i flawr .
Wypróbuj online!
źródło
Pari / GP , 43 bajty
Według OEIS funkcją generującą tę sekwencję jest
Wypróbuj online!
źródło
Python 3 , 51 bajtów
Wypróbuj online!
Port of flawr odpowiedzi
źródło