tło
Fraktali sekwencja stanowi sekwencje liczb całkowitych, gdzie można usunąć pierwsze wystąpienie każdej liczby całkowitej, a kończy się z tej samej kolejności, jak wcześniej.
Bardzo prosta taka sekwencja nazywa się parafrazami Kimberling . Zaczynasz od dodatnich liczb naturalnych:
1, 2, 3, 4, 5, 6, 7, 8, 9, ...
Następnie przeglądasz puste pola:
1, _, 2, _, 3, _, 4, _, 5, _, 6, _, 7, _, 8, _, 9, ...
A następnie wielokrotnie wypełniasz puste pola samą sekwencją (w tym puste):
1, 1, 2, _, 3, 2, 4, _, 5, 3, 6, _, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, _, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, 1, 9, ...
To nasza sekwencja fraktalna! Teraz weźmy częściowe sumy:
1, 2, 4, 5, 8, 10, 14, 15, 20, 23, 29, 31, 38, 42, 50, 51, 60, ...
Ale co jeśli powtórzymy ten proces? „Fraktalizuj” nową sekwencję (tj. Częściowe sumy uzyskane z powyższych kroków):
1, _, 2, _, 4, _, 5, _, 8, _, 10, _, 14, _, 15, _, 20, _, 23, ...
1, 1, 2, _, 4, 2, 5, _, 8, 4, 10, _, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, _, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, 1, 20, 8, 23, ...
I ponownie weź częściowe sumy:
1, 2, 4, 5, 9, 11, 16, 17, 25, 29, 39, 41, 55, 60, 75, 76, 96, ...
Spłucz, powtórz. Okazuje się, że proces ten jest zbieżny. Za każdym razem, gdy powtórzysz ten proces, większy prefiks sekwencji pozostanie stały. Po nieskończonej liczbie iteracji otrzymujesz OEIS A085765 .
Ciekawostka: ten proces zbiegnie się w tę samą sekwencję, nawet jeśli nie zaczniemy od liczb naturalnych, dopóki początkowa sekwencja zacznie się 1
. Jeśli oryginalna sekwencja zaczyna się od innej x
, otrzymalibyśmy x*A085765
zamiast tego.
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą N
, N
wyślij element th zbieżnej sekwencji.
Możesz napisać program lub funkcję, przyjmując dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Możesz wybrać, czy indeks N
ma wartość 0 czy 1.
Przypadki testowe
Sekwencja zaczyna się od:
1, 2, 4, 5, 9, 11, 16, 17, 26, 30, 41, 43, 59, 64, 81, 82, 108, 117, 147, 151, 192, 203, 246, 248, 307, 323, 387, 392, 473, 490, 572, 573, 681, 707, 824, 833, 980, 1010, 1161, 1165, 1357, 1398, 1601, 1612, 1858, 1901, 2149, 2151, 2458, 2517
Więc wejście 5
powinno dać wynik 9
.
Oto naiwna implementacja CJam, która generuje pierwsze N
liczby (podane N
na STDIN). Zauważ, że twój kod powinien zwracać tylko ten N
element, a nie cały prefiks.
N
th termin A085765 , prawda?Odpowiedzi:
CJam (
2322 bajtów)Sumy częściowe podane są przy parzystych indeksach sekwencji fraktalnej, czyli A086450 . Podana tam powtarzalność jako definicja A086450 stanowi podstawę tych wdrożeń.
Używając wyraźnego „stosu” (w przestraszonych cytatach, ponieważ nie jest to LIFO):
Demo online
Sekcja
Przy 23 bajtach istnieje znacznie bardziej wydajne podejście z zapamiętywaniem:
Demo online
źródło
f(0) = 1; f(n) = f(n/2) + (n % 2 ? 0 : f(n-2)); return f(2*x)
, ale nie mogę znaleźć sposobu na uzyskanie oszczędności dzięki takiemu podejściu w CJam.Python 2,
55 4942Nie mam pojęcia, co się dzieje, ale ciężko jest pokonać formułę Maple ze strony OEIS. Korzysta z indeksowania opartego na 0.
Dzięki @PeterTaylor za -6 bajtów.
źródło
or
są skutecznieg(n,1) = f(n/2,n%2); g(n,0) = f(n-1) + g(n,1)
; więc możesz wyciągnąć wspólne,g(n,1)
aby zdobyćf=lambda n,t=0:n<1or f(n/2,n%2)+0**t*f(n-1)
Haskell, 65
źródło
Szablony uważane za szkodliwe , 124
To anonimowa funkcja. Jest mniej więcej taki sam, jak
mój Python odpowiadana formułę klonu na stronie OEIS, tyle że nie wdrożyłem modułu, więc musiałem użyć nn / 2 * 2 zamiast n% 2.Rozszerzony:
źródło
Mathematica,
4744 bajtówźródło
Matlab
108103Korzystam z faktu, że pożądana seria jest częściową sumą https://oeis.org/A086450
Ale złożoność obliczeniowa mojej implementacji jest daleka od optymalnej, nawet w przypadku tej prostej rekurencji.
źródło