tło
Większość osób zna się na liczby Fibonacciego F(n)
:
0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Są one tworzone przez funkcję rekurencji za F(n) = F(n-1) + F(n-2)
pomocą F(0)=0
iF(1)=1
. A000045
Blisko spokrewniona sekwencja to liczby Lucasa L(m)
:
2, 1, 3, 4, 7, 11, 18, 29 ...
Są one tworzone przez funkcję rekurencji za L(m) = L(m-1) + L(m-2)
pomocą L(0)=2
i L(1)=1
.A000032
Możemy przełączać się między dwiema sekwencjami w oparciu o wskaźniki parzyste / nieparzyste, z budową,
A(x) = F(x)
jeśli x mod 2 = 0
i A(x) = L(x)
inaczej. Na przykład A(4)
jest równy F(4)
od 4 mod 2 = 0
. Zadzwonimy tej sekwencji Lucas-nacci Liczby , A(x)
:
0, 1, 1, 4, 3, 11, 8, 29, 21, 76 ...
Może być utworzone przez funkcję rekursji A(x) = 3*A(x-2) - A(x-4)
z A(0)=0
, A(1)=1
, A(2)=1
i A(3)=4
. A005013
Wyzwanie
Biorąc pod uwagę dane wejściowe n
, wypisz ciąg n+1
liczb do włącznie, A(n)
jak opisano powyżej. Najmniej bajtów (lub odpowiedników bajtów, takich jak dla LabVIEW , ustalanych indywidualnie w Meta).
Wejście
Pojedyncza nieujemna liczba całkowita n
.
Wynik
Lista liczb odpowiadających podsekwencji liczb Lucas-nacci od A(0)
doA(n)
. Lista musi być w kolejności sekwencyjnej, jak opisano powyżej.
Zasady
- Obowiązują standardowe zasady gry w golfa i ograniczenia luk .
- Obowiązują standardowe zasady wejścia / wyjścia .
- Numer wejściowy może być w dowolnym odpowiednim formacie: jednostkowy lub dziesiętny, odczytany ze STDIN, argument funkcji lub wiersza poleceń itp. - twój wybór.
- Dane wyjściowe można wydrukować do STDOUT lub zwrócić w wyniku wywołania funkcji. Jeśli są drukowane, należy dołączyć odpowiednie separatory do rozróżnienia liczb (rozdzielone spacjami, oddzielone przecinkami itp.).
- Dodatkowo, jeśli dane wyjściowe do STDOUT, otaczające białe spacje, końcowe znaki nowej linii itp. Są opcjonalne.
- Jeśli wejście jest liczbą całkowitą lub liczbą całkowitą ujemną, program może zrobić cokolwiek lub nic, ponieważ zachowanie jest niezdefiniowane.
Przykłady
Input -> Output
0 -> 0
5 -> 0, 1, 1, 4, 3, 11
18 -> 0, 1, 1, 4, 3, 11, 8, 29, 21, 76, 55, 199, 144, 521, 377, 1364, 987, 3571, 2584
Odpowiedzi:
Galaretka, 12 bajtów
Wypróbuj online!
tło
Możemy rozszerzyć F i L do -1, definiując F (-1) = 1 i L (-1) = -1. Jest to zgodne z funkcją rekurencyjną.
Nasz program zaczyna się od
W każdym kroku, aby utworzyć następną parę, odwracamy ostatnią parę i dodajemy ją do przedostatniej pary. Na przykład:
Jeśli będziemy kontynuować ten proces przez kilka kolejnych kroków, otrzymamy
Sekwencja Lucas-nacci to po prostu lewa kolumna.
Jak to działa
‡
С
zagląda do dwóch linków po lewej stronie:2
iU+¥
. Ponieważ skrajnie lewy jest niladem, nie może być ciałem pętli. DlategoU+¥
jest używany jako treść, a liczba jest odczytywana z danych wejściowych. Ponieważ nie ma argumentów wiersza polecenia, liczba ta jest odczytywana ze STDIN.źródło
CJam,
2120 bajtówDzięki Sp3000 za oszczędność 1 bajtu.
Sprawdź to tutaj.
Wyjaśnienie
Po prostu korzysta z powtarzalności podanej w specyfikacji wyzwania.
źródło
Perl 6, 42 bajtów
stosowanie
źródło
{( (0,1,*+*...*) Z (2,1,*+*...*) ).flat.rotor( 1=>2, 1=>0 )[ 0..$_ ].flat}
(0,1,1,4,{$^b;$^d;3*$^c-$^a}...*)[^(n+1)]
.Haskell,
59,57,56,52, 51 bajtówDefinicja serii dostosowana z tej odpowiedzi .
Mniej golfa:
fibLike start
Daje nieskończona lista, zdefiniowane:f(0)=start, f(1)=1, f(n)=f(n-1) + f(n-2)
.whichStart i
zwraca 2 dla nieparzystych danych wejściowych (seria Lucas) lub 0 dla parzystych (seria Fibonacciego).lucasNacci i
daje i-ty numer Lucas-nacci.firstN n
mapy nad listą.Jeden bajt zapisany przez Boomerang.
źródło
2*mod i 2
do,l
a następnie możesz usunąć nawias. W ten sposób:l a=2*mod a 2:scanl(+)1(l a)
if n=[l i!!i|i<-[0..n]]
ES6, 65 bajtów
Wykorzystuje relację powtarzalności podaną w pytaniu.
źródło
Siatkówka ,
706259 bajtówWypróbuj online
1?
$`¶
- Utwórz linię dla każdej liczby od 0 do n :, 1, 11, 111, 1111, ...
m`^(11)*1$
$&ff
- Dołączff
do linii nieparzystych. Spowoduje to zaszczepienie funkcji L (0) = 2.m`$
f
- Dołączf
do wszystkich wierszy (zwróć uwagę na spację). Powoduje to zaszczepienie funkcji 0 i 1 dla liczb Fibonacciego oraz 2 i 1 dla liczb Lucasa.+`1(f*) (f*)
$2 $2$1
- Pętla: oblicz F (n + 1) = F (n) + F (n-1), gdy są jeszcze 1.f*
- Usuń F (n + 1) z końca każdej linii.
f
s z powrotem na 1s. Jeśli nie jest to potrzebne i możemy pozostać przyf
s, długość wynosi zaledwie 55 bajtów.źródło
Oracle SQL 11.2,
218216201 bajtówNie grał w golfa
Udało mi się zdobyć kilka bajtów, używając (nadużywasz?) Funkcji SIGN do wygenerowania pierwszych 3 elementów sekwencji.
źródło
Japt,
252221 bajtówPrzetestuj online!
tło
Trochę trudno jest utworzyć sekwencję Fibonacciego w Japt, ale mamy wbudowaną funkcję,
Mg
która to zrobi za nas. Daje nam to jednak tylko sekwencję Fibonacciego, a nie sekwencję Lucasa. Możemy dość łatwo wykonać sekwencję Lucasa za pomocą tej sztuczki:Jak widać,
F(N-1) + F(N+1)
jest równyL(N)
dla wszystkichN
. Ponieważ jednak potrzebujemy tylko liczb Lucasa na nieparzystych indeksach, możemy połączyć dwie formuły w jedną:Jak to działa
źródło
Mathematica,
5251 bajtówBardzo podobny pomysł do powyższego Martina, spędziłem trochę czasu próbując znaleźć krótszy sposób zdefiniowania „przypadków bazowych” dla funkcji. Interpolacja wielomianowa była popiersiem, więc wybrałem to, używając rozszerzenia do negatywów, aby uzyskać dość krótką definicję.
źródło
Mathematica, 56 bajtów
Bardzo prosta implementacja. Definiuje funkcję pomocnika,
f
a następnie sprawdza, która funkcja ma zastosowanie bez nazwyf
zakresu, aby uzyskać wszystkie wyniki. To niepotrzebnie kłopotliwe.Pojedyncza nienazwana funkcja wydaje się jednak o jeden bajt dłuższa:
źródło
MATL , 17
18bajtówPrawie bezpośrednie tłumaczenie odpowiedzi Martina na CJam .
Wypróbuj online!
źródło
Brachylog , 51 bajtów
Pobiera to liczbę jako dane wejściowe i wypisuje na STDOUT listę ze spacjami oddzielającymi każdą liczbę.
Wyjaśnienie
Wytarcie
!
pierwszej reguły pod predykatu 1 jest konieczne, abyśmy podczas backtrack (\
) nie znaleźli się w nieskończonej pętli, w której interpreter wypróbuje drugą regułę dla danych wejściowych mniejszych niż 4.źródło
Mathematica, 41 bajtów
źródło
Groovy, 50 bajtów
Definiuje to funkcję x, która przyjmuje n jako pierwszy argument i ma podstawowy przypadek pierwszych czterech liczb w sekwencji Fibocas jako domyślny argument dla reszty funkcji.
tutaj jest n. b, c, d i e to kolejne cztery elementy w sekwencji.
Zmniejsza n i powtarza się, aż n jest mniejsze od zera - gdy się powtórzy, dodaje do ostatecznej wartości zwracanej pierwszy element w bieżącej sekwencji. Nowe wartości dla kolejnych czterech elementów w sekwencji są przekazywane do wywołania rekurencyjnego - ostatnie trzy elementy są przenoszone na pierwsze trzy, a nowy czwarty element jest generowany z dwóch poprzednich elementów przy użyciu 3 * db.
Ogranicza nowe wartości za pomocą zagnieżdżeń list, ponieważ groovy może zwrócić wiele wartości, upychając je do listy - więc każde wywołanie zwraca bieżący pierwszy element i wynik rekurencji, która będzie jego własną listą.
źródło
R , 55 bajtów
Wypróbuj online!
źródło
Słupy , 19
To dość bezpośrednie tłumaczenie podejścia Martina.
Jak to działa:
źródło
DUP , 32 bajty
Try it here!
Anonimowa lambda, która pozostawia ciąg liczb na stosie. Stosowanie:
Wyjaśnienie
źródło
Python 2, 71 bajtów
To zdecydowanie wydaje się zbyt długie. Byłem jednak zadowolony, że mogłem użyć
not
operatora bitowego ... dwa razy. Raz jako rodzaj parzystości przewracaj w przód iw tył, a raz, aby zakończyć rekurencję, kiedyn
osiągnie-1
.Zmienna
p
zawsze będzie albo,0
albo-1
będzie na przemian wpisy0
lub-1
lista. (Wybranie wpisu-1
listy Python oznacza wybranie ostatniego elementu.)źródło
Szablon C ++ Meta Programowanie, 130 bajtów
Definicje rekurencyjne jakoś płaczą dla C ++ TMP, użycie:
z
x
byciem tym,A(x)
kogo lubisz.źródło