Jeśli zdefiniujemy sekwencję podobną do Fibonacciego jako f k (n) = (f k (n-1) + f k (n-2))% k , dla niektórych liczb całkowitych k (gdzie % jest operatorem modulo), sekwencja będzie koniecznie cykliczne, ponieważ istnieją tylko k 2 różnych wartości dla (f k (n-1), f k (n-2)) . Jednak ten cykl zwykle nie obejmuje wszystkich możliwych par wartości, więc w zależności od dwóch początkowych wartości f k (0) i f k (1) , możemy uzyskać różne cykle. Na przykład dla k = 2, mamy następujące cztery możliwości, w zależności od dwóch pierwszych wartości:
0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 0, 1, 1, 0, 1, 1, ...
1, 0, 1, 1, 0, 1, 1, 0, 1, ...
1, 1, 0, 1, 1, 0, 1, 1, 0, ...
Ze względu na cykliczną naturę sekwencji, tak naprawdę istnieją tutaj tylko dwie zasadniczo różne sekwencje, z orbitami (0) i (0, 1, 1) . Spójrzmy na k = 3 :
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, ...
0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, ...
1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, ...
1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, ...
1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, ...
2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, ...
2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, ...
2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, ...
Ponownie istnieją tylko dwie różne orbity: (0) i (0, 1, 1, 2, 0, 2, 2, 1) .
Dla wyższych k możemy uzyskać więcej orbit, ale nadal będą one należeć do stosunkowo niewielkiej liczby klas. Na przykład k = 4 daje cztery orbity (0) , (0,1,1,2,3,1) , (0, 2, 2) , (0, 3, 3, 2, 1, 3) i k = 5 trzy orbity (0) , (0, 1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, 2, 2, 4, 1) i (1, 3, 4, 2) .
Twoim zadaniem w tym wyzwaniu jest obliczenie, ile orbit generuje sekwencja dla danego k . To jest OEIS A015134 . Oto pierwsze 100 wartości (od k = 1 ):
1, 2, 2, 4, 3, 4, 4, 8, 5, 6, 14, 10, 7, 8, 12, 16, 9, 16, 22, 16,
29, 28, 12, 30, 13, 14, 14, 22, 63, 24, 34, 32, 39, 34, 30, 58, 19,
86, 32, 52, 43, 58, 22, 78, 39, 46, 70, 102, 25, 26, 42, 40, 27, 52,
160, 74, 63, 126, 62, 70, 63, 134, 104, 64, 57, 78, 34, 132, 101, 60,
74, 222, 37, 38, 62, 328, 89, 64, 82, 124, 41, 86, 42, 172, 75, 44,
184, 178, 181, 132, 82, 180, 99, 140, 104, 246, 49, 50, 114, 76
Pamiętaj, aby sprawdzić k = 11 , która jest pierwszym wejściem, który daje więcej niż k orbit.
Zasady
Otrzymałeś dodatnią liczbę całkowitą k i powinieneś wyprowadzić A015134 (k) .
Możesz napisać program lub funkcję i użyć dowolnej ze standardowych metod odbierania danych wejściowych i dostarczania danych wyjściowych.
Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.
To jest golf golfowy , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .
źródło
Odpowiedzi:
Łuska ,
1716 bajtówWypróbuj online!
Wyjaśnienie
źródło
Bash,
172,119,113, 91 bajtówWypróbuj online
źródło
Wolfram Language (Mathematica) ,
7670 bajtówWypróbuj online!
Jak to działa
Konstruujemy wykres podany na podstawie reguł,
{{0,0}->{0,0}, {1,0}->{1,1}, ...}
które, biorąc pod uwagę dwa elementy uogólnionej sekwencji Fibonacciego, znajdują następny modulon
.EdgeCycleMatrix
Daje matrycy przypadku z cykli do krawędzi w wykresie; chcemy policzyć jego rzędy.(Istnieje wiele wbudowanych funkcji, które wykonują podobne zadanie, ale
ConnectedComponents
są dłuższe iFindCycle
wymagają wielu dodatkowych danych wejściowych, aby działało. Poza tymEdgeCycleMatrix
jest prostokątna tablica, która nie ma zabawnego kształtu, jak pozostałe dwa, co pomaga później. )Aby policzyć rzędy macierzy, bierzemy silnię wpisów, aby przekształcić ją w macierz wszystkich, a następnie pobieramy ślad. (Każdy cykl zawiera co najmniej jedną krawędź i dlatego jest co najmniej tyle kolumn, ile wierszy - więc liczy się to wiersze, a nie kolumny).
źródło
MATL ,
3836 bajtówWypróbuj online! Przekracza limit czasu w internetowym kompilatorze na przekroczenie danych wejściowych
7
.Wyjaśnienie
Kod definiuje orbity w kategoriach liczb zespolonych, w których wyimaginowana część jest nowym terminem, a rzeczywista część jest poprzednim terminem w sekwencji Fibonacciego. Każda wartość zespolona koduje stan sekwencji. Mianowicie, biorąc
a+jb
pod uwagę następną wartość, jest obliczana jakob+j(a+b)
.Dopuszczalne wartości wyjściowe są
a+jb
za
,b
w[0, 1, ..., k-1]
. Dla każdej wartości początkowej kod iterujek^2
czasy. W rzeczywistości, aby skrócić kod, każda iteracja jest stosowana do wszystkich dotychczas zgromadzonych wartości, a wyniki są deduplikowane (co i tak byłoby konieczne na końcu). Po ostatniej iteracji wektor deduplikowanych wartości zespolonych jest sortowany (według wartości bezwzględnej, a następnie według kąta). To daje „podpis” dla każdej orbity.Pod koniec programu podpisy są gromadzone w tablicy komórkowej. Liczba unikatowych podpisów jest pożądanym wynikiem.
źródło
Haskell ,
196191 bajtówWypróbuj online!
Można to prawdopodobnie poprawić. Zwłaszcza jeśli ktoś może znaleźć sposób na uniknięcie
isInfixOf
i usunięcie importu.Podstawową ideą jest wygenerowanie listy „stanów” (krotek zawierających dwie poprzednie wartości), aby zobaczyć, kiedy zaczyna się cykl. Następnie sprawdzamy, czy każda orbita różni się od swoich poprzedników (naprawdę działa na odwrót, ale trudno to wyrazić słowami). Aby sprawdzić, czy orbity są takie same, sprawdzamy, czy długość jest taka sama i czy jedna pasuje do drugiej połączonej ze sobą. Na przykład
[0,2,2]
,[2,2,0]
: Długość obu oznacza 3 i[0,2,2,0,2,2]
zawiera[2,2,0]
jako ciągłą podciągu. Nie jestem pewien, czy jest niezawodny, ale wydaje się, że działa.EDYCJA: dzięki Laikoni za zdjęcie 5 bajtów! Powinienem był przeczytać więcej tych wskazówek.
źródło
length
. Kolejny bajt można zapisać za!
pomocą|r<-p++[a]=r!b
.JavaScript (ES6),
337335 bajtówPrzepraszam za algorytm brutalnej siły Ω (k ^ 3).
Wydajność ...
Kiedy obliczałem A015134 (coś więcej niż k = 50), przekroczyłem limit 60 s dla TIO.Wyjaśnienie (nie golf)
źródło
Perl 5, 80 + 1 (-p) bajtów
Wypróbuj online
źródło
Galaretka , 17 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 102 bajty
Zwraca funkcję, która zwraca wynik. W przypadku 3 kolejnych bajtów możemy zwrócić wynik bezpośrednio:
Oba mają złożoność czasową O (n 2 ).
źródło
Python 2 , 214 bajtów
Wypróbuj online!
Nie jest zbyt wydajny, ale jest to najbardziej golfowy, jaki mogłem zrobić.
źródło