Am I a Fibonacci Number?

49

11

Your Task:

Write a program or function to check if a number that is inputted is a Fibonacci number. A Fibonacci number is a number contained in the Fibonacci sequence.

The Fibonacci Sequence is defined as: F(n) = F(n - 1) + F(n - 2)

With the seeds being F(0) = 0 and F(1) = 1.

Input:

A non-negative integer between 0 and 1,000,000,000 that may or may not be a Fibonacci number.

Output:

A truthy/falsy value indicating whether or not the input is a Fibonacci number.

Examples:

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

Scoring:

This is , lowest byte count wins.

Gryphon

Posted 2017-06-14T16:58:11.277

Reputation: 6 697

2The programming language I'm using only supports numbers up to 9999 (Geometry Dash). Is it okay if I assume that it does support numbers up to 1000000, theoretically? – MilkyWay90 – 2019-01-26T17:51:28.573

Answers

36

Neim, 2 bytes

f

Explanation:

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

Works the same as my It's Hip to be Square answer, but uses a different infinite list: f, for fibonacci.

Try it!

Okx

Posted 2017-06-14T16:58:11.277

Reputation: 15 025

1Wow! Impressive score. – Gryphon – 2017-06-14T17:01:21.930

2That's great, but not 2 bytes. In UTF-8 it's represented as "66 F0 9D 95 9A" – sm4rk0 – 2017-06-16T14:05:30.687

10

@sm4rk0 That's great, but you're wrong. Neim uses a custom codepage, so the byte representation of this is 66 D5

– Okx – 2017-06-16T15:06:26.837

Doesn't this loop forever if the input is not in the list? If so, does that count as falsey? – Enrico Borba – 2017-06-16T15:09:28.897

@EnricoBorba Neim knows that the nth element in this infinite list will always be equal to or less than the n+1th element in the list. Therefore, it can catch itself and it will not run forever. Have you tried the program it? :P – Okx – 2017-06-16T15:12:21.550

That's awesome! Just tried it now. – Enrico Borba – 2017-06-16T16:18:32.953

Congrats on the shortest code. Since this challenge has been up for nearly a week, its time to mark the accepted answer, and this is it! – Gryphon – 2017-06-21T12:46:14.440

18

JavaScript (ES6), 34 bytes

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

Recursively generates the Fibonacci sequence until it finds an item greater than or equal to the input, then returns item == input.

ETHproductions

Posted 2017-06-14T16:58:11.277

Reputation: 47 880

NB: naive recursive calculation of the Fibonacci sequence is O(Fib(n)) - approximately O(1.6 ^ n) – Alnitak – 2017-06-16T08:47:27.977

f=n=>n?n>2?f(n-1)+f(n-2):1:0 28bytes – jackkav – 2018-04-13T06:43:27.887

@jackkav Thanks, but the challenge is to determine if the input is a Fibonacci number. – ETHproductions – 2018-04-13T14:21:05.310

12

Retina, 23 bytes

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

Try it online!

Input in unary, outputs 0 or 1.

Explanation

The Fibonacci sequence is a good candidate for a solution with forward references, i.e. a "backreference" that refers either to a surrounding group or one that appears later in the regex (in this case, we're actually using both of those). When matching numbers like this, we need to figure out a recursive expression for the difference between sequence elements. E.g. to match triangular numbers, we usually match the previous segment plus one. To match square numbers (whose differences are the odd numbers), we match the previous segment plus two.

Since we obtain the Fibonacci numbers by adding the second-to-last element to the last one, the differences between them are also just the Fibonacci numbers. So we need to match each segment as the sum of the previous two. The core of the regex is this:

(         # 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.
)*

Now this ends up adding the Fibonacci numbers starting at 1, i.e. 1, 1, 2, 3, 5, .... Those add up to 1, 2, 4, 7, 12, .... I.e. they are one less than the Fibonacci numbers, so we add a 1 at the end. The only case this doesn't cover is zero, so we have the ^$ alternative at the beginning to cover that.

Martin Ender

Posted 2017-06-14T16:58:11.277

Reputation: 184 808

2Very elegant! I'd just like to point out, for completeness's sake, that it can be shortened to 20 bytes in PCRE using a possessive quantifier: ^$|^(^1|\2?+(\1))*1$ – Deadcode – 2019-01-21T19:47:51.550

1@Deadcode I do miss those a lot in .NET ;) – Martin Ender – 2019-01-21T22:30:21.420

Save 1 byte by removing the unnecessary second ^. – Neil – 2019-02-08T01:08:17.173

12

Regex (ECMAScript flavour), 392 358 328 224 206 165 bytes

The techniques that need to come into play to match Fibonacci numbers with an ECMAScript regex (in unary) are a far cry from how it's best done in most other regex flavors. The lack of forward/nested backreferences or recursion means that it is impossible to directly count or keep a running total of anything. The lack of lookbehind makes it often a challenge even to have enough space to work in.

Many problems must be approached from an entirely different perspective, and seem unsolvable until the arrival of some key insight. It forces you to cast a much wider net in finding which mathematical properties of the numbers you're working with might be able to be used to make a particular problem solvable.

In March 2014, this is what happened for Fibonacci numbers. Looking at the Wikipedia page, I initially couldn't figure out a way, though one particular property seemed tantalizingly close. Then the mathematician teukon outlined a method that made it quite clear it would be possible to do, using that property along with another one. He was reluctant to actually construct the regex. His reaction when I went ahead and did it:

You're crazy! ... I thought you might do this.

As with my other ECMAScript unary math regex posts, I'll give a warning: I highly recommend learning how to solve unary mathematical problems in ECMAScript regex. It's been a fascinating journey for me, and I don't want to spoil it for anybody who might potentially want to try it themselves, especially those with an interest in number theory. See that post for a list of consecutively spoiler-tagged recommended problems to solve one by one.

So do not read any further if you don't want some unary regex magic spoiled for you. If you do want to take a shot at figuring out this magic yourself, I highly recommend starting by solving some problems in ECMAScript regex as outlined in that post linked above.

The challenge I initially faced: A positive integer x is a Fibonacci number if and only if 5x2 + 4 and/or 5x2 - 4 is a perfect square. But there is no room to calculate this in a regex. The only space we have to work in is the number itself. We don't even have enough room to multiply by 5 or take the square, let alone both.

teukon's idea on how to solve it (originally posted here):

The regex is presented with a string of the form ^x*$, let z be its length. Check whether or not z is one of the first few Fibonacci numbers by hand (up to 21 should do). If it is not:

  1. Read a couple of numbers, a < b, such that b is not larger than 2a.
  2. Use forward look-aheads to build a2, ab, and b2.
  3. Assert that either 5a2 + 4 or 5a2 - 4 is a perfect square (so a must be Fn-1 for some n).
  4. Assert that either 5b2 + 4 or 5b2 + 4 is a perfect square (so b must be Fn).
  5. Check that z = F2n+3 or z = F2n+4 by using the earlier built a2, ab, and b2, and the identities:
    • F2n-1 = Fn2 + Fn-12
    • F2n = (2Fn-1 + Fn)Fn
In brief: these identities allow us to reduce the problem of checking that a given number is Fibonacci to checking that a pair of much smaller numbers are Fibonacci. A little algebra will show that for large enough n (n = 3 should do), F2n+3 > Fn + 5Fn2 + 4 so there should always be enough space.

And here is a mockup of the algorithm in C which I wrote as a test before implementing it in regex.

So with no further ado, here is the 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})$

Try it online!

And the pretty-printed, commented version:

^(
  (?=
    (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.
)$

The multiplication algorithm is not explained in those comments, but is briefly explained in a paragraph of my abundant numbers regex post.

I was maintaining six different versions of the Fibonacci regex: four that ratchet from shortest length to fastest speed and use the algorithm explained above, and two others that use a different, much faster but much more lengthy algorithm, which as I found can actually return the Fibonacci index as a match (explaining that algorithm here is beyond the scope of this post, but it's explained in the original discussion Gist). I don't think I would maintain that many very-similar versions of a regex again, because at the time I was doing all my testing in PCRE and Perl, but my regex engine is fast enough that concerns of speed are not as important anymore (and if a particular construct is causing a bottleneck, I can add an optimization for it) – though I'd probably again maintain one fastest version and one shortest version, if the difference in speed were big enough.

The "return the Fibonacci index minus 1 as a match" version (not heavily golfed):

Try it online!

All of the versions are on github with the full commit history of golf optimizations:

regex for matching Fibonacci numbers - short, speed 0.txt (the shortest but slowest one, as in this post)
regex for matching Fibonacci numbers - short, speed 1.txt
regex for matching Fibonacci numbers - short, speed 2.txt
regex for matching Fibonacci numbers - short, speed 3.txt
regex for matching Fibonacci numbers - fastest.txt
regex for matching Fibonacci numbers - return index.txt

Deadcode

Posted 2017-06-14T16:58:11.277

Reputation: 3 022

9

Python 3, 48 bytes

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

Try it online!

Dennis

Posted 2017-06-14T16:58:11.277

Reputation: 196 637

1Being Python should it not work, given enough resources, for arbitrarily large inputs? – Jonathan Allan – 2017-06-14T17:49:09.883

2I always had the impression we could use whatever algorithm we wanted as long, as it works in practice if the calculations fits in the data type and in theory given infinite precision. Sure, using only int would set the bar higher (still not arbitrarily large), but we also don't force C answers to use 64-bit integers (or 128-bit with gcc). At any rate, being allowed to use the same algorithm in one language but not another seems nonsensical. – Dennis – 2017-06-15T04:34:38.490

The algorithmic view does make sense (I had always thought it was the input domain that dictated the "fit in data type" criteria). The only thing to watch for is the grey area between what is the idea of the algorithm and its implementation. Here one could check if either of the integers are square without casting to floats. I guess that an internal cast as a side-effect is acceptable so long as it is part of a legitimate, working algorithm (...and I'm pretty sure an algorithm that relied on the cast would not be acceptable). – Jonathan Allan – 2017-06-15T05:03:17.790

@JonathanAllan Since the maximum value to handle is 1e9, I dont think arbitrarily large inputs would be a problem. – JAD – 2017-06-16T13:24:40.290

1@JarkoDubbeldam yes, that detail was actually changed after my comment was made. – Jonathan Allan – 2017-06-16T13:28:05.383

@JonathanAllan nevermind then :) – JAD – 2017-06-16T13:41:24.363

7

05AB1E, 8 7 bytes

>ÅF¹å¹m

Explanation:

>Å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.

Try it online!

-1 thanks to Jonathan Allan for the 0-not-a-fibonacci-number workaround.

Magic Octopus Urn

Posted 2017-06-14T16:58:11.277

Reputation: 19 422

Actually, won't be updating to 6 bytes. Can't believe there's NO way to append a 0 to a list in under 3 bytes. – Magic Octopus Urn – 2017-06-14T17:24:26.273

@JonathanAllan the "generate fibbonacci function" in 05AB1E doesn't contain 0. – Magic Octopus Urn – 2017-06-14T18:56:03.837

@JonathanAllan I understand now, nice idea. Took me a minute to figure out what was actually happening there. – Magic Octopus Urn – 2017-06-14T19:04:32.587

Isn't it enough to generate upto n (saving a byte) as ÅF is inclusive and ¹å would result in 0 either way for n=0? – Emigna – 2017-06-15T10:19:26.913

0AF = []. 1AF = [1,1]. So apparently not. – Magic Octopus Urn – 2017-06-15T13:26:26.913

¹å on [] produces 0 (which is what you want in this case). – Emigna – 2017-06-15T13:35:56.550

@Emigna actually 0 should return 1, I tried for like 15 minutes to get this below 8 bytes lol. – Magic Octopus Urn – 2017-06-15T16:32:33.923

Yes, and 0 does return 1 of you remove > as 0**0 = 1 – Emigna – 2017-06-15T20:35:11.453

Where did you find the command Å? – LordColus – 2018-05-15T00:27:17.067

@LordColus https://github.com/Adriandmen/05AB1E/blob/master/docs/extended-math.txt

– Magic Octopus Urn – 2018-05-15T12:19:21.650

Thank you! I haven’t looked much at that page. I’ve only had the main command list open. – LordColus – 2018-05-15T21:34:04.667

7

Python 2, 48 44 bytes

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

Try it online

Thanks to Jonathan Allan for saving 4 bytes

mbomb007

Posted 2017-06-14T16:58:11.277

Reputation: 21 944

This can be 47 bytes, if truthy values can be False and falsy values True: TIO!

– Mr. Xcoder – 2017-06-14T17:20:45.663

Could also use n-a in place of n==a and have -1 and 0 as your return values. – Magic Octopus Urn – 2017-06-14T18:06:26.143

@carusocomputing I had that in my edit history, but it doesn't work, because for larger test values, you might have -101 or some other result instead of -1. – mbomb007 – 2017-06-14T21:47:16.707

@Mr.Xcoder do you really think that saving 1 byte is worth everybody's sanity? – frarugi87 – 2017-06-16T14:23:17.433

1@frarugi87 Saving a byte is always worth it – Mr. Xcoder – 2017-06-16T14:25:10.397

@Mr.Xcoder https://codegolf.meta.stackexchange.com/a/2194/34718

– mbomb007 – 2017-06-16T15:11:03.470

@mbomb007 as long as you specify what is thruthy and what is falsy, it's ok. – Mr. Xcoder – 2017-06-16T15:22:37.220

That's not the consensus. – mbomb007 – 2017-06-16T15:29:28.920

5

Jelly,  8 7  6 bytes

-r‘ÆḞċ

Try it online!

How?

-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)

Notes:

  • the increment, , is needed so this works for 2 and 3, since they are the 3rd and 4th Fibonacci numbers - beyond 3 all Fibonacci numbers are greater than their index.
  • the - is needed (rather than just ‘R) so this works for 0 since 0 is the 0th Fibonacci number;

Jonathan Allan

Posted 2017-06-14T16:58:11.277

Reputation: 67 804

Umm, this looks too much like my answer... – Erik the Outgolfer – 2017-06-14T17:20:56.547

Oh, I golfed mine down to yours, except mine works for 3 :) – Jonathan Allan – 2017-06-14T17:22:04.217

Oh whoops...Fibonacci is weird. (btw deleted my answer then if u say so) – Erik the Outgolfer – 2017-06-14T17:26:11.117

Are you sure about that last note? When I run the Fibonacci atom on a list starting from 0, 0 is included in the output. – scatter – 2017-06-14T18:08:47.433

1It doesn't appear to be relevant based on the wording of the challenge, but if you use the count atom with 1 as your argument on the list of Fibonacci numbers the result is 2 (not 1). – FryAmTheEggman – 2017-06-14T18:55:51.143

@Christian (weird no notification) yeah you're right it's the zeroth, which means it can be 0r‘, I dont think I can save a byte from that fact though... – Jonathan Allan – 2017-06-14T18:58:16.417

@FryAmTheEggman yeah 2 is truthy :) – Jonathan Allan – 2017-06-14T18:58:35.390

@JonathanAllan I think you're right. There's an atom that generates a range that starts from zero, but it only goes to n-1, which is too small for this, even with the increment (going from 0 to n). I've been trying to find a one byte atom that can make a number bigger than that, but they're all either not big enough (e.g., increment) or don't work on 0 (e.g., double). If there were an "increment by 10" atom or something like that, that would be perfect... – scatter – 2017-06-14T19:00:51.460

5

Perl 6, 23 bytes

{$_∈(0,1,*+*...*>$_)}

Sean

Posted 2017-06-14T16:58:11.277

Reputation: 4 136

{(0,1,*+*...^*>$_).tail==$_} was what I was going to initially post. I may have gotten around to Set operators eventually. – Brad Gilbert b2gills – 2017-06-14T17:36:15.453

5

Seriously, 3 bytes

,fu

Try it online!

Returns the index +1 in the list of Fibonacci numbers if truthy, otherwise returns falsy.

Explanation:

,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)

Comrade SparklePony

Posted 2017-06-14T16:58:11.277

Reputation: 5 784

9Seriously rude ^^ – Jonathan Allan – 2017-06-14T18:01:44.393

5

ZX81 BASIC 180 151 100 ~94 tokenized BASIC bytes

With thanks to Moggy on the SinclairZXWorld forums, here is a much neater solution that saves more bytes.

 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

This will output 1 if a Fibonacci number is entered, or zero if not. Although this saves bytes, it's much slower than the old solutions below. For speed (but more BASIC bytes) remove the VAL wrappers around the string literal numbers. Here is the old(er) solutions with some explanations:

 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

The amendments above saves further BASIC bytes to condensing the IF statements into a single PRINT in line 12; other bytes were saved by using the VAL keyword and, and using GOTO CODE "£", which in the ZX81 character set is 12. Strings save more bytes over numbers as all numeric values are stored as floats so therefore take more space on the VAR stack.

enter image description here

Shaun Bebbers

Posted 2017-06-14T16:58:11.277

Reputation: 1 814

Actually, I could save another 6 tokenized BASIC bytes by removing line 6 altogether and changing line 5 to 5 IF R<F THEN NEXT I - my bad! – Shaun Bebbers – 2019-02-04T23:56:00.470

4

C#, 109 bytes

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];}

Definitely could be improved, but I didn't have time.

Kaito Kid

Posted 2017-06-14T16:58:11.277

Reputation: 303

Welcome to PPCG! – Martin Ender – 2017-06-14T19:36:16.180

1

I wrote my own answer only to realize that it was the same as yours. You can use lambda expressions and simple variables to get this: 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;} (just 80 bytes). Try it online!

– Charlie – 2017-06-14T20:08:31.730

1@CarlosAlejo Save a further 2 bytes on that with a+=b instead of a=a+b and b+=a instead of b=a+b. – TheLethalCoder – 2017-06-15T08:18:19.733

4

><>, 21 19+3 = 24 22 bytes

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

Input is expected to be on the stack at program start, so +3 bytes for the -v flag.

Try it online!

This works by generating Fibonacci numbers until they are greater than or equal to the input number, then checking the last generated number for equality with the input. Outputs 1 if it was a Fibonacci number, 0 otherwise.

To ensure that 0 is handled correctly, the seed is -1 1 - the first number generated will be 0 rather than 1.

Thanks to @cole for pointing out that i can be used to push -1 onto the stack when STDIN is empty. Very clever!

Previous version:

01-1\{=n;
}(?!\:@+:{:

Sok

Posted 2017-06-14T16:58:11.277

Reputation: 5 592

Now I feel stupid for wasting bytes continuously checking each generated number along the way. Nicely done! – Emigna – 2017-06-16T08:56:19.953

122 bytes using i instead of 01-. – cole – 2018-01-21T01:43:40.390

@cole of course, using i as -1 when there is no input to STDIN, I'd not considered that. Nicely done! – Sok – 2018-01-21T22:54:36.453

3

Mathematica, 37 bytes

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

-4 bytes from @ngenisis

J42161217

Posted 2017-06-14T16:58:11.277

Reputation: 15 931

Fibonacci[0] gives 0, so you can save 4 bytes by including 0 in the Table range. You can save another byte using infix notation for Table: !Fibonacci@n~Table~{n,0,#+1}~FreeQ~#& – ngenisis – 2017-06-14T18:55:11.760

3

Pari/GP, 32 bytes

n->!prod(x=0,n+1,fibonacci(x)-n)

Try it online!

alephalpha

Posted 2017-06-14T16:58:11.277

Reputation: 23 988

3

PHP, 44 bytes

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

Try it online!

PHP, 58 bytes

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

Try it online!

Jörg Hülsermann

Posted 2017-06-14T16:58:11.277

Reputation: 13 026

2Golfed more: for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;. – user63956 – 2017-06-15T03:43:57.533

@user63956 Thank You for the learning effort with the chaining variables assignment – Jörg Hülsermann – 2017-06-15T10:45:33.393

3

MATL (16 bytes)

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

Try it online!

Not the golfiest solution, but wanted to use the direct method of checking if "5*x^2+/-4" is a perfect square.

Explanation:

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.

Note:

In the "0" case it returns "2" because both 4 and -4 are perfect squares, same with 1 which produces "1 1". Consider any non-zero output as "truthy", and 0 as "falsy".

DrQuarius

Posted 2017-06-14T16:58:11.277

Reputation: 562

3

Java, 72 69 68 63 59 55 50 49 bytes

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

Test it yourself!

Alternative (still 49 bytes)

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

Not very original: it's the plain and basic iterative version.

This works for numbers up to 1,836,311,903 (47th fibonacci number) included. Above that, the result is undefined (including a potential infinite loop).

Thanks to Kevin Cruijssen and David Conrad for helping golfing :)

Olivier Grégoire

Posted 2017-06-14T16:58:11.277

Reputation: 10 647

1Nice approach. Btw, you can golf a byte by changing n==0 to n<1. In the question it states "A non-negative integer between 0 and 1,000,000,000". – Kevin Cruijssen – 2017-06-15T10:45:13.440

1@KevinCruijssen I golfed not 1, but 5 bytes with that clause! :-P Thanks, I hadn't noticed it. – Olivier Grégoire – 2017-06-15T11:12:26.407

2You don't need a temp variable for the Fibonacci sequence. You can calculate successive pairs with b+=a;a=b-a; – David Conrad – 2017-06-16T07:31:02.237

1You're doing black magic, @DavidConrad! I'm telling you! Black magic! :) – Olivier Grégoire – 2017-06-16T07:40:51.470

3

C# (.NET Core), 51 bytes

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

Try it online!

-6 bytes thanks to @Oliver!

This solution uses a pretty straightforward recursive function.

  • The variable n is the number to be tested.
  • The variables a and b are the 2 most recent numbers in the sequence.
  • Checks if the first of the 2 most recent number is less than input. When this is the case, a recursive call is made to the next numbers in the series.
  • Otherwise, check whether the first number is equal to input and return the result.

The TIO link demonstrates this working for 1134903170 which exceeds the maximum value required by the challenge.

dana

Posted 2017-06-14T16:58:11.277

Reputation: 2 541

It's nice to see C# solutions lately :) - I think you can simply check if a<n for 51 bytes

– Oliver – 2019-01-23T00:07:56.177

Thanks! And nice tip :) – dana – 2019-01-23T00:22:08.843

3

Alchemist, 205 134 bytes

Big thanks to ASCII-only for rather clever merging of states, saving 71 bytes!!

_->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

Try it online or verify in batch!

Ungolfed

# 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

ბიმო

Posted 2017-06-14T16:58:11.277

Reputation: 15 345

139. you can remove some 0 checks for fewer bytes at the cost of nondeterminism – ASCII-only – 2019-01-30T06:16:33.263

129 – ASCII-only – 2019-01-30T06:22:48.343

@ASCII-only: That's pretty nice! Fails for 0 though, but not adding the b-atom on initialization fixes it (and saves 2 bytes) :D Thanks – ბიმო – 2019-01-31T15:16:51.400

2

Dyalog APL, 17 bytes

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

Try it online!

Uriel

Posted 2017-06-14T16:58:11.277

Reputation: 11 708

2

Jelly, 5 bytes

ȷḶÆḞi

Try it online!

Returns 0 for non-Fibonacci numbers, and the 1-indexed position of the number in the Fibonacci sequence for Fibonacci numbers.

Explanation:

ȷḶÆḞ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

scatter

Posted 2017-06-14T16:58:11.277

Reputation: 874

Doesn't work for 0. – Okx – 2017-06-14T17:23:29.613

@ComradeSparklePony Are you sure? That works for me. – scatter – 2017-06-14T17:26:00.337

1Doesn't work for 0 or anything bigger than 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875. – Erik the Outgolfer – 2017-06-14T17:27:03.570

@EriktheOutgolfer not sure we have to handle numbers higher than 434665576869374564356885276750406258025646605173717804024817‌​29089536555417949051‌​89040387984007925516‌​92959225930803226347‌​75209689623239873322‌​47116164299644090653‌​31879382989696499285‌​16003704476137795166‌​849228875... It's far beyond the capabilities of Swift, for example – Mr. Xcoder – 2017-06-14T17:27:49.507

1@Mr.Xcoder General consensus is that you must be able to handle what your natural datatype supports, and Jelly supports arbitrary-precision integers. – Erik the Outgolfer – 2017-06-14T17:28:59.860

@Christian Oops, my mistake. – Comrade SparklePony – 2017-06-14T17:29:06.877

@Okx Fixed, works for 0 now. – scatter – 2017-06-14T17:29:31.447

1Still doesn't work for anything over 26863810024485359386146727202142923967616609318986952340123175997617981700247881689338369654483356564191827856161443356312976673642210350324634850410377680367334151172899169723197082763985615764450078474174626. – Erik the Outgolfer – 2017-06-14T17:30:02.287

If the Fibonacci sequence didn't grow so slowly in the beginning, I could fix that problem and golf it down to 4 bytes by generating a range of the first <input> fib numbers. Alas. – scatter – 2017-06-14T17:37:24.663

@ETHproductions Right you are, fixed – scatter – 2017-06-14T17:41:00.557

2

R, 43 40 bytes

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

pryr::f creates a function:

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

Uses DescTools::Fibonacci to create the first x+1 fibonacci numbers and checks for inclusion. x+1 because the third fibnum is 2, and that wouldn't be enough to check for inclusion of 3.

Luckily Desctools::Fibonacci(0)=0, so that is a nice freebee.

-3 bytes thanks to MickyT

JAD

Posted 2017-06-14T16:58:11.277

Reputation: 2 898

-1:x+1 will save you a byte, but 0:45 will save you three and cover the required range – MickyT – 2017-06-14T20:39:53.693

@MickyT Oh, I must've overlooked the required range specification. Thanks :) – JAD – 2017-06-14T20:42:37.460

An alternative approach, only 36 bytes: pryr::f(any(!(5*n^2+c(-4,4))^.5%%1)). – rturnbull – 2017-06-16T08:12:26.030

I got it down to 32 bytes, see here.

– rturnbull – 2017-06-16T09:58:29.470

I'm not so familiar with code golf rules -- does allowing non-base packages make sense? I could write arbitrary R code into a package, install it, and run it the same way you have run the function from pryr. – mb7744 – 2017-06-16T12:58:07.883

@mb7744 Yes you could. But as with all the programming languages, the package should predate the challenge. This is so you couldn't make a package with functions that directly solve the challenge. – JAD – 2017-06-16T13:00:57.940

That makes sense, fair enough. – mb7744 – 2017-06-16T13:08:01.043

2

Julia 0.4, 29 bytes

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

Try it online!


If this isn't how you do a Julia answer, let me know. I'm unsure of how input works on TIO.

Magic Octopus Urn

Posted 2017-06-14T16:58:11.277

Reputation: 19 422

1You'd have to make it a regular function (counting !m=) or a lambda (counting m->). More importantly, this fails for 0 as is. – Dennis – 2017-06-14T18:55:49.823

2

Haskell, 31 bytes

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

Try it online! This exploits the fact that the input will be in the range from 0 to 1,000,000,000, hence we need to check only the first 45 Fibonacci numbers. f=0:scanl(+)1f generates an infinite list of Fibonacci numbers, take 45f is the list of the first 45 Fibonacci numbers and elem checks whether the input is in this list.


Unrestricted version: 36 bytes

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

Try it online! For any n, taking the first n+3 Fibonacci numbers will guarantee that n will be in this list if it's a Fibonacci number.

Note that this approach is incredible inefficient for high numbers that are not Fibonacci numbers, because all n+3 Fibonacci numbers need to be computed.

Laikoni

Posted 2017-06-14T16:58:11.277

Reputation: 23 676

2

Common Lisp, 61 54 bytes

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

Try it online!

The reduction in size with respect to the previous version:

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

was triggered by the idea that to generate the sequence of the Fibonacci numbers only two variables are necessary, not three.

Renzo

Posted 2017-06-14T16:58:11.277

Reputation: 2 260

2

Javascript (ES6 without the ** operator), 44 bytes

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

Relies on the ratio between successive Fibonacci numbers approaching the golden ratio. The value of c is the fractional part of the input divided by the golden ratio - if the input is Fibonacci then this will be very close to 1 and the value of c-c² will be very small.

Not as short as some of the other JS answers but runs in O(1) time.

HP Williams

Posted 2017-06-14T16:58:11.277

Reputation: 381

Are you sure it is exact? – peterh - Reinstate Monica – 2017-09-14T00:01:36.000

Doesn't work for the fibonacchi number 16558014 – Black Owl Kai – 2019-01-21T14:12:10.940

2

R, 32 31 bytes

Takes input from stdin, returns TRUE or FALSE as appropriate.

any(!(5*scan()^2+-1:1*4)^.5%%1)

rturnbull

Posted 2017-06-14T16:58:11.277

Reputation: 3 689

1

05AB1E, 7 bytes

ÅF夹_~

Try it online!

Erik the Outgolfer

Posted 2017-06-14T16:58:11.277

Reputation: 38 134

Actually, this randomly seems to return 2, 3 and 4. Try for input of 13 and above. – Magic Octopus Urn – 2017-06-14T17:51:12.973

ÅFsåO¹_~ fixes it but thats another byte. feelsbadman – Datboi – 2017-06-14T19:58:41.310

@Datboi Actually can be fixed still 7 bytes. – Erik the Outgolfer – 2017-06-15T08:16:42.237

1

Mathematica, 33 bytes

AtomQ@*InverseFunction[Fibonacci]

J42161217

Posted 2017-06-14T16:58:11.277

Reputation: 15 931

You can save a couple of bytes with @* (and then drop the final @#&) – Martin Ender – 2017-06-14T18:14:30.863

1

JS (ES6), 57 bytes

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

Uses carusocomputing's method. Alot golfier than my other answer.

Ungolfed

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)
}

user70700

Posted 2017-06-14T16:58:11.277

Reputation:

1

><>, 40 83 bytes

Added 43 bytes so that it takes the correct input

i:0(?vc4*-
 v&a~<
+>l2(?v$&:a*&*
v   ~&<
>10r:&1)?v1n;
=?v&:&)?v>:{+::&:&
  >1n;n0<

A less golfy version would be:

// Read input
i:0(?vc4*-
     >~a&v
         >l2(?v$&:a*&*+
              >&~04.
// Determine if in Fibonacci
 10r:&1)?v1n;
         >:{+::&:&=?v&:&)?v
                    >1n;n0<

AGourd

Posted 2017-06-14T16:58:11.277

Reputation: 271

Finally, a ><> answer. – Gryphon – 2017-06-14T20:08:34.663

1Umm, sorry, but you need to be able to take input from 0-1,000,000,000, inclusive. ASCII doesn't go anywhere near that high. – Gryphon – 2017-06-14T20:17:07.247

Opps, didn't see that requirement. I'll try to fix it, although reading numerical inputs with ><> can be weird – AGourd – 2017-06-15T13:01:30.603

1

AWK, 56 63 61 bytes

{for(n[++j]++;n[j]<$1;n[++j]=n[j]+n[j-1]){}$0=$0?n[j]==$1:1}1

Try it online!

Brute force is fun. :) If you want it to work for arbitrarily large numbers, add a -M argument, but that is outside the scope of the problem.

7 bytes added to account for 0 as input, but shaved a couple off using the ternary operator.

Robert Benson

Posted 2017-06-14T16:58:11.277

Reputation: 1 339

1Umm, this doesn't return truthy for 0, which, according to the question, is included in the Fibonacci Sequence. – Gryphon – 2017-06-14T20:35:45.910

I misread the input, somehow, as saying positive number, rather than non-negative. – Robert Benson – 2017-06-15T17:03:35.433

1

CJam, 37 bytes

ri1T{\1$+_3$-g"1T 0_ 1"S/=~}g]W=

CJam has no Fibonnaci built-in. On the bright side, this does use g twice, and I think this is the first time I've ever used it!

Esolanging Fruit

Posted 2017-06-14T16:58:11.277

Reputation: 13 542

1

k, 20 bytes

{*x=*|(*x>)(|+\)\1 1}

Generates fibonacci numbers until it overshoots. Then it checks the last one it generated for equality. 1 is truthy, 0 is falsey.

Try it online.

zgrep

Posted 2017-06-14T16:58:11.277

Reputation: 1 291

1

Mathematica, 30 bytes

Or@@EvenQ[2Sqrt[5#^2+{4,-4}]]&

alephalpha

Posted 2017-06-14T16:58:11.277

Reputation: 23 988

1

Java 8, 94 bytes

x->{int i=0;for(;c(i++)<=x;);return c(i-2)==x;}int c(int n){return n<1?0:n<2?1:c(n-1)+c(n-2);}

Explanation:

Try it here. (NOTE: It's a bit slow for very large test-cases.)

x->{                 // Method (1) with integer parameter and boolean return-type
  int i=0;           //  Index
  for(;c(i++)<=x;);  //  Loop as long as the Fibonacci number is smaller or equal to the input
  return c(i-2)==x;  //  And then return if the input equals the previous Fibonacci number
}                    // End of method (1)

                     // Method to get `n`th Fibonacci number
int c(int n){        // Method (2) with integer parameter and integer return-type
  return n<1?        //  If `n`==0:
    0                //   Return 0
   :n<2?             //  Else if `n`==1
    1                //   Return 1
   :                 //  Else:
    c(n-1)+c(n-2);   //   Return recursive calls with `n-1` and `n-2`
}                    // End of method (2)

Kevin Cruijssen

Posted 2017-06-14T16:58:11.277

Reputation: 67 575

2

+1 for trying the recursive, but I think the iterative is shorter ;)

– Olivier Grégoire – 2017-06-15T09:47:51.773

1

><>, 33+3 = 36 bytes

3 bytes added for the -v flag

10:{:}=?!v1n;
)?v:@+10.\:{:}
n0/;

Try it online!

Or 54 bytes without using the -v flag

 0ic4*-:0(?v$a*+10.
:{:}=?!v1n;\10
v:@+d1.\:{:})?
\0n;

Try it online!

Emigna

Posted 2017-06-14T16:58:11.277

Reputation: 50 798

1

Actually, 2 bytes

fu

Try it online!

Pushes either a positive number for truthy or 0 for falsy.

James

Posted 2017-06-14T16:58:11.277

Reputation: 54 537

1

Cubix, 22 24 bytes

0 is truthy, nothing is falsey

@0O1I!^/@.W<rq\?-p+;;u

Try it online!

    @ 0
    O 1
I ! ^ / @ . W <
r q \ ? - p + ;
    ; u
    . .

Watch it run

I may be able to get a couple more out of this ... found them with a change to the initial redirect into the loop

  • I get the integer to check
  • ! check for 0 input
    • ^O@ if zero, output and halt
  • /01 initialise the stack for doing the sequence
  • W<W change lane onto the redirect back to self, then change lane into looping section
  • +p-? bring the check value to the top, subtract and check
    • /@ On a positive result reflect and halt
    • \^O@ On a zero result reflect, output and halt
    • u;\qr; Remove the check, move check value to bottom, rotate the sum, remove the low value. Continue into loop.

MickyT

Posted 2017-06-14T16:58:11.277

Reputation: 11 735

1

Java, 40 bytes

r->Math.abs((r*Math.sqrt(5)-~r)%2*r-r)<2

This is a straight Java port of @xnor's answer.

David Conrad

Posted 2017-06-14T16:58:11.277

Reputation: 1 037

1

D, 57 bytes

A nice, clean, no-nonsense solution:

int f(int n,int x=0,int y=1){return y<n?f(n,y,x+y):y==n;}

This one is 58 bytes but doesn't use recursion, and so might be more practical for larger inputs:

alias f=(n){int x,y=1;for(;y<n;y+=x,x=y-x){}return y==n;};

And here's one where the function declaration itself is only 54 bytes, though it depends on the mach library.

import mach.range : r=recur, l=last;
import mach.math.vector : v=vector;
const z=v(0,1);

// The 54-byte function
alias f=n=>z.r!(a=>v(a.y,a.x+a.y),a=>a.y>n).l(z).y==n;

// Exploded for readability
alias f=n=>(
    vector(0,1) // Seed the sequence
        .recur!(v=>vector(v.y,v.x+v.y),v=>v.y>n) // Compute Fib numbers until N
        .last(vector(0,1)).y == n // If the last number was N, return true
        // Value in parens "last(...)" is a fallback for n==0 and empty seq.
);

Pineapple

Posted 2017-06-14T16:58:11.277

Reputation: 111

1

Japt, 8 7 bytes

ÆMgXÃøU

Test it


Explanation

Implicit input of integer U.

Æ   Ã

Generate an array of integers from 0 to U-1 and pass each through a function where X is the current element.

MgX

Get the Xth Fibonacci number.

øU

Check if the array contains (ø) the original input U. Implicitly return the boolean result.

Shaggy

Posted 2017-06-14T16:58:11.277

Reputation: 24 623

1

cQuents, 8 bytes

=0,1?Z+Y

Try it online!

Explanation

=0,1        Set sequence start to 0,1
    ?       Mode: Query (assumes increasing sequences)
     Z+Y    Each item is the previous two summed

Stephen

Posted 2017-06-14T16:58:11.277

Reputation: 12 293

1

C, 36 bytes

f(x,a,b){return x>b?f(x,b,a+b):x==b}

It puts some warnings, and requires at least 32-bit integers. Newer C standards probably won't even compile it. It should be called as f(142857,0,1).

Bonus: it can calculate Fibonacci-ness with different initial values, too.

peterh - Reinstate Monica

Posted 2017-06-14T16:58:11.277

Reputation: 347

1

Ruby, 64 41 40 bytes

->n,a=b=1{a,b=b,a+b;a<n ?redo:a>n ?p: 1}

Try it online!

Asone Tuhid

Posted 2017-06-14T16:58:11.277

Reputation: 1 944

1

Brachylog, 16 14 bytes

1;0⟨t≡+⟩ⁱhℕ↙.!

Try it online!

Takes input through the output variable and outputs through success or failure, and in the case of success the input variable is unified with 1.

1;0               Starting with [1,0],
        ⁱ         iterating
   ⟨ ≡ ⟩          replacing
   ⟨t  ⟩          the first element of the pair with the last element
   ⟨  +⟩          and the last element with the sum of the pair
         h        until the first element
          ℕ↙      is greater than or equal to
            .     the output variable,
             !    and stopping then,
         h        the first element of the pair is equal to the output variable.

ℕ↙.! is necessary for it to terminate on false test cases.

Unrelated String

Posted 2017-06-14T16:58:11.277

Reputation: 5 300

1

k4, 30 26 bytes

-4 thanks to ngn!

{x in(x>*|:){x,+/-2#x}/!2}

the above is a simple while iterator. (cond){func}/arg.

            {x,+/-2#x}           / x join sum over last 2 elements of x (i.e. append next Fib)
     (x>*|:)          /!2        / while outer func input is greater than last element (x>*|:) of inner func output, pass inner func output to inner func
 x in                            / check if x is in array. returns boolean

scrawl

Posted 2017-06-14T16:58:11.277

Reputation: 1 079

1last@ -> *|:, 0 1 -> !2 – ngn – 2019-09-07T08:53:13.130

@ngn thanks, updated! – scrawl – 2019-09-09T08:20:44.797

would it still work if you moved the first arg to the left of { }/? {x,+/-2#x}/[x>*|:;!2] -> (x>*|:){x,+/-2#x}/!2 – ngn – 2019-09-09T08:26:22.450

yeah it does. that was my first approach but i couldn't get it to work. not sure what's different now. thanks again, will update! – scrawl – 2019-09-09T08:38:14.540

0

Swift, 66 bytes

func f(n:Int){var a=0,b=1,c=0;while n>a{c=a;a=b;b=c+b};print(n<a)}

Try it out! - NOTE: Prints False as truthy and True for falsy.

Mr. Xcoder

Posted 2017-06-14T16:58:11.277

Reputation: 39 774

0

Groovy, 44 43 37 bytes

{n->[-4,4].any{!((n*n*5+it)**0.5%1)}}

If (5*(n**2)±4)**0.5 is ever an integer, the number is a fibbonacci number.

Magic Octopus Urn

Posted 2017-06-14T16:58:11.277

Reputation: 19 422

0

JS (ES6), 78 bytes

n=>{y=n?0:1;f=x=>x<3?1:f(x-1)+f(x-2);for(x=0;x<n+2;x++)f(x)==n?y=1:0;return y}

Ungolfed:

var f = n => {
    var y = n ? 0 : 1;
    f=x=>x<3?1:f(x-1)+f(x-2);//from this: https://codegolf.stackexchange.com/a/25142/70700
    for (var x = 0; x < n + 2; x++){
        if(f(x) == n){
            y = 1;
        }else{
            y = 0;
        }
    }
    return y;
};

user70700

Posted 2017-06-14T16:58:11.277

Reputation:

0

C (gcc), 76 bytes

F(n){return n<2?n:F(n-1)+F(n-2);}i;f(n){for(i=0;F(i)<n;i++);return F(i)==n;}

Try it online!

cleblanc

Posted 2017-06-14T16:58:11.277

Reputation: 3 360

Here is 3 bytes of that solution in the for loop. – NK1406 – 2018-12-15T19:00:12.277

0

C (gcc), 50 bytes

a,b,c;f(n){for(a=0,b=1;n>(c=a);b=c)a+=b;n=(n==c);}

Try it online!

Hagen von Eitzen

Posted 2017-06-14T16:58:11.277

Reputation: 371

0

Clojure, 61 bytes

(def s(lazy-cat[0 1](map +(rest s)s)))#((set(take(inc %)s))%)

This actually constructs the Fibonacci sequence s, grabs enough elements from it and checks if the input is found. Returns nil for falsy and the input number for truthy.

NikoNyrh

Posted 2017-06-14T16:58:11.277

Reputation: 2 361

0

Javascript, 89 bytes

function f(n){s=Math.sqrt;c=Math.ceil;x=5*n**2;a=s(x-4);b=s(x+4);return c(a)==a||c(b)==b}

This uses the fact that all fibonacci numbers have the property that 5x^2+4 or 5x^2-4 must be square. It takes the square root of these numbers and checks if they equal their ceiling value.

Javascript, 69 bytes (if it doesn't need to be a function)

s=Math.sqrt;c=Math.ceil;x=5*n**2;a=s(x-4);b=s(x+4);n=c(a)==a||c(b)==b

This one does the exact same thing, except instead of calling a function, you set n to the number to test, and n is set to true/false based on the result.

This is my first code golf entry, so let me know if there's anything to improve here. :)

Daffy

Posted 2017-06-14T16:58:11.277

Reputation: 985

0

QBIC, 24 bytes

≈g<:|g=p+q┘p=q┘q=g]?g=a

Explanation

≈g<:|   WHILE g (running fibonacci total) is less than input
g=p+q   Get the next fib by adding p (n-2, starts as 0) and q (n-1, starts as 1)
┘       (Syntactic linebreak)
p=q     increase n-2
┘       (Syntactic linebreak)
q=g     increase n-1
]       WEND
?g=a    PRINT -1 if g equals input (is a fib-number), or 0 if not.

steenbergh

Posted 2017-06-14T16:58:11.277

Reputation: 7 772

0

Python 3, 56 53 50 bytes

  • Thanks to @Fedone for 3 bytes: as a function
def f(m):
 a=b=1
 while a<m:b,a=a,a+b
 print(a==m)

Try it online!

officialaimm

Posted 2017-06-14T16:58:11.277

Reputation: 2 739

150 bytes as a function – Fedone – 2017-07-05T12:55:05.860

0

Swift, 72 bytes

func f(i:Int,a:Int=0,b:Int=1)->Bool{return a<i ?f(i:i,a:b,b:a+b) :i==a}

Un-golfed:

func f(i:Int, a:Int=0, b:Int=1)->Bool{
    return a<i ? f(i: i, a: b, b: a+b) : i==a
}

I am recursively calling f until a is equal to or greater then i. Then, I check to see if i and a are equal.

You can try it here

Caleb Kleveter

Posted 2017-06-14T16:58:11.277

Reputation: 647

0

Python 3, 59 Bytes

f=5*int(input())**2
print(not((f+4)**0.5%1and(f-4)**0.5%1))

wrymug

Posted 2017-06-14T16:58:11.277

Reputation: 772

You don't need the space between and and (f-4). – Post Rock Garf Hunter – 2017-07-05T17:46:42.833

0

[Python 3], 48 bytes

m=0;k=1;exec("k,m=m,m+k\nif k==n:print(1)\n"*n)

If n is the input, we generate the first n Fibonacci numbers and check if our input is one of them.

Sandeep Silwal

Posted 2017-06-14T16:58:11.277

Reputation: 129

0

MathGolf, 4 bytes

⌠rf╧

Try it online!

Explanation

We need to increment the input twice before creating the range because we know that \$F_{n+1} \geq n,\forall n \geq 0\$.

⌠      increment twice
 r     range(0, n)
  f    pop a, push fibonacci(a) (maps to the range)
   ╧   pop a, b, a.contains(b) (check if input is in list)

maxb

Posted 2017-06-14T16:58:11.277

Reputation: 5 754