Prawdopodobnie słyszałeś o liczbach Fibonacciego. Wiesz, ta liczba całkowita, która zaczyna się od 1, 1
, a następnie każda nowa liczba jest sumą dwóch ostatnich?
1 1 2 3 5 8 13...
I tak dalej. Wyzwania dotyczące liczb Fibonacciego są tutaj dość popularne . Ale kto mówi, że liczby Fibonacciego muszą zaczynać 1, 1
? Dlaczego nie mogli zacząć 0, 1
? W porządku, zdefiniujmy je na nowo od 0:
0 1 1 2 3 5 8 13...
Ale ... Nie musimy się na tym kończyć! Jeśli możemy dodać dwie ostatnie liczby, aby uzyskać następną, możemy również odjąć pierwszą liczbę od drugiej liczby, aby wstawić nową liczbę. Więc może zacząć od 1, 0
:
1 0 1 1 2 3 5 8 13...
Możemy nawet skończyć z negatywami:
-1 1 0 1 1 2 3 5 8 13...
Ta seria również trwa wiecznie. Myślę, że to ciekawe, jak to się w pewnym sensie odzwierciedla jak zwykłe liczby Fibonacciego, tylko z każdą inną liczbą ujemną:
13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Nazwijmy tę serię „rozszerzoną liczbą Fibonacciego” lub EFN . Ponieważ tak naprawdę nie ma oczywistej liczby ujemnej na początek tej serii, powiemy, że 0 pokazuje się na 0 , zwykłe liczby Fibonacciego rozciągają się na indeksy dodatnie, a ujemne (pół-ujemne?) Liczby Fibonacciego rozciągają się w indeksach ujemnych, tak:
Indices: ...-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
Values: ...13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Prowadzi to do dzisiejszego wyzwania:
Biorąc pod uwagę liczbę całkowitą N , zwraca każdy indeks, przy którym N pojawia się w serii EFN .
Kilka losowych obserwacji tego zadania:
1 pojawia się kilka razy w europejskiej sieci prognozowania niż jakikolwiek inny numer:
[-1, 1, 2]
. Żadna liczba nie pojawi się w więcej niż 3 miejscach.Każda liczba Fibonacciego> 1 pojawi się raz (3, 8, 21 itd.) Lub dwa razy (2, 5, 13 itd.)
Wyjaśnienie reguł:
- Jeśli
abs(N)
nie jest liczbą Fibonacciego, nigdy nie pojawi się w serii EFN , więc nie możesz nic wypisać / pustej kolekcji, jeśli to możliwe, lub jeśli nie jest to możliwe w twoim języku, możesz wygenerować pewną stałą wartość nienumeryczną. - Jeśli N pojawia się w wielu miejscach w EFN , dane wyjściowe nie muszą być sortowane. Chociaż każdy indeks musi pojawić się dokładnie raz.
- Chociaż większość wyzwań sekwencyjnych pozwala wybrać, czy chcesz używać indeksowania opartego na 1, czy 0, wyzwanie to musi wykorzystywać opisaną indeksację (gdzie 0 pojawia się przy 0).
- Możesz wziąć we / wy w dowolnym standardowym formacie.
Przypadki testowe
-13: []
-12: []
-11: []
-10: []
-9: []
-8: [-6]
-7: []
-6: []
-5: []
-4: []
-3: [-4]
-2: []
-1: [-2]
0: 0
1: [-1, 1, 2]
2: [-3, 3]
3: [4]
4: []
5: [-5, 5]
6: []
7: []
8: [6]
9: []
10: []
11: []
12: []
13: [-7, 7]
I niektóre większe przypadki testowe:
89: [-11, 11]
1836311903: [46]
10000: []
-39088169: [-38]
Jak zwykle, najkrótsza odpowiedź w bajtach wygrywa!
Odpowiedzi:
Haskell , 78 bajtów
4 bajty zapisane dzięki nim
Wypróbuj online!
Najpierw musimy założyć
(#)
,(#)
przyjmuje dwa parametry,a
ib
, i zwraca listę zaczynająca
a następnieb#(a-b)
. To tworzy nieskończoną listę, ale ponieważ Haskell jest leniwy, nie musimy się martwić, że zapętli się na zawsze. To zasadniczo działa wstecz, tworząc sekwencję Fibonacciego przed określoną parą. Na przykład(0#1)
byłaby lista wszystkich liczb Fibonacciego z indeksem ujemnym.Stąd robimy
f
.f
przyjmuje argument,a
który jest liczbą, którą próbujemy znaleźć w sekwencji. W tym celu używamydo
notacji, aby wykonać analizę listy. Zaczynamy od pierwszycha*a+1
elementów listy0#1
1 . Ponieważ funkcjaa*a+1
rośnie szybciej niż odwrotność sekwencji Fibonacciego, możemy być pewni, że jeśli sprawdzimy w tym zakresie, znajdziemy wszystkie wyniki. Uniemożliwia nam to wyszukiwanie nieskończonej listy. Następnie dla każdej wartościx
i indeksui
, jeślix==a
znaleźliśmya
w ujemnej połowie sekwencji, więc wrócimy-i
, a jeśli równieżabs x==a
wrócimy,i
ponieważ wartość bezwzględna połowy ujemnej jest połową dodatnią, więc znaleźliśmy ją.Ponieważ to sprawia, że lista
[0,0]
na0
stałe kodujemy poprawne wyjście dla tego.1: Ta sztuczka pochodzi od „czystej” odpowiedzi . Te same aplies tutaj SpeedUp jak tam wymienić
a*a+1
zabs a+1
zaoszczędzić sporo czasu.źródło
u
za#b=a:b#(a-b)
plusem0#1
zapisuje bajt: Spróbuj online!Czysty ,
132120109 bajtówWypróbuj online!
g :: Int -> Int
jest funkcją Fibonacciego.? :: Int -> [Int]
tylko indeksy do elementów europejskiej sieci prognozowania promieniuk^2+1
od0
.Aby uzyskać wersję, która działa w rozsądnym czasie, zmień
k*k+1
naabs k+1
.źródło
Galaretka , 11 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
9493 bajtyWypróbuj online!
źródło
APL (Dyalog Classic) ,
5250 bajtówWymaga
⎕IO←0
Wypróbuj online!
źródło
Retina 0.8.2 ,
104102 bajtówWypróbuj online! Wyjaśnienie:
Konwertuj na unary, chyba że wartość wejściowa wynosi zero
Oblicz indeks Fibonacciego wartości bezwzględnej, ale jeśli liczba nie jest liczbą Fibonacciego, usuń ją, chyba że była równa zero. To używa wyrażenia regularnego @ Fibonacciego @ MartinEndera.
Usuń liczby ujemne, których wartości bezwzględne są nieparzystymi liczbami Fibonacciego.
Dodaj ujemne wskaźniki dla nieparzystych dodatnich liczb Fibonacciego.
Konwertuj na dziesiętny.
Dodaj dodatkowe wskaźniki dla
1
.źródło
Właściwie 34 bajty
Brutalna siła ratuje dzień
Wyjaśnienie:
Wypróbuj online!
źródło
Python 3 , 92 bajty
Wypróbuj online!
Zwraca zestaw indeksów.
źródło
Python 2 ,
8785 bajtówWypróbuj online!
źródło
05AB1E , 36 bajtów
Musi być lepsze podejście
0
.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Kilka przykładów krok po kroku:
źródło
Python 2 ,
959294 bajtyWypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 144 bajty
Wypróbuj online!
źródło