Czy jestem liczbą Fibonacciego?

49

Twoje zadanie:

Napisz program lub funkcję, aby sprawdzić, czy wprowadzona liczba jest liczbą Fibonacciego . Liczba Fibonacciego to liczba zawarta w sekwencji Fibonacciego.

Sekwencja Fibonacciego jest zdefiniowana jako: F(n) = F(n - 1) + F(n - 2)

Z nasionami F(0) = 0i F(1) = 1.

Wejście:

Nieujemna liczba całkowita od 0 do 1 000 000 000, która może, ale nie musi być liczbą Fibonacciego.

Wynik:

Wartość true / falsy wskazująca, czy dane wejściowe są liczbą Fibonacciego.

Przykłady:

0-->truthy
1-->truthy
2-->truthy
12-->falsy

Punktacja:

To jest , wygrywa najmniej bajtów.

Gryphon - Przywróć Monikę
źródło
2
Język programowania, którego używam, obsługuje tylko liczby do 9999 (Geometry Dash). Czy jest w porządku, jeśli założę, że teoretycznie obsługuje liczby do 1000000?
MilkyWay90

Odpowiedzi:

36

Neim , 2 bajty

f𝕚

Wyjaśnienie:

f       Push an infinite fibonacci list
 𝕚      Is the input in that list?

Działa tak samo jak moja odpowiedź To Hip to Square , ale używa innej nieskończonej listy: fdla Fibonacciego.

Spróbuj!

Okx
źródło
1
Łał! Imponujący wynik.
Gryphon - Przywróć Monikę
2
To świetnie, ale nie 2 bajty. W UTF-8 jest reprezentowany jako „66 F0 9D 95 9A”
sm4rk0
10
@ sm4rk0 To świetnie, ale się mylisz. Neim używa niestandardowej strony kodowej , więc bajtowa reprezentacja to66 D5
Okx
Czy ta pętla nie jest wieczna, jeśli danych wejściowych nie ma na liście? Jeśli tak, to czy liczy się to jako falsey?
Enrico Borba,
@EnricoBorba Neim wie, że n-ty element na tej nieskończonej liście zawsze będzie równy lub mniejszy niż n + 1-ty element na liście. Dlatego może się złapać i nie będzie działać wiecznie. Czy próbowałeś tego programu? : P
Okx
18

JavaScript (ES6), 34 bajty

f=(n,x=0,y=1)=>x<n?f(n,y,x+y):x==n

Rekurencyjnie generuje sekwencję Fibonacciego, aż znajdzie element większy lub równy wejściowi, a następnie zwraca element == wejście.

ETHprodukcje
źródło
Uwaga: naiwne rekurencyjne obliczenie sekwencji Fibonacciego to O (Fib (n)) - około O (1,6 ^ n)
Alnitak
f = n => n? n> 2? f (n-1) + f (n-2): 1: 0 28 bajtów
jackkav
@jackkav Dzięki, ale wyzwaniem jest ustalenie, czy dane wejściowe liczbą Fibonacciego.
ETHprodukcje
12

Siatkówka , 23 bajty

^$|^(^1|(?>\2?)(\1))*1$

Wypróbuj online!

Wejście w jednostkowej, wyjściowej 0lub 1.

Wyjaśnienie

Sekwencja Fibonacciego jest dobrym kandydatem do rozwiązania z referencjami do przodu, tj. „Referencją wsteczną”, która odnosi się albo do otaczającej grupy, albo do grupy, która pojawia się później w wyrażeniu regularnym (w tym przypadku faktycznie używamy obu z nich). Przy dopasowywaniu takich liczb, musimy znaleźć wyrażenie rekurencyjne dla różnicy między elementami sekwencji. Np. Aby dopasować liczby trójkątne, zwykle dopasowujemy poprzedni segment plus jeden. Aby dopasować liczby kwadratowe (których różnicami są liczby nieparzyste), dopasowujemy poprzedni segment plus dwa.

Ponieważ liczby Fibonacciego uzyskujemy przez dodanie elementu ostatniego do ostatniego, różnice między nimi są również tylko liczbami Fibonacciego. Musimy więc dopasować każdy segment jako sumę dwóch poprzednich. Rdzeń wyrażenia regularnego jest następujący:

(         # This is group 1 which is repeated 0 or more times. On each
          # iteration it matches one Fibonacci number.
  ^1      # On the first iteration, we simply match 1 as the base case.
|         # Afterwards, the ^ can no longer match so the second alternative
          # is used.
  (?>\2?) # If possible, match group 2. This ends up being the Fibonacci
          # number before the last. The reason we need to make this optional
          # is that this group isn't defined yet on the second iteration.
          # The reason we wrap it in an atomic group is to prevent backtracking:
          # if group 2 exists, we *have* to include it in the match, otherwise
          # we would allow smaller increments.
  (\1)    # Finally, match the previous Fibonacci number and store it in
          # group 2 so that it becomes the second-to-last Fibonacci number
          # in the next iteration.
)*

Teraz kończy się dodając numery Fibonacciego zaczynając od 1 , czyli 1, 1, 2, 3, 5, ... . Ci dodać do 1, 2, 4, 7, 12, ... . To znaczy, że są one o jeden mniejsze niż liczby Fibonacciego, więc dodajemy 1na końcu. Jedynym przypadkiem, którego to nie obejmuje, jest zero, więc ^$na początku mamy alternatywę.

Martin Ender
źródło
2
Bardzo elegancko! Chciałbym jedynie zaznaczyć, że dla skrótu można go skrócić do 20 bajtów w PCRE za pomocą kwantyfikatora dzierżawczego:^$|^(^1|\2?+(\1))*1$
Deadcode
1
@Deadcode Tęsknię za nimi bardzo w .NET;)
Martin Ender
Zapisz 1 bajt, usuwając niepotrzebną sekundę ^.
Neil
12

Regex (smak ECMAScript), 392 358 328 224 206 165 bajtów

Techniki, które muszą wejść w grę, aby dopasować liczby Fibonacciego do wyrażenia regularnego ECMAScript (jednostronnie), są dalekie od tego, jak najlepiej to zrobić w większości innych smaków wyrażeń regularnych. Brak odwołań do przodu / zagnieżdżonych wstecz lub rekurencji oznacza, że ​​nie można bezpośrednio policzyć ani zachować bieżącej sumy czegokolwiek. Brak wyglądu sprawia, że ​​często jest to wyzwanie, nawet mając wystarczająco dużo miejsca do pracy.

Do wielu problemów należy podchodzić z zupełnie innej perspektywy i wydają się nierozwiązywalne aż do pojawienia się jakiegoś kluczowego wglądu. Zmusza cię to do rzucenia znacznie szerszej sieci w celu znalezienia, które matematyczne właściwości liczb, z którymi pracujesz, mogą być wykorzystane do rozwiązania konkretnego problemu.

W marcu 2014 r. Stało się tak w przypadku liczb Fibonacciego. Patrząc na stronę Wikipedii, początkowo nie mogłem znaleźć sposobu, chociaż jedna konkretna właściwość wydawała się kusząco blisko. Następnie matematyk teukon nakreślił metodę, która wyraźnie dała do zrozumienia, że ​​można to zrobić, używając tej właściwości razem z inną. Nie chciał skonstruować wyrażenia regularnego. Jego reakcja, kiedy poszedłem naprzód i to zrobiłem:

Jesteś szalony! ... Myślałem, że możesz to zrobić.

Podobnie jak w przypadku moich innych jednoargumentowych wyrażeń regularnych ECMAScript, ostrzeżę : Gorąco zalecam naukę rozwiązywania pojedynczych problemów matematycznych w wyrażeniach regularnych ECMAScript. To była dla mnie fascynująca podróż i nie chcę zepsuć jej nikomu, kto mógłby potencjalnie chcieć spróbować samemu, szczególnie tym, którzy interesują się teorią liczb. Zobacz ten post, aby uzyskać listę zalecanych problemów oznaczonych spoilerem do rozwiązania jeden po drugim.

Więc nie czytaj dalej, jeśli nie chcesz, aby zepsuła Ci się magia wyrażeń regularnych . Jeśli chcesz spróbować samodzielnie odkryć tę magię, zdecydowanie polecam zacząć od rozwiązania niektórych problemów z wyrażeniem regularnym ECMAScript, jak opisano w linku powyżej.

Wyzwanie, z którym początkowo się zmierzyłem: dodatnia liczba całkowita x jest liczbą Fibonacciego tylko wtedy, gdy 5x 2 + 4 i / lub 5x 2 - 4 to idealny kwadrat. Ale nie ma miejsca na obliczenie tego w wyrażeniu regularnym. Jedyne miejsce, w którym musimy pracować, to sam numer. Nie mamy nawet dość miejsca, aby pomnożyć przez 5 lub wziąć kwadrat, nie mówiąc już o obu.

pomysł teukona na to, jak go rozwiązać ( pierwotnie opublikowany tutaj ):

Wyrażenie regularne jest prezentowane z ciągiem postaci ^x*$, niech z będzie jego długością. Sprawdź, czy z jest jedną z pierwszych kilku liczb Fibonacciego ręcznie (do 21 powinno wystarczyć). Jeżeli nie jest:

  1. Przeczytaj kilka liczb, a <b, tak aby b nie było większe niż 2a.
  2. Wykorzystaj prognozy na przyszłość, aby zbudować 2 , ab i b 2 .
  3. Upewnij się, że 5a 2 + 4 lub 5a 2 - 4 to idealny kwadrat (więc dla niektórych n musi być F n-1 ).
  4. Upewnij się, że albo 5b 2 + 4, albo 5b 2 + 4 to idealny kwadrat (więc b musi być F n ).
  5. Sprawdź, czy z = F 2n + 3 lub z = F 2n + 4 , używając wcześniej zbudowanego 2 , ab i b 2 oraz tożsamości:
    • F 2n-1 = F n 2 + F n-1 2
    • F 2n = (2F n-1 + Fn ) F n
W skrócie: te tożsamości pozwalają nam zmniejszyć problem sprawdzania, czy dana liczba to Fibonacciego, do sprawdzania, czy para znacznie mniejszych liczb to Fibonacciego. Mała algebra pokaże, że dla wystarczająco dużej n (n = 3 powinno wystarczyć), F 2n + 3 > F n + 5F n 2 + 4, więc zawsze powinno być wystarczająco dużo miejsca.

A oto makieta algorytmu w C, który napisałem jako test przed zaimplementowaniem go w regexie.

Więc bez zbędnych ceregieli, oto regex:

^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$

Wypróbuj online!

I ładnie wydrukowana, skomentowana wersja:

^(
  (?=
    (x*)                   # \2+1 = potential number for which 5*(\2+1)^2 ± 4
                           # is a perfect square; this is true iff \2+1 is a Fibonacci
                           # number. Outside the surrounding lookahead block, \2+1 is
                           # guaranteed to be the largest number for which this is true
                           # such that \2 + 5*(\2+1)^2 + 4 fits into the main number.
    .*
    (?=                    # tail = (\2+1) * (\2+1) * 5 + 4
      x{4}
      (                    # \3 = (\2+1) * 5
        x{5}
        (\2{5})            # \4 = \2 * 5
      )
      (?=\3*$)
      \4+$
    )
    (|x{4})                # \5 = parity - determined by whether the index of Fibonacci
                           #               number \2+1 is odd or even
    (?=xx (x*)(\6 x?))     # \6 = arithmetic mean of (\2+1) * (\2+1) * 5 and \8 * \8,
                           #      divided by 2
                           # \7 = the other half, including remainder
    \5
    # require that the current tail is a perfect square
    (x(x*))                # \8 = potential square root, which will be the square root
                           #      outside the surrounding lookahead; \9 = \8-1
    (?=(\8*)\9+$)          # \10 = must be zero for \8 to be a valid square root
    (?=\8*$\10)
    \8*
    (?=(x\2\9+$))          # \11 = result of multiplying \8 * (\2+1), where \8 is larger
    (x*)\12                # \12 = \11 / 2; the remainder will always be the same as it
                           #       is in \7, because \8 is odd iff \2+1 is odd
  )
  \7\11
  (
    \6\11
  |
    \12
  )
|
  x{0,3}|x{5}|x{8}|x{21}   # The Fibonacci numbers 0, 1, 2, 3, 5, 8, 21 cannot be handled
                           # by our main algorithm, so match them here; note, as it so
                           # happens the main algorithm does match 13, so that doesn't
                           # need to be handled here.
)$

Algorytm mnożenia nie jest wyjaśniony w tych komentarzach, ale jest krótko wyjaśniony w akapicie mojego obfitego numeru wyrażenia regularnego .

Utrzymywałem sześć różnych wersji wyrażenia Fibonacciego: cztery, które zapadają od najkrótszej do największej prędkości i używają algorytmu wyjaśnionego powyżej, oraz dwie inne, które używają innego, znacznie szybszego, ale o wiele dłuższego algorytmu, który, jak się przekonałem, może faktycznie powrócić indeks Fibonacciego jako dopasowanie (objaśnienie tego algorytmu jest poza zakresem tego postu, ale wyjaśniono to w oryginalnej dyskusji Gist ). Nie sądzę, bym zachował tak wiele bardzo podobnych wersji wyrażenia regularnego, ponieważ w tym czasie przeprowadzałem wszystkie testy w PCRE i Perlu, ale mój silnik wyrażeń regularnych jest wystarczająco szybki, aby obawy o szybkość nie były już tak ważne (a jeśli konkretny konstrukt powoduje wąskie gardło, mogę dodać dla niego optymalizację) - choć prawdopodobnie ponownie utrzymałbym jedną najszybszą wersję i jedną najkrótszą wersję, jeśli różnica w prędkości były wystarczająco duże.

Wersja „zwraca indeks Fibonacciego minus 1 jako dopasowanie” (niezbyt mocno golfa):

Wypróbuj online!

Wszystkie wersje są na github z pełną historią zatwierdzeń optymalizacji golfa:

regex do dopasowania liczb Fibonacciego - krótkie, prędkość 0.txt (najkrótszą ale najwolniejszy jeden, jak w tym poście)
regex do dopasowania liczb Fibonacciego - krótkie, prędkość 1.txt
regex do dopasowania liczb Fibonacciego - krótki, prędkość 2.txt
regex dopasowania liczby Fibonacciego - krótki, prędkość 3.txt
regex do dopasowania liczb Fibonacciego - fastest.txt
regex do dopasowania liczb Fibonacciego - powrót index.txt

Deadcode
źródło
9

Python 3 , 48 bajtów

lambda n:0in((5*n*n+4)**.5%1,abs(5*n*n-4)**.5%1)

Wypróbuj online!

Dennis
źródło
1
Jako Python nie powinien on działać, biorąc pod uwagę wystarczającą ilość zasobów, dla dowolnie dużych danych wejściowych?
Jonathan Allan
2
Zawsze miałem wrażenie, że możemy użyć dowolnego algorytmu tak długo, jak chcemy, ponieważ działa on w praktyce, jeśli obliczenia pasują do typu danych i teoretycznie z nieskończoną precyzją. Jasne, użycie tylko intzwiększyłoby poprzeczkę (wciąż nie jest arbitralnie duże), ale nie zmuszamy również odpowiedzi C do korzystania z 64-bitowych liczb całkowitych (lub 128-bitowych z gcc). W każdym razie pozwolenie na użycie tego samego algorytmu w jednym języku, ale nie w innym, wydaje się nonsensowne.
Dennis
Widok algorytmiczny ma sens (zawsze myślałem, że to domena wejściowa dyktuje kryteria „dopasowania do typu danych”). Jedyną rzeczą, na którą należy zwrócić uwagę, jest szara strefa między ideą algorytmu a jego implementacją. Tutaj można sprawdzić, czy jedna z liczb całkowitych jest kwadratowa, bez rzutowania na liczby zmiennoprzecinkowe. Wydaje mi się, że wewnętrzna obsada jako efekt uboczny jest akceptowalna, pod warunkiem, że jest częścią legalnego, działającego algorytmu (... i jestem prawie pewien, że algorytm, który polegał na obsadzie, byłby nie do przyjęcia).
Jonathan Allan
@JonathanAllan Ponieważ maksymalna wartość do obsłużenia wynosi 1e9, nie sądzę, że arbitralnie duże dane wejściowe byłyby problemem.
JAD
1
@JarkoDubbeldam tak, ten szczegół został faktycznie zmieniony po moim komentarzu.
Jonathan Allan
7

Python 2, 48 44 bajtów

f=lambda n,a=0,b=1:n>a and f(n,b,a+b)or n==a

Wypróbuj online

Podziękowania dla Jonathana Allana za uratowanie 4 bajtów

mbomb007
źródło
Może to być 47 bajtów, jeśli mogą być Falseprawdziwe wartości i wartości fałsz True: TIO!
Pan Xcoder,
Można również użyć n-azamiast n==ai mieć -1 i 0 jako wartości zwracane.
Magic Octopus Urn
@carusocomputing Miałem to w swojej historii edycji, ale to nie działa, ponieważ w przypadku większych wartości testowych możesz -101zamiast tego uzyskać inny wynik -1.
mbomb007
@ Mr.Xcoder, czy naprawdę uważasz, że oszczędność 1 bajtu jest warta rozsądku dla wszystkich?
frarugi87
1
@ frarugi87 Oszczędzanie bajtu jest zawsze tego warte
Pan Xcoder
7

05AB1E , 8 7 bajtów

>ÅF¹å¹m

Wyjaśnienie:

>ÅF       # Generate Fibbonacci numbers up to n+1
   ¹å     # 0 if original isn't in the list, 1 if it is
     ¹m   # 0**0 = 1 if input was 0 (hotfix for 0).
          # or 0**n if not fibb / 1**n if it is a fibb.

Wypróbuj online!

-1 dzięki Jonathanowi Allanowi za obejście problemu 0-nie-a-fibonacciego.

Urna Magicznej Ośmiornicy
źródło
W rzeczywistości nie będzie aktualizowany do 6 bajtów. Nie mogę uwierzyć, że nie ma sposobu, aby dodać 0 do listy poniżej 3 bajtów.
Magic Octopus Urn
@JonathanAllan „funkcja generowania Fibbonacciego” w 05AB1E nie zawiera 0.
Magic Octopus Urn
@JonathanAllan Rozumiem teraz, fajny pomysł. Zajęło mi chwilę, żeby dowiedzieć się, co się tam właściwie dzieje.
Magic Octopus Urn
Czy nie wystarczy wygenerować upto n(oszczędzając bajt), ponieważ ÅFjest to włącznie i ¹åprzyniosłoby to w 0obu przypadkach n=0?
Emigna
0AF = []. 1AF = [1,1]. Więc najwyraźniej nie.
Magic Octopus Urn
5

Perl 6 , 23 bajtów

{$_∈(0,1,*+*...*>$_)}
Sean
źródło
{(0,1,*+*...^*>$_).tail==$_}było to, co zamierzałem początkowo opublikować. Być może w końcu udało mi się dotrzeć do operatorów zestawów .
Brad Gilbert b2gills
5

Poważnie , 3 bajty

,fu

Wypróbuj online!

Zwraca indeks +1 na liście liczb Fibonacciego, jeśli jest prawdziwy, w przeciwnym razie zwraca fałsz.

Wyjaśnienie:

,fu
,   read input
 f  0-indexed index of that number in the fibonacci sequence (-1 if not in the sequence)
  u increment. (Makes the -1 value falsy and the 0-value truthy)
Towarzyszu SparklePony
źródło
9
Poważnie niegrzeczny ^^
Jonathan Allan
5

Galaretka ,  8 7  6 bajtów

-r‘ÆḞċ

Wypróbuj online!

W jaki sposób?

-r‘ÆḞċ - Link: non negative number, n
-      - literal -1      = -1
 r     - inclusive range = [-1,0,1,2,3,4,5,...,n]
  ‘    - increment n     = [ 0,1,2,3,4,5,6,...,n+1]
   ÆḞ  - Fibonacci       = [ 0,1,1,2,3,5,8,...,fib(n+1)]
     ċ - count occurrences of n (1 if n is a Fibonacci number, 0 otherwise)

Uwagi:

  • przyrost, potrzebna jest więc to działa na 2 i 3 , ponieważ są to 3 rd i 4 th Liczby Fibonacciego - ponad 3 wszystkie liczby Fibonacciego są większe niż ich indeksu.
  • -jest potrzebna (a nie tylko ‘R), tak to działa na 0 od 0 to 0 th liczba Fibonacciego;
Jonathan Allan
źródło
Umm, to wygląda zbyt podobnie do mojej odpowiedzi ...
Erik the Outgolfer
Och, grałem w golfa w moje do twojego, z wyjątkiem moich prac dla 3:)
Jonathan Allan
Ojej ... Fibonacci jest dziwny. (btw
usunąłem
Czy jesteś pewien tej ostatniej nuty? Kiedy uruchamiam atom Fibonacciego na liście zaczynającej się od 0, 0 jest uwzględniane w danych wyjściowych.
rozproszyć
1
Nie wydaje się być odpowiedni na podstawie sformułowania wyzwania, ale jeśli użyjesz atomu liczenia z 1 jako argumentu na liście liczb Fibonacciego, wynik to 2 (nie 1).
FryAmTheEggman
5

ZX81 BASIC 180 151 100 ~ 94 tokenizowanych bajtów BASIC

Dzięki Moggy na forach SinclairZXWorld, jest to o wiele fajniejsze rozwiązanie, które oszczędza więcej bajtów.

 1 INPUT I
 2 FOR F=NOT PI TO VAL "1E9"
 3 LET R=INT (VAL ".5"+(((SQR VAL "5"+SGN PI)/VAL "2")**I)/SQR VAL "5")
 4 IF R>=I THEN PRINT F=R
 5 IF R<I THEN NEXT F

To da 1, jeśli wprowadzono liczbę Fibonacciego, lub zero, jeśli nie. Chociaż oszczędza to bajty, jest znacznie wolniejsze niż stare rozwiązania poniżej. Aby uzyskać szybkość (ale więcej BASIC bajtów) usuń VALopakowania wokół literalnych liczb ciągu. Oto stare (er) rozwiązania z kilkoma objaśnieniami:

 1 INPUT A$
 2 LET A=SGN PI
 3 LET B=A
 4 LET F=VAL A$
 5 IF F>SGN PI THEN FOR I=NOT PI TO VAL "1E9"
 6 LET C=A+B
 7 LET A=B
 8 LET B=C
 9 IF B>=F THEN GOTO CODE "£"
10 IF F THEN NEXT I
12 PRINT STR$(SGN PI*(B=F OR F<=SGN PI)) AND F>=NOT PI;"0" AND F<NOT PI

Powyższe poprawki oszczędzają dalsze BASIC bajty do zagęszczenia IFinstrukcji w jeden PRINTwiersz 12; inne bajty zostały zapisane przy użyciu VALsłowa kluczowego i przy użyciu GOTO CODE "£", który w zestawie znaków ZX81 ma wartość 12. Ciągi zapisują więcej bajtów nad liczbami, ponieważ wszystkie wartości liczbowe są przechowywane jako liczby zmiennoprzecinkowe, dlatego zajmują więcej miejsca na stosie VAR.

wprowadź opis zdjęcia tutaj

Shaun Bebbers
źródło
Właściwie mógłbym zapisać kolejne 6 tokenizowanych bajtów BASIC, usuwając całkowicie wiersz 6 i zmieniając wiersz 5 na 5 IF R<F THEN NEXT I- mój zły!
Shaun Bebbers
4

C #, 109 bajtów

bool f(int n){int[]i=new[]{0,1,0};while(i[0]<n||i[1]<n){i[i[2]%2]=i[0]+i[1];i[2]++;}return n==i[0]||n==i[1];}

Zdecydowanie można to poprawić, ale nie miałem czasu.

Dziecko kaito
źródło
Witamy w PPCG!
Martin Ender
1
Napisałem własną odpowiedź, aby zdać sobie sprawę, że była taka sama jak twoja. Możesz użyć wyrażeń lambda i prostych zmiennych, aby uzyskać: n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}(tylko 80 bajtów). Wypróbuj online!
Charlie
1
@CarlosAlejo Zaoszczędź na tym kolejne 2 bajty za pomocą a+=bzamiast a=a+bi b+=azamiast b=a+b.
TheLethalCoder
4

> <> , 21 19 + 3 = 24 22 bajtów

i1\{=n;
?!\:@+:{:}(

Dane wejściowe powinny znajdować się na stosie podczas uruchamiania programu, więc +3 bajty dla -vflagi.

Wypróbuj online!

Działa to poprzez generowanie liczb Fibonacciego, aż będą większe lub równe liczbie wejściowej, a następnie sprawdzanie, czy ostatnio wygenerowana liczba jest równa z danymi wejściowymi. Wyprowadza, 1jeśli była to liczba Fibonacciego, w 0przeciwnym razie.

Aby upewnić się, że 0jest obsługiwany poprawnie, ziarno jest -1 1- pierwsza wygenerowana liczba będzie 0raczej niż 1.

Dzięki @cole za wskazanie, którego imożna użyć do wypchnięcia -1na stos, gdy STDIN jest pusty. Bardzo mądry!

Poprzednia wersja:

01-1\{=n;
}(?!\:@+:{:
Sok
źródło
Teraz czuję się głupio z powodu marnowania bajtów na ciągłe sprawdzanie każdej wygenerowanej liczby. Ładnie wykonane!
Emigna
1
22 bajtów używając izamiast 01-.
cole
@cole oczywiście, używając ijak -1wtedy, gdy nie ma danych wejściowych do STDIN, nie rozważyłem tego. Ładnie wykonane!
Sok
3

Mathematica, 37 bajtów

!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&

-4 bajty z @ngenisis

J42161217
źródło
Fibonacci[0]daje 0, więc możesz oszczędzać 4bajty, włączając się 0w Tablezakres. Możesz zapisać kolejny bajt, używając notacji Table!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
infix
3

MATL (16 bajtów)

2^5*4-t8+hX^tk=s

Wypróbuj online!

Nie jest to najbardziej golfowe rozwiązanie, ale chciałem zastosować bezpośrednią metodę sprawdzenia, czy „5 * x ^ 2 +/- 4” to idealny kwadrat .

Wyjaśnienie:

2^5*    % 5 times the input squared
4-      % push the above minus 4
t8+     % push the above plus 8 (+4 overall)
hX^     % concatenate them into an array and then take the sqrt().
tk      % push a copy of the array that is rounded using floor().
=       % test if the sqrt's were already integers
s       % sum the results, returns 0 if neither was a perfect square.

Uwaga:

W przypadku „0” zwraca „2”, ponieważ zarówno 4, jak i -4 są idealnymi kwadratami, tak samo jak 1, co daje „1 1”. Rozważ każde niezerowe wyjście jako „prawdę”, a 0 jako „fałsz”.

DrQuarius
źródło
3

PHP , 44 bajty

for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;

Wypróbuj online!

PHP , 58 bajtów

for($x=0,$y=1;$x<$argn;$x=$y,$y=$t)$t=$x+$y;echo$x==$argn;

Wypróbuj online!

Jörg Hülsermann
źródło
2
Golfed więcej: for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;.
user63956,
@ user63956 Dziękujemy za wysiłek związany z uczeniem się przy przypisywaniu zmiennych łańcuchowych
Jörg Hülsermann
3

Java, 72 69 68 63 59 55 50 49 bajtów

n->{int a=0,b=1;for(;a<n;a=b-a)b+=a;return a==n;}

Sprawdź to sam!

Alternatywa (wciąż 49 bajtów)

n->{int a=0,b=1;for(;a<n;b=a+(a=b));return a==n;}

Niezbyt oryginalny: jest to prosta i podstawowa wersja iteracyjna.

Działa to dla liczb do 1 836 311,903 (47-ta liczba Fibonacciego) włącznie. Ponadto wynik jest niezdefiniowany (w tym potencjalna nieskończona pętla).

Podziękowania dla Kevina Cruijssena i Davida Conrada za pomoc w grze w golfa :)

Olivier Grégoire
źródło
1
Niezłe podejście. Przy okazji, możesz zagrać w bajt, zmieniając n==0na n<1. W pytaniu jest napisane „ Nieujemna liczba całkowita od 0 do 1 000 000 000 ”.
Kevin Cruijssen
1
@KevinCruijssen Grałem w golfa nie 1, ale 5 bajtów z tą klauzulą! :-P Dzięki, nie zauważyłem tego.
Olivier Grégoire,
2
Nie potrzebujesz zmiennej temp dla sekwencji Fibonacciego. Możesz obliczyć kolejne pary za pomocąb+=a;a=b-a;
David Conrad
1
Robisz czarną magię, @DavidConrad! Mówię ci! Czarna magia! :)
Olivier Grégoire
3

C # (.NET Core) , 51 bajtów

bool f(int n,int a=0,int b=1)=>a<n?f(n,b,a+b):a==n;

Wypróbuj online!

-6 bajtów dzięki @Oliver!

To rozwiązanie wykorzystuje dość prostą funkcję rekurencyjną.

  • Zmienna nto liczba do przetestowania.
  • Zmienne ai bsą 2 najnowszymi liczbami w sekwencji.
  • Sprawdza, czy pierwszy z 2 ostatnich numerów jest mniejszy niż wejście. W takim przypadku nawiązywane jest rekurencyjne połączenie z następnymi numerami w serii.
  • W przeciwnym razie sprawdź, czy pierwsza liczba jest równa wartości wejściowej, i zwróć wynik.

Łącze TIO pokazuje, że działa on dla 1134903170, który przekracza maksymalną wartość wymaganą przez wyzwanie.

dana
źródło
Miło jest ostatnio widzieć rozwiązania C # :) - Myślę, że możesz po prostu sprawdzić, czy a<ndla 51 bajtów
Oliver
Dzięki! I fajna wskazówka :)
dana
3

Alchemist , 205 134 bajtów

Ogromne podziękowania dla ASCII tylko za dość sprytne scalanie stanów, oszczędzając 71 bajtów !!

_->In_x+c+u
u+b->u+a+d
u+0b->v
v+c->v+b+d
v+0c->w
w+a+x->w+y
w+0a+0x->Out_"1"
w+a+0x->Out_"0"
w+0a+x+y->w+2x
w+0a+0y+d->w+c
w+0d+0a->u

Wypróbuj online lub sprawdź partię!

Bez golfa

# read input, initialize (c = 1)
_ -> In_x + c + s0

# a,d <- b
s0 +  b -> s0 + a + d
s0 + 0b -> s1

# b,d <- c
s1 +  c -> s1 + b + d
s1 + 0c -> s2

s2 +  a +  x -> s2 + y            # y <- min(a,x)
s2 + 0a + 0x -> Out_"1"           # if (a == x): was Fibonacci
s2 +  a + 0x -> Out_"0"           # if (a >  x): stop (we exceeded target)
s2 + 0a +  x +  y -> s2 + 2x      # if (a <  x): x += a (since y = a) / restore x
s2 + 0a      + 0y +  d -> s2 + c  # once that's done; c <- d
s2 + 0a           + 0d->s0        # and finally loop
ბიმო
źródło
139 . możesz usunąć niektóre 0kontrole pod kątem mniejszej liczby bajtów kosztem niedeterminizmu
tylko ASCII
129
Tylko ASCII,
@ Tylko ASCII: To całkiem miłe! bBłąd kończy się na 0, ale brak dodania -atomu podczas inicjalizacji naprawia go (i zapisuje 2 bajty): D Dzięki
ბიმო
2

Galaretka , 5 bajtów

ȷḶÆḞi

Wypróbuj online!

Zwraca 0 dla liczb innych niż Fibonacciego, a 1-indeksowana pozycja liczby w sekwencji Fibonacciego dla liczb Fibonacciego.

Wyjaśnienie:

ȷḶÆḞi
ȷ        The literal number 1000
 Ḷ       Range [0,1,...,999]
  ÆḞ     Get the ith Fib number; vectorizes [1,1,2,3,5,...,<1000th Fib number>]
    i    Get the first index of element in list, or 0 if not found
rozpraszać
źródło
Nie działa dla 0.
Okx
@ComradeSparklePony Czy jesteś pewien? To działa dla mnie.
rozproszyć
1
Nie działa na 0 lub coś większego niż 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875.
Eryk Outgolfer
1
@ Mr.Xcoder Ogólna zgoda jest taka, że ​​musisz być w stanie obsłużyć to, co obsługuje twój naturalny typ danych, a Jelly obsługuje liczby całkowite o dowolnej precyzji.
Erik the Outgolfer
1
Nadal nie działa na nic ponad 26863810024485359386146727202142923967616609318986952340123175997617981700247881689338369654483356564191827856161443356312976673642210350324634850410377680367334151172899169723197082763985615764450078474174626.
Eryka Outgolfer
2

Dyalog APL, 17 bajtów

0∊1|.5*⍨4 ¯4+5××⍨

Wypróbuj online!

Uriel
źródło
2

R, 43 40 bajtów

pryr::f(x%in%DescTools::Fibonacci(0:45))  

pryr::f tworzy funkcję:

function (x) 
x %in% DescTools::Fibonacci(0:45)

Używa DescTools::Fibonaccido tworzenia pierwszych x+1liczb Fibonacciego i sprawdza włączenie. x+1ponieważ trzeci fibnum to 2, a to nie wystarczy, aby sprawdzić włączenie 3.

Na szczęście Desctools::Fibonacci(0)=0jest to niezła gratka.

-3 bajty dzięki MickyT

JAD
źródło
-1:x+1zaoszczędzi ci bajt, ale 0:45uratuje trzy i obejmie wymagany zakres
MickyT
@MickyT Och, musiałem przeoczyć wymaganą specyfikację zakresu. Dzięki :)
JAD
Alternatywnym podejściem jest zaledwie 36 bajtów: pryr::f(any(!(5*n^2+c(-4,4))^.5%%1)).
rturnbull
Mam go do 32 bajtów, patrz tutaj .
rturnbull
Nie znam się na kodach golfowych - czy dopuszczanie pakietów innych niż podstawowe ma sens? Mógłbym napisać dowolny kod R w pakiecie, zainstalować go i uruchomić w taki sam sposób, jak z tej funkcji pryr.
mb7744
2

Haskell , 31 bajtów

f=0:scanl(+)1f
(`elem`take 45f)

Wypróbuj online! Wykorzystuje to fakt, że dane wejściowe będą w zakresie od 0 do 1 000 000 000, dlatego musimy sprawdzić tylko pierwsze 45 liczb Fibonacciego. f=0:scanl(+)1fgeneruje nieskończoną listę liczb Fibonacciego, take 45fjest listą pierwszych 45 liczb Fibonacciego i elemsprawdza, czy dane wejściowe znajdują się na tej liście.


Wersja nieograniczona: 36 bajtów

f=0:scanl(+)1f
g n=n`elem`take(n+3)f

Wypróbuj online! Dla każdego n, biorąc pierwsze n+3liczby Fibonacciego zagwarantuje, że nbędzie na tej liście, jeśli jest to liczba Fibonacciego.

Zauważ, że to podejście jest niesamowicie nieefektywne w przypadku wysokich liczb, które nie są liczbami Fibonacciego, ponieważ wszystkie n+3liczby Fibonacciego muszą zostać obliczone.

Laikoni
źródło
2

JavaScript (ES6 bez operatora **), 44 bajty

f=(x,c=x*(Math.sqrt(5)-1)/2%1)=>x*(c-c*c)<.5

Opiera się na stosunku kolejnych liczb Fibonacciego zbliżających się do złotego podziału. Wartość c jest ułamkową częścią danych wejściowych podzieloną przez złoty współczynnik - jeśli dane wejściowe to Fibonacciego, będzie to bardzo blisko 1, a wartość c-c² będzie bardzo mała.

Nie tak krótki jak niektóre inne odpowiedzi JS, ale działa w czasie O (1).

HP Williams
źródło
Czy jesteś pewien, że to jest dokładne?
user259412
Nie działa dla numeru fibonacchi 16558014
Czarna Sowa Kai
2

Julia 0,4 , 29 bajtów

!m=in(0,sqrt(5*m*m+[4,-4])%1)

Wypróbuj online!


Jeśli nie tak robisz odpowiedź Julii, daj mi znać. Nie jestem pewien, jak działa wejście w TIO.

Urna Magicznej Ośmiornicy
źródło
1
Musiałbyś ustawić ją jako funkcję regularną (liczenie !m=) lub lambda (liczenie m->). Co ważniejsze, nie powiedzie się to tak, jak jest 0 .
Dennis
2

R, 32 31 bajtów

Pobiera dane wejściowe ze standardowego wejścia, zwraca TRUElub FALSEodpowiednio.

any(!(5*scan()^2+-1:1*4)^.5%%1)
rturnbull
źródło
2

Common Lisp, 61 54 bajtów

(defun f(x)(do((a 0 b)(b 1(+ a b)))((>= a x)(= a x))))

Wypróbuj online!

Zmniejszenie rozmiaru w stosunku do poprzedniej wersji:

(defun f(x)(do((a 0 b)(b 1 c)(c 1(+ b c)))((>= a x)(= a x))))

zrodził się pomysł, że do wygenerowania sekwencji liczb Fibonacciego potrzebne są tylko dwie zmienne, a nie trzy.

Renzo
źródło
1

Mathematica, 33 bajty

AtomQ@*InverseFunction[Fibonacci]
J42161217
źródło
Możesz zapisać kilka bajtów za pomocą @*(a następnie upuścić finał @#&)
Martin Ender
1

JS (ES6), 57 bajtów

n=>(y=y=>((5*(n**2)+y)**0.5),~~y(4)==y(4)|~~y(-4)==y(-4))

Wykorzystuje metodę carusocomputing . Dużo bardziej golfista niż moja inna odpowiedź .

Bez golfa

n=>{
    y=y=>((5*(n**2)+y)**0.5);//carusocomputing's method in a function
    return ~~y(4) === y(4) || ~~y(-4) === y(-4);//~~x === Math.floor(x)
}

źródło