tło
Większość z was wie, co to jest liczba Fibonacciego . Niektórzy z was mogą wiedzieć, że wszystkie dodatnie liczby całkowite mogą być reprezentowane jako suma jednej lub więcej wyraźnych liczb Fibonacciego, zgodnie z twierdzeniem Zeckendorfa . Jeśli liczba wyrażeń w optymalnej reprezentacji liczb całkowitych Zeckendorfa jest liczbą n
Fibonacciego, nazwiemy n
„potajemnie” Fibonacciego.
Na przykład:
139 = 89 + 34 + 13 + 3
This is a total of 4 integers. Since 4 is not a Fibonacci number, 139 is not secretly Fibonacci
140 = 89 + 34 + 13 + 3 + 1
This is a total of 5 integers. Since 5 is a Fibonacci number, 140 is secretly Fibonacci
Notatki
- Optymalną reprezentację Zeckendorfa można znaleźć za pomocą chciwego algorytmu. Po prostu weź największą liczbę Fibonacciego <= n i odejmij ją od n, aż osiągniesz 0
- Wszystkie liczby Fibonacciego mogą być reprezentowane jako suma 1 liczby Fibonacciego (sama). Ponieważ 1 jest liczbą Fibonacciego, wszystkie liczby Fibonacciego są również potajemnie Fibonacciego.
Wyzwanie
Wyzwaniem jest napisanie programu lub funkcji, która przyjmuje liczbę całkowitą i zwraca, czy ta liczba całkowita jest potajemnie Fibonacciego.
Wkład
Możesz przyjmować dane wejściowe w dowolnym rozsądnym formacie. Możesz założyć, że wejście będzie pojedynczą dodatnią liczbą całkowitą.
Wydajność
Wyprowadź jeden z dwóch różnych wyników dla tego, czy dane wejściowe są potajemnie Fibonacciego. Przykłady obejmują True
/ False
, 1
/ 0
itd.
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach! Standardowe luki są zabronione.
Przypadki testowe
Truthy (secretly Fibonacci)
1
2
4
50
140
300099
Falsey (NOT secretly Fibonacci)
33
53
54
139
118808
źródło
Odpowiedzi:
JavaScript (Node.js) , 54 bajty
Wypróbuj online!
źródło
Python 2 , 77 bajtów
Wypróbuj online!
Wykorzystuje to twierdzenie, że dwa opisy OEIS A003714 są równoważne:
Generujemy wystarczającą liczbę * takich liczb, a następnie wykorzystujemyn ?
z
jako odwzorowanie liczb całkowitych nieujemnych na „ile wyrażeń reprezentujeNastępnie pozostaje sprawdzić, czy
z[n]
jest liczbą Fibonacciego, tjz[z[n]] == 1
.* Przynajmniejn2)+ 1 wydaje się wystarczające, a eksperymentalnie wydaje się wystarczające. Udowodnię to później.
źródło
bin(x)
. Możesz także usunąć jeden, zmieniającrange(n*n+1)
narange(n<<n)
. (Zakładając, że 0 jest nieprawidłowe)bin(x)
, haha. I, hm,1<<n
jest już o wiele więcej niż wystarczający, ale chciałbym, aby środowisko wykonawcze nie było astronomiczneGalaretka , 15 bajtów
Łącze monadyczne przyjmujące nieujemną liczbę całkowitą, która daje wartość
1
„Secretly Fibonacci” i0
inaczej.Wypróbuj online! (zbyt mało wydajny dla większych przypadków testowych)
W jaki sposób?
źródło
R , 83 bajty
Wypróbuj online!
źródło
C # (.NET Core) ,
12411598 bajtówWypróbuj online!
-3 bajty: zmieniono pętlę while na for (dzięki Olivier Grégoire )
-6 bajtów: zmieniono powrót do użycia zmiennej, zainicjowano b i c poza pętlami (dzięki Kevin Cruijssen )
-17 bajtów: zmieniono warunek w drugiej pętli, aby przejść, jeśli poza pętlą i łączymy ze zwracanymi, ponownie używanymi zmiennymi b i c w ostatniej pętli (dzięki raznagul )
Nie golfowany:
źródło
for(;c<=a;b=c-b)c+=b;
zaoszczędzi ci 3 bajty.{}
-brackets swoich pętli i umieścić wszystko wfor
-loops. Ponadto dodałem zmienną,r
którą ustawiliśmy1
w twoimif(e==n)
i powracamy na końcu, więc masz tylko jednąreturn
.e<n
was może przesunąćif
się po pętli i consequentlly połączyć go zreturn
do 101 bajtów .b
iwc
ostatniej pętli oraz usuwającd
ie
.Perl 6 , 58 bajtów
Wypróbuj online!
1, &[+] ... * > $_
jest po prostu sekwencją Fibonacciego, zatrzymaną w dogodnym nieskończonym miejscu (liczba wejściowa).$_, { $^n - (1, &[+] ...^ * > $n).tail } ... 0
jest ciągiem liczb, zaczynającym się od liczby wejściowej, i każdym kolejnym elementem uzyskanym przez odjęcie największej liczby Fibonacciego mniejszej lub równej poprzedniemu elementowi od poprzedniego elementu. Sekwencja kończy się, gdy0
zostanie osiągnięta. Na przykład, jeśli$_
jest140
, to ta sekwencja jest140, 51, 17, 4, 1, 0
.Odejmując jedną z tej sekwencji, traktujemy ją jako liczbę, jej długość, a różnicą jest liczba liczb Fibonacciego, które razem dodane dają liczbę wejściową. Następnie numer ten jest sprawdzany pod kątem członkostwa w pierwszej sekwencji Fibonacciego.
źródło
&[+]
! Fajnie, bez konieczności definiowania dwóch początkowych terminówPerl 6 , 48 bajtów
Wypróbuj online!
Przekształca dane wejściowe na listę Reprezentacji Zeckendorfa wielokrotnie, aż osiągnie jedną liczbę, a następnie sprawdza, czy długość sekwencji była mniejsza niż 4.
Środkowa funkcja Zenckendorf pochodzi głównie z odpowiedzi Seana z kilkoma ulepszeniami.
Wyjaśnienie:
Na przykład, sekwencja dla
2
jest,2 1
ponieważ2
jest już liczbą Fibonacciego. Sekwencja dla140
jest140 5 1
, a ponieważ 5 jest liczbą Fibonacciego, zwraca wartość true. Sekwencja dla33
jest33 4 2 1
, a ponieważ4
nie jest liczbą Fibonacciego, sekwencja ma długość 4.źródło
05AB1E , 14 bajtów
Wypróbuj online . Brak zestawu testów dla wszystkich przypadków testowych, ponieważ
counter_variable
nie można zresetować do zera. Jednak wszystkie ręcznie zweryfikowałem i są poprawne.Wyjaśnienie:
UWAGA:
counter_variable
Byłoby to5
dla danych wejściowych139
i6
danych wejściowych140
, ponieważ abyΔ
-loop sprawdził, czy stos pozostaje taki sam, oczywiście wykonuje dodatkową iterację.źródło
Haskell , 64 bajty
Wypróbuj online!
źródło
Retina 0.8.2 , 61 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
Policz liczbę potrzebnych liczb Fibonacciego.
Pierwsza alternatywa dotyczy liczb Fibonacciego, które są co najmniej 2. Przy pierwszym przejściu
\2
jeszcze nie istnieje, ale na szczęście jest opcjonalna, więc nie musimy jej dopasowywać.\1
też nie istnieje, ale na szczęście mamy alternatywę,\G.
która pasuje do jednej postaci na początku meczu. Oba\2
i\1
dlatego przyjmują wartość 1.Po kolejnych przejściach
\2
istnieje, więc staramy się go dopasować. Tym razem, jeśli się nie powiedzie, to\1
również się nie powiedzie (ponieważ jest większy niż\2
), ale jeśli się powiedzie,(?>)
zapobiega cofnięciu, więc jeśli\2
pasuje, ale\1
nie próbujemy tego\1
. (\G1
zawsze kończy się niepowodzeniem, ponieważ przeszliśmy wcześniej od początku łatki.) W końcu\2
przyjmuje poprzednią wartość parametru\1
while\1
przyjmuje sumę dwóch wartości.Dlatego dopasowujemy jak najwięcej liczb Fibonacciego, jak to możliwe, dodając z biegiem czasu. Ponieważ częściowe sumy sekwencji
1, 2, 3, 5...
są0, 1, 3, 6, 11...
tj. 2 mniejsze niż liczby Fibonacciego, kończymy dopasowując 2 na końcu.To oczywiście nie pasuje do samego 1, więc alternatywa obsługuje tę skrzynkę.
Konwertuj na unary.
Sprawdź, czy jest to liczba Fibonacciego. Wykorzystuje to ten sam pomysł, co w pierwszym teście, ale używa go
^
zamiast\G
i musimy również dokładnie dopasować, więc używa opcjonalnego przechwytywania zamiast zmiany, ponieważ jest to bardziej golfistyczne (ale zwiększa liczbę przechwytywania o 1).Siatkówka , 35 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
Policz liczbę potrzebnych liczb Fibonacciego. (Zapętlanie zarówno konwersji, jak i liczby oszczędza cały bajt przed uzyskaniem liczby pojedynczej).
Wykonaj poprzednie kroki łącznie dwa razy. Pobiera to liczbę Fibonacciego potrzebną do zsumowania liczby Fibonacciego.
Jeśli liczba była potajemnie Fibonacciego, wynik wynosi 1.
źródło
Python 2 ,
146137 bajtówWypróbuj online!
f () to funkcja rekurencyjna, która zwraca wartość n-tej liczby Fibonacciego. Zaczerpnięte z tej odpowiedzi .
g () jest funkcją rekurencyjną, która zwraca reprezentację Zeckendorfa podanej liczby jako listę liczb całkowitych.
Ponieważ wszystkie liczby Fibonacciego będą miały długość powrotu jednego elementu z g (), h () sprawdza, czy długość g () z g (n) == 1.
EDYCJA: Zapisano 9 bajtów dzięki nedla2004 . Ciągle zapominam, że lambdas nie zawsze są najlepszym rozwiązaniem ...
źródło
g
funkcję, aby móc zdefiniowaćf(n-1)
zmienną. Kilka innych zmian od==
do<
których są takie same.