151
\$\begingroup\$

The Fibonacci sequence is a sequence of numbers, where every number in the sequence is the sum of the two numbers preceding it. The first two numbers in the sequence are both 1. Here are the first few terms:

1 1 2 3 5 8 13 21 34 55 89 ...

Write the shortest code that either, in accordance to the standard rules:

  • Generates the Fibonacci sequence without end.

  • Given n calculates the nth term of the sequence. (Either 1 or zero indexed)

  • Given n calculates the first n terms of the sequence

You may use standard forms of input and output.


For the function that takes an n, a reasonably large return value (the largest Fibonacci number that fits your computer's normal word size, at a minimum) has to be supported.


Leaderboard

/* Configuration */
var QUESTION_ID = 85; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 3; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
 return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
 return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
 jQuery.ajax({
 url: answersUrl(answer_page++),
 method: "get",
 dataType: "jsonp",
 crossDomain: true,
 success: function (data) {
 answers.push.apply(answers, data.items);
 answers_hash = [];
 answer_ids = [];
 data.items.forEach(function(a) {
 a.comments = [];
 var id = +a.share_link.match(/\d+/);
 answer_ids.push(id);
 answers_hash[id] = a;
 });
 if (!data.has_more) more_answers = false;
 comment_page = 1;
 getComments();
 }
 });
}
function getComments() {
 jQuery.ajax({
 url: commentUrl(comment_page++, answer_ids),
 method: "get",
 dataType: "jsonp",
 crossDomain: true,
 success: function (data) {
 data.items.forEach(function(c) {
 if (c.owner.user_id === OVERRIDE_USER)
 answers_hash[c.post_id].comments.push(c);
 });
 if (data.has_more) getComments();
 else if (more_answers) getAnswers();
 else process();
 }
 }); 
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
 return a.owner.display_name;
}
function process() {
 var valid = [];
 
 answers.forEach(function(a) {
 var body = a.body;
 a.comments.forEach(function(c) {
 if(OVERRIDE_REG.test(c.body))
 body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
 });
 
 var match = body.match(SCORE_REG);
 if (match)
 valid.push({
 user: getAuthorName(a),
 size: +match[2],
 language: match[1],
 link: a.share_link,
 });
 else console.log(body);
 });
 
 valid.sort(function (a, b) {
 var aB = a.size,
 bB = b.size;
 return aB - bB
 });
 var languages = {};
 var place = 1;
 var lastSize = null;
 var lastPlace = 1;
 valid.forEach(function (a) {
 if (a.size != lastSize)
 lastPlace = place;
 lastSize = a.size;
 ++place;
 
 var answer = jQuery("#answer-template").html();
 answer = answer.replace("{{PLACE}}", lastPlace + ".")
 .replace("{{NAME}}", a.user)
 .replace("{{LANGUAGE}}", a.language)
 .replace("{{SIZE}}", a.size)
 .replace("{{LINK}}", a.link);
 answer = jQuery(answer);
 jQuery("#answers").append(answer);
 var lang = a.language;
 lang = jQuery('<a>'+lang+'</a>').text();
 
 languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
 });
 var langs = [];
 for (var lang in languages)
 if (languages.hasOwnProperty(lang))
 langs.push(languages[lang]);
 langs.sort(function (a, b) {
 if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
 if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
 return 0;
 });
 for (var i = 0; i < langs.length; ++i)
 {
 var language = jQuery("#language-template").html();
 var lang = langs[i];
 language = language.replace("{{LANGUAGE}}", lang.lang)
 .replace("{{NAME}}", lang.user)
 .replace("{{SIZE}}", lang.size)
 .replace("{{LINK}}", lang.link);
 language = jQuery(language);
 jQuery("#languages").append(language);
 }
}
body {
 text-align: left !important;
 display: block !important;
}
#answer-list {
 padding: 10px;
 width: 290px;
 float: left;
}
#language-list {
 padding: 10px;
 width: 290px;
 float: left;
}
table thead {
 font-weight: bold;
}
table td {
 padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
 <h2>Shortest Solution by Language</h2>
 <table class="language-list">
 <thead>
 <tr><td>Language</td><td>User</td><td>Score</td></tr>
 </thead>
 <tbody id="languages">
 </tbody>
 </table>
</div>
<div id="answer-list">
 <h2>Leaderboard</h2>
 <table class="answer-list">
 <thead>
 <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
 </thead>
 <tbody id="answers">
 </tbody>
 </table>
</div>
<table style="display: none">
 <tbody id="answer-template">
 <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
 </tbody>
</table>
<table style="display: none">
 <tbody id="language-template">
 <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
 </tbody>
</table>

mousetail
14.3k1 gold badge41 silver badges90 bronze badges
asked Jan 28, 2011 at 1:49
\$\endgroup\$
5
  • 6
    \$\begingroup\$ I am sort of waiting for a response like "f", 1 byte, in my math based golf language. \$\endgroup\$ Commented Aug 11, 2020 at 11:57
  • \$\begingroup\$ @ChrisJesterYoung can we use 1.0 are 1 only? \$\endgroup\$ Commented May 11, 2022 at 2:45
  • \$\begingroup\$ @NumberBasher 1.0 is fine. \$\endgroup\$ Commented May 20, 2022 at 19:10
  • \$\begingroup\$ What about 1.3? \$\endgroup\$ Commented Aug 28, 2022 at 15:10
  • 3
    \$\begingroup\$ Am I allowed to start the sequence with 0, 1? \$\endgroup\$ Commented Oct 11, 2022 at 3:41

354 Answers 354

1
2 3 4 5
...
12
95
\$\begingroup\$

Brainfuck, 22 bytes

+>++[-<<[->+>+<<]>>>+]

Generates the Fibonacci sequence gradually moving across the memory tape.

hyperneutrino
42.7k5 gold badges72 silver badges226 bronze badges
answered Jan 28, 2011 at 2:26
\$\endgroup\$
8
  • 6
    \$\begingroup\$ Beautiful! Litterally beautiful! Or perhaps not... anyways +1 for this :) \$\endgroup\$ Commented Aug 18, 2011 at 11:20
  • 3
    \$\begingroup\$ This is 3.344 or 4 bytes in compressed brainfuck. (6 ln(22)) / ln(256) \$\endgroup\$ Commented Feb 2, 2016 at 5:12
  • 36
    \$\begingroup\$ 16 bytes: +[[<+>->+>+<<]>] \$\endgroup\$ Commented Sep 12, 2016 at 5:19
  • 13
    \$\begingroup\$ 14 bytes: +[.[>+>+<<-]>] \$\endgroup\$ Commented Feb 10, 2019 at 20:38
  • 4
    \$\begingroup\$ @Stefnotch of course, the shorter one is destructive. The solution above terminates with the fibonacci sequence on the tape, which is what the 16 byte solution also does. \$\endgroup\$ Commented Feb 13, 2019 at 1:30
56
\$\begingroup\$

Haskell, (削除) 17 (削除ここまで) (削除) 15 (削除ここまで) 14 bytes

f=1:scanl(+)1f

Try it online!

hyperneutrino
42.7k5 gold badges72 silver badges226 bronze badges
answered Jan 28, 2011 at 1:56
\$\endgroup\$
3
  • 7
    \$\begingroup\$ Why not cut two spaces to f=0:scanl(+)1 f? \$\endgroup\$ Commented Jan 28, 2011 at 2:27
  • \$\begingroup\$ Wow, that's even shorter than the usual f@(_:x)=0:1:zipWith(+)f x! Have to remember it. \$\endgroup\$ Commented Feb 11, 2011 at 21:10
  • 7
    \$\begingroup\$ You may even strip another space: f=0:scanl(+)1f. \$\endgroup\$ Commented Feb 12, 2011 at 17:38
55
\$\begingroup\$

Perl 6, 10 chars:

Anonymous infinite fibonacci sequence list:

^2,*+*...*

Same as:

0, 1, -> $x, $y { $x + $y } ... Inf;

So, you can assign it to an array:

my @short-fibs = ^2, * + * ... *;

or

my @fibs = 0, 1, -> $x, $y { $x + $y } ... Inf;

And get the first eleven values (from 0 to 10) with:

say @short-fibs[^11];

or with:

say @fibs[^11];

Wait, you can get too the first 50 numbers from anonymous list itself:

say (^2,*+*...*)[^50]

That returns:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169
63245986 102334155 165580141 267914296 433494437 701408733 1134903170 
1836311903 2971215073 4807526976 7778742049

And some simple benchmark:

real 0m0.966s
user 0m0.842s
sys 0m0.080s

With:

$ time perl6 -e 'say (^2, *+* ... *)[^50]'

EOF

answered Nov 21, 2014 at 18:46
\$\endgroup\$
7
  • 2
    \$\begingroup\$ I wouldn't even think of ^2 as replacement for 0,1. +1 \$\endgroup\$ Commented Jan 3, 2015 at 20:20
  • 4
    \$\begingroup\$ This is no longer valid, you will have to write it as |^2,*+*...*, which is the same number of bytes as 0,1,*+*...*. \$\endgroup\$ Commented Nov 8, 2015 at 20:20
  • 10
    \$\begingroup\$ Perl is so weird. \$\endgroup\$ Commented Jan 29, 2016 at 5:45
  • 2
    \$\begingroup\$ What version of Perl 6 was this answer written in? \$\endgroup\$ Commented Jun 6, 2017 at 22:03
  • 4
    \$\begingroup\$ @CalculatorFeline There was a big change known as GLR (Great List Refactor) which happened shortly before the first official release which was on 2015年12月25日. This code would have worked right up until that time. \$\endgroup\$ Commented Mar 12, 2018 at 21:30
46
\$\begingroup\$

C# 4, 58 bytes

Stream (69; 65 if weakly typed to IEnumerable)

(Assuming a using directive for System.Collections.Generic.)

IEnumerable<int>F(){int c=0,n=1;for(;;){yield return c;n+=c;c=n-c;}}

Single value (58)

int F(uint n,int x=0,int y=1){return n<1?x:F(n-1,y,x+y);}
answered Aug 18, 2011 at 10:45
\$\endgroup\$
11
  • 7
    \$\begingroup\$ Given that n is a uint, n==0 can be shortened to n<1. And the stream can save a few chars by ditching the space after the generic type and declaring x in a wider scope than necessary. In fact, ditch x entirely: n+=c;c=n-c; \$\endgroup\$ Commented Aug 18, 2011 at 11:39
  • 2
    \$\begingroup\$ @Peter: Thanks, will edit when I get some time. \$\endgroup\$ Commented Aug 18, 2011 at 12:01
  • \$\begingroup\$ Your single value version is as long as my recursive lambda expression answer...nice! \$\endgroup\$ Commented Apr 9, 2013 at 17:29
  • 1
    \$\begingroup\$ @wizzwizz4 if I'm not mistaken, if !n works, then so should just n if you flip the conditional. \$\endgroup\$ Commented Feb 1, 2018 at 4:07
  • 6
    \$\begingroup\$ @JonSkeet Aw. And here I was thinking I'd beaten Jon Skeet at C#... :-) \$\endgroup\$ Commented Feb 1, 2018 at 20:16
34
\$\begingroup\$

GolfScript, 12

Now, just 12 characters!

1.{[email protected]+.}do
answered Jan 29, 2011 at 21:55
\$\endgroup\$
4
  • \$\begingroup\$ +1 nice work. If you make it shorter than 13 chars, I'll instantly accept your answer (unless someone makes an even shorter answer, of course). :-P \$\endgroup\$ Commented Jan 29, 2011 at 23:54
  • 1
    \$\begingroup\$ I love a challenge. Done! ;-) \$\endgroup\$ Commented Jan 30, 2011 at 0:10
  • \$\begingroup\$ Nice, you win. At least, until someone makes something even shorter (if that's even possible). :-P \$\endgroup\$ Commented Jan 30, 2011 at 0:33
  • 7
    \$\begingroup\$ that definition is almost as short as the name 'Fibonacci' itself! +1 \$\endgroup\$ Commented Jun 18, 2012 at 18:21
26
\$\begingroup\$

Hexagony, (削除) 18 (削除ここまで) (削除) 14 (削除ここまで) 12

Thanks Martin for 6 bytes!

1="/}.!+/M8;

Expanded:

 1 = "
 / } . !
+ / M 8 ;
 . . . .
 . . .

Try it online


Old, answer. This is being left in because the images and explanation might be helpful to new Hexagony users.

!).={!/"*10;$.[+{]

Expanded:

 ! ) .
 = { ! /
" * 1 0 ;
 $ . [ +
 { ] .

This prints the Fibonacci sequence separated by newlines.

Try it online! Be careful though, the online interpreter doesn't really like infinite output.

Explanation

There are two "subroutines" to this program, each is run by one of the two utilised IPs. The first routine prints newlines, and the second does the Fibonacci calculation and output.

The first subroutine starts on the first line and moves left to right the entire time. It first prints the value at the memory pointer (initialized to zero), and then increments the value at the memory pointer by 1. After the no-op, the IP jumps to the third line which first switches to another memory cell, then prints a newline. Since a newline has a positive value (its value is 10), the code will always jump to the fifth line, next. The fifth line returns the memory pointer to our Fibonacci number and then switches to the other subroutine. When we get back from this subroutine, the IP will jump back to the third line, after executing a no-op.

The second subroutine begins at the top right corner and begins moving Southeast. After a no-op, we are bounced to travel West along the second line. This line prints the current Fibonacci number, before moving the memory pointer to the next location. Then the IP jumps to the fourth line, where it computes the next Fibonacci number using the previous two. It then gives control back to the first subroutine, but when it regains control of the program, it continues until it meets a jump, where it bounces over the mirror that was originally used to point it West, as it returns to the second line.


Preliminary Pretty Pictures!

The left side of the image is the program, the right hand side represents the memory. The blue box is the first IP, and both IPs are pointing at the next instruction to be executed.

enter image description here

Note: Pictures may only appear pretty to people who have similarly limited skill with image editing programs :P I will add at least 2 more iterations so that the use of the * operator becomes more clear.

Note 2: I only saw alephalpha's answer after writing most of this, I figured it was still valuable because of the separation, but the actual Fibonacci parts of our programs are very similar. In addition, this is the smallest Hexagony program that I have seen making use of more than one IP, so I thought it might be good to keep anyway :P

answered Nov 27, 2015 at 22:28
\$\endgroup\$
6
  • \$\begingroup\$ You should link to whatever you used to make the pretty pictures, then put the link on esolangs.org/wiki/Hexagony. \$\endgroup\$ Commented Jan 20, 2016 at 22:32
  • 1
    \$\begingroup\$ @mbomb007 I used gimp to manually create each frame, then uploaded the images to some gif making website. Although, several times during this process I considered making a tool to do it, considering how tedious it was. \$\endgroup\$ Commented Jan 20, 2016 at 22:36
  • \$\begingroup\$ @FryAmTheEggman Impressive! Make it a challenge. I'm sure somebody will post an answer. :D Even better if you could create a website similar to fish's online interpreter. \$\endgroup\$ Commented Jan 20, 2016 at 22:37
  • \$\begingroup\$ @mbomb007 That might be a tad ambitious for a challenge on this site, not to mention it would probably suffer a lot from being really broad. I don't think I will post that, but feel free to do it yourself if you think you have a good way of presenting it. Also, I believe Timwi created a C# ide for hexagony, although I've never used it because I haven't bothered with mono. \$\endgroup\$ Commented Jan 20, 2016 at 22:44
  • 1
    \$\begingroup\$ @mbomb007 The ide lives here, by the way, forgot to link it last time. \$\endgroup\$ Commented Jan 20, 2016 at 22:51
25
\$\begingroup\$

Python 2, 34 bytes

Python, using recursion... here comes a StackOverflow!

def f(i,j):print i;f(j,i+j)
f(1,1)
answered Jan 29, 2011 at 22:22
\$\endgroup\$
25
\$\begingroup\$

><> - 15 characters

0:nao1v
a+@:n:<o
caird coinheringaahing
50.8k11 gold badges133 silver badges363 bronze badges
answered Mar 31, 2011 at 18:57
\$\endgroup\$
2
  • \$\begingroup\$ Though you can shorten it to 0:nao1v LF a+@:n:<o if you want to. Gives 15 :) In fact, this also makes the output slightly more readable... \$\endgroup\$ Commented Mar 18, 2013 at 7:28
  • 8
    \$\begingroup\$ 13 chars: 01r:nao$:@+$r \$\endgroup\$ Commented Apr 16, 2015 at 19:25
24
\$\begingroup\$

J, 10 chars

Using built-in calculation of Taylor series coefficients so maybe little cheaty. Learned it here.

 (%-.-*:)t.
 (%-.-*:)t. 0 1 2 3 4 5 10 100
0 1 1 2 3 5 55 354224848179261915075
answered Mar 7, 2013 at 16:46
\$\endgroup\$
4
  • 2
    \$\begingroup\$ @aditsu (q:^-^:p) 6 is 64 729 where p is even. J is probably good for what it does riddles. :) \$\endgroup\$ Commented Mar 7, 2013 at 22:54
  • 2
    \$\begingroup\$ Even better: (<:^-^:>) 4 is 81 and <:^-^:> 4 is 53.5982. \$\endgroup\$ Commented Mar 7, 2013 at 23:21
  • 2
    \$\begingroup\$ The emoji demonstrated here is what all J code should strive towards. On a side note, another alternative is +/@:!&i.- using 9 bytes. \$\endgroup\$ Commented Jul 31, 2016 at 4:26
  • 1
    \$\begingroup\$ @miles Very nice! You should post it as it is entirely different from mine. \$\endgroup\$ Commented Jul 31, 2016 at 10:21
21
\$\begingroup\$

COW, 108

 MoO moO MoO mOo MOO OOM MMM moO moO
 MMM mOo mOo moO MMM mOo MMM moO moO
 MOO MOo mOo MoO moO moo mOo mOo moo
answered Jan 12, 2014 at 17:35
\$\endgroup\$
19
\$\begingroup\$

Jelly, 3 bytes

+¡1

Try it online!

How it works

+¡1 Niladic link. No implicit input.
 Since the link doesn't start with a nilad, the argument 0 is used.
 1 Yield 1.
+ Add the left and right argument.
 ¡ For reasons‡, read a number n from STDIN.
 Repeatedly call the dyadic link +, updating the right argument with
 the value of the left one, and the left one with the return value.

¡ peeks at the two links to the left. Since there is only one, it has to be the body of the loop. Therefore, a number is read from input. Since there are no command-line arguments, that number is read from STDIN.

MD XF
14.2k5 gold badges68 silver badges107 bronze badges
answered Dec 17, 2015 at 3:11
\$\endgroup\$
15
\$\begingroup\$

Hexagony, 6 bytes

1.}=+!

Ungolfed:

 1 .
 } = +
 ! .

It prints the Fibonacci sequence without any separator.

emanresu A
46.1k5 gold badges111 silver badges254 bronze badges
answered Nov 3, 2015 at 13:04
\$\endgroup\$
1
  • 4
    \$\begingroup\$ This has the minor problem that it doesn't print any separator between the numbers. This isn't entirely well specified in the challenge though. (And I'm really happy someone is using Hexagony. :)) \$\endgroup\$ Commented Nov 3, 2015 at 13:19
12
\$\begingroup\$

Golfscript - single number - 12/11/10

12 chars for taking input from stdin:

~0 1@{.@+}*;

11 chars for input already on the stack:

0 1@{.@+}*;

10 chars for further defining 1 as the 0th Fibonacci number:

1.@{.@+}*;
answered Feb 28, 2011 at 17:28
\$\endgroup\$
1
  • 1
    \$\begingroup\$ The option is "Calculates, given n, the nth Fibonacci number". So ditch the ~ and you have 11 chars which take n on the stack and leave F_n on the stack. \$\endgroup\$ Commented Mar 31, 2011 at 19:29
12
\$\begingroup\$

Prelude, 12 bytes

One of the few challenges where Prelude is actually fairly competitive:

1(v!v)
 ^+^

This requires the Python interpreter which prints values as decimal numbers instead of characters.

Explanation

In Prelude, all lines are executed in parallel, with the instruction pointer traversing columns of the program. Each line has its own stack which is initialised to zero.

1(v!v)
 ^+^
| Push a 1 onto the first stack.
 | Start a loop from here to the closing ).
 | Copy the top value from the first stack to the second and vice-versa.
 | Print the value on the first stack, add the top two numbers on the second stack.
 | Copy the top value from the first stack to the second and vice-versa.

The loop repeats forever, because the first stack will never have a 0 on top.

Note that this starts the Fibonacci sequence from 0.

answered Jan 25, 2015 at 14:24
\$\endgroup\$
12
\$\begingroup\$

Ruby, (削除) 29 27 25 (削除ここまで) 24 bytes

p a=b=1;loop{b=a+a=p(b)}

Edit: made it an infinite loop. ;)

DialFrost
5,1792 gold badges15 silver badges57 bronze badges
answered Jan 28, 2011 at 7:51
\$\endgroup\$
9
  • 15
    \$\begingroup\$ did anyone notice b=a+a=b is a palindrome? :) \$\endgroup\$ Commented Jan 28, 2011 at 11:11
  • 3
    \$\begingroup\$ yes st0le did :) \$\endgroup\$ Commented Feb 1, 2011 at 12:24
  • \$\begingroup\$ I know I'm late to the party, but can someone explain how the b=a+a=b part works? Can't seem to wrap my head around it. \$\endgroup\$ Commented Feb 7, 2012 at 17:58
  • 4
    \$\begingroup\$ @GigaWatt, Think of it this way, Instructions are executed left to right...so newb=olda+(a=oldb) \$\endgroup\$ Commented Feb 8, 2012 at 5:19
  • 1
    \$\begingroup\$ On second thought: 22 bytes \$\endgroup\$ Commented Jun 17, 2022 at 5:24
11
\$\begingroup\$

Mathematica, 9 chars

Fibonacci

If built-in functions are not allowed, here's an explicit solution:

Mathematica, (削除) 33 (削除ここまで) (削除) 32 (削除ここまで)31 chars

#&@@Nest[{+##,#}&@@#&,{0,1},#]&
Mr.Wizard
2,63118 silver badges17 bronze badges
answered Feb 1, 2012 at 20:05
\$\endgroup\$
4
  • \$\begingroup\$ #&@@Nest[{#+#2,#}&@@#&,{0,1},#]& 32 chars. \$\endgroup\$ Commented Mar 7, 2013 at 3:39
  • 1
    \$\begingroup\$ @chyanog 31: #&@@Nest[{+##,#}&@@#&,{0,1},#]& \$\endgroup\$ Commented Mar 18, 2013 at 6:24
  • 1
    \$\begingroup\$ @Mr.Wizard 24 chars (26 bytes): Round[GoldenRatio^#/√5]& \$\endgroup\$ Commented Apr 2, 2018 at 4:28
  • 1
    \$\begingroup\$ or 23 chars (27 bytes): Round[((1+√5)/2)^#/√5]& \$\endgroup\$ Commented Apr 2, 2018 at 4:56
10
\$\begingroup\$

DC (20 bytes)

As a bonus, it's even obfuscated ;)

zzr[dsb+lbrplax]dsax

EDIT: I may point out that it prints all the numbers in the fibonacci sequence, if you wait long enough.

answered Feb 1, 2011 at 13:07
\$\endgroup\$
2
  • 16
    \$\begingroup\$ I wouldn't call it obfuscated -- obfuscated code is supposed to be difficult to understand, and as far as dc goes the code here is completely straightforward. \$\endgroup\$ Commented Feb 6, 2011 at 8:17
  • \$\begingroup\$ I think dc(1) is inherently obfuscated. \$\endgroup\$ Commented Jul 30, 2021 at 17:46
10
\$\begingroup\$

TI-BASIC, 11

By legendary TI-BASIC golfer Kenneth Hammond ("Weregoose"), from this site. Runs in O(1) time, and considers 0 to be the 0th term of the Fibonacci sequence.

int(round(√(.8)cosh(Anssinh ̅1(.5

To use:

2:int(round(√(.8)cosh(Anssinh ̅1(.5
 1
12:int(round(√(.8)cosh(Anssinh ̅1(.5
 144

How does this work? If you do the math, it turns out that sinh ̅1(.5) is equal to ln φ, so it's a modified version of Binet's formula that rounds down instead of using the (1/φ)^n correction term. The round( (round to 9 decimal places) is needed to prevent rounding errors.

\$\endgroup\$
9
\$\begingroup\$

K - 12

Calculates the n and n-1 Fibonacci number.

{x(|+\)/0 1}

Just the nth Fibonacci number.

{*x(|+\)/0 1}
answered Apr 4, 2011 at 15:45
\$\endgroup\$
3
  • \$\begingroup\$ +1 Not bad! If you could shrink it just one character (and provide me a way to test it), I'll accept your answer. :-) \$\endgroup\$ Commented Apr 4, 2011 at 15:47
  • \$\begingroup\$ The only way to shrink it would be to replace the function with a call to a known number: n(|+\)/0 1 Test it using this interpreter. \$\endgroup\$ Commented Apr 4, 2011 at 16:04
  • 1
    \$\begingroup\$ Could trim a byte by using !2 in place of 0 1: {x(|+\)/!2} \$\endgroup\$ Commented Jul 29, 2021 at 18:21
9
\$\begingroup\$

Julia, 18 bytes

n->([1 1;1 0]^n)[]
answered Mar 17, 2016 at 1:05
\$\endgroup\$
8
\$\begingroup\$

Java, 55

I can't compete with the conciseness of most languages here, but I can offer a substantially different and possibly much faster (constant time) way to calculate the n-th number:

Math.floor(Math.pow((Math.sqrt(5)+1)/2,n)/Math.sqrt(5))

n is the input (int or long), starting with n=1. It uses Binet's formula and rounds instead of the subtraction.

answered Sep 8, 2011 at 13:49
\$\endgroup\$
3
  • \$\begingroup\$ I love this solution \$\endgroup\$ Commented Mar 27, 2016 at 2:27
  • \$\begingroup\$ This doesn't seem to work for me, but it's early and I may be missing something! Assuming 0 to be the first number in the sequence, this gives 0, 0, 1, 1, 3, 4, 8, 12, 21, 33 for the first 10 numbers \$\endgroup\$ Commented Jun 16, 2017 at 9:28
  • \$\begingroup\$ @Shaggy Oops! Sorry, I introduced a bug - fixed now. \$\endgroup\$ Commented Jun 16, 2017 at 10:06
8
\$\begingroup\$

05AB1E, 7 bytes

Code:

1$<FDr+

Try it online!

answered Jul 5, 2016 at 11:16
\$\endgroup\$
1
  • 4
    \$\begingroup\$ Hi, and welcome to PPCG! Nice first post! \$\endgroup\$ Commented Jul 5, 2016 at 13:41
8
\$\begingroup\$

Dodos, 26 bytes

	dot F
F
	F dip
	F dip dip

Try it online!

How it works

The function F does all the heavy lifting; it is defined recursively as follows.

F(n) = ( F(|n - 1|), F(||n - 1| - 1|) )

Whenever n> 1, we have |n - 1| = n - 1 < n and ||n - 1| - 1| = |n - 1 - 1| = n - 2 < n, so the function returns ( F(n - 1), F(n - 2) ).

If n = 0, then |n - 1| = 1> 0; if n = 1, then ||n - 1| - 1| = |0 - 1| = 1 = 1. In both cases, the attempted recursive calls F(1) raise a Surrender exception, so F(0) returns 0 and F(1) returns 1.

For example, F(3) = ( F(1), F(2) ) = ( 1, F(0), F(1) ) = ( 1, 0, 1 ).

Finally, the main function is defined as

main(n) = sum(F(n))

so it adds up all coordinates of the vector returned by F.

For example, main(3) = sum(F(3)) = sum(1, 0, 1) = 2.

answered Mar 15, 2018 at 3:59
\$\endgroup\$
1
  • \$\begingroup\$ I read your README (DODOS) and am super intrigued; it’s a really neat concept! But I can’t find it on Esolangs or anywhere else. Did you come up with it? \$\endgroup\$ Commented Apr 2, 2020 at 13:44
8
\$\begingroup\$

Whispers v3, 35 bytes

> Input
> fn
>> 2f1
>> Output 3

Try it online! (or don't, as this uses features exclusive to v3)

Simply takes the first \$n\$ elements of the infinite list of Fibonacci numbers.

answered Feb 19, 2021 at 17:24
\$\endgroup\$
1
  • 7
    \$\begingroup\$ Welcome to Code Gol...hey wait a minute \$\endgroup\$ Commented Feb 19, 2021 at 19:00
8
\$\begingroup\$

TypeScript's type system, (削除) 193 (削除ここまで) (削除) 188 (削除ここまで) 186 bytes

type L='length'
type T<N,U extends 0[]=[]>=U[L]extends N?U:T<N,[...U,0]>
type S<A,B>=T<A>extends[...infer U,...T<B>]?U[L]:0
type F<N>=N extends 0|1?N:[...T<F<S<N,1>>>,...T<F<S<N,2>>>][L]

There's no way to do I/O here, but we can use hovering to view the value (also note that the generated JS is empty):

Fibonacci(10)

Unfortunately, TypeScript has strict recursion limits and on F18 we get a Type instantiation is excessively deep and possibly infinite. error:

Fibonacci(11)

Demo on TypeScript Playground


Ungolfed version:

type NTuple<N extends number, Tup extends unknown[] = []> =
 Tup['length'] extends N ? Tup : NTuple<N, [...Tup, unknown]>;
type Add<A extends number, B extends number> =
 [...NTuple<A>, ...NTuple<B>]['length'];
type Sub<A extends number, B extends number> =
 NTuple<A> extends [...(infer Tup), ...NTuple<B>] ? Tup['length'] : never;
type Fibonacci<N extends number> =
 N extends 0 | 1 ? N : Add<Fibonacci<Sub<N, 1>>, Fibonacci<Sub<N, 2>>>;
answered Oct 3, 2021 at 8:38
\$\endgroup\$
1
7
\$\begingroup\$

Trianguish, (削除) 152 (削除ここまで) 135 bytes

00000000: 0c05 10d8 0201 40d7 0401 4110 4102 a060
00000010: 2c02 b080 2c02 8050 20e4 0211 0710 e209
00000020: 1110 4028 0d00 6020 2902 10c3 0802 a107
00000030: 02a1 0502 8027 0910 290b 1110 403b 0890
00000040: 204d 03d0 503c 0790 602a 1071 02a0 9027
00000050: 0280 b110 8111 0402 70e2 0501 402a 0202
00000060: 9106 1107 0291 0b11 0902 702b 1040 2a10
00000070: 6110 2102 9050 2802 70b1 1071 1104 1102
00000080: 02a1 0502 802c 05 

Two loop? Too many loop!

Try it online!


Trianguish is my newest language, a cellular automaton sort of thing which uses a triangular grid of "ops" (short for "operators"). It features self-modification, a default max int size of 216, and an interpreter which, in my opinion, is the coolest thing I've ever created (taking over forty hours and 2k SLOC so far).

This program consists of two precisely timed loops, each taking exactly (削除) 17 (削除ここまで) 11 ticks. The first, in the top right is what actually does the fibonacci part; two S-builders are placed in exactly the right position such that two things occur in exactly the same number of ticks:

  1. The left S-builder, x, copies its contents to y
  2. The sum of x and y is copied to x

Precise timing is required, as if either of these occurred with an offset from the other, non-fibonacci numbers would appear in brief pulses, just long enough to desync everything. Another way this could have been done is with T-switches allowing only a single tick pulse from one of the S-builders, which would make precise timing unneeded, but this is more elegant and likely smaller.

The second loop, which is also 11 ticks, is pretty simple. It starts off with a 1-tick pulse of 1n, and otherwise is 0n, allowing an n-switch and t-switch to allow the contents of x to be outputted once per cycle. Two S-switches are required to make the clock use an odd number of ticks, but otherwise it's just a loop of the correct number of wires.

This program prints infinitely many fibonacci numbers, though if run with Mod 216 on, it will print them, as you might guess, modulo'd by 216 (so don't do that :p).

answered Jul 29, 2022 at 17:15
\$\endgroup\$
1
  • 1
    \$\begingroup\$ yo dang that's a cool lang \$\endgroup\$ Commented Sep 20, 2022 at 15:37
7
\$\begingroup\$

Perl 5, (削除) 36 (削除ここまで) (削除) 35 (削除ここまで) (削除) 33 (削除ここまで) 32 bytes

-2 bytes thanks to dingledooper

1x<>~~/^(..?)*$(??{++$i})/;say$i

Try it online!

This works by using the regex ^(..?)*$ to count how many distinct partitions \$n\$ has as a sum of the numbers \1ドル\$ and \2ドル\$.

For example, \5ドル\$ can be represented in the following \8ドル\$ ways:

1+1+1+1+1
1+1+1+2
1+1+2+1
1+2+1+1
1+2+2
2+1+1+1
2+1+2
2+2+1

This tells us that the \$F_5=8\$.

I had this basic idea on 2014年03月05日 but it didn't occur to me until today to try coding it into a program.

The following two paragraphs explain the 33 byte version:

To count the number of distinct matches ^(..?)*$ can make in a string \$n\$ characters long, we must force Perl's regex engine to backtrack after every time the regex completes a successful match. Expressions like ^(..?)*$. fail to do what we want, because Perl optimizes away the non-match, not attempting to evaluate the regex even once. But it so happens that it does not optimize away an attempt to match a backreference. So we make it try to match 1円. This will always fail, but the regex engine isn't "smart" enough to know this, so it tries each time. (It's actually possible for a backreference to match after $ with the multiline flag disabled, if it captured a zero-length substring. But in this particular regex, that can never happen.)

Embedded code is used to count the number of times the regex engine completes a match. This is the (?{++$i}), which increments the variable $i. We then turn it into a non-match after the code block executes.

To get this down to 32 bytes, a "postponed" regular subexpression embedded code block is used, $(??{...}) instead of $(?{...}). This not only executes the code, but then compiles that code's return value as a regex subexpression to be matched. Since the return value of ++$i is the new value of $i, this will cause the match to fail and backtrack, since a decimal number (or any non-empty string) will never match at the end of a string.

This does make the 32 byte version about 7 times slower than the 33 byte version, because it has to recompile a different decimal number as a regex after each failed match (i.e. the same number of times as the Fibonacci number that the program will output). Using (??{++$i,0}) is almost as fast as (?{++$i})1円, as Perl optimizes the case in which the return value has not changed last time. But that would defeat the purpose of using $(??{...}) in the first place, because it would be 1 byte longer instead of 1 byte shorter.

As to the sequence itself – for golf reasons, the program presented above defines \$F_0=1,\ F_1=1\$. To define \$F_0=0,\ F_1=1\$ we would need an extra byte:

1x<>~~/^.(..?)*$(??{++$i})/;say$i

Try it online!

In the versions below, (?{++$i})1円 is used for speed (at the golf cost of 1 extra byte), to make running the test suite more convenient.

Here it is as a (reasonably) well-behaved anonymous function ((削除) 47 (削除ここまで) (削除) 46 (削除ここまで) 44 bytes):

sub{my$i;1x pop~~/^.(..?)*$(?{--$i})1円/;-$i}

Try it online! - Displays \$F_0\$ through \$F_{31}\$

The above actually runs faster than the standard recursive approach (39 bytes):

sub f{my$n=pop;$n<2?$n:f($n-2)+f($n-1)}

Try it online! - Displays \$F_0\$ through \$F_{31}\$

If that is golfed down using Xcali's technique it becomes even slower, at 38 bytes:

sub f{"@_"<2?"@_":f("@_"-2)+f("@_"-1)}

Try it online! - Displays \$F_0\$ through \$F_{31}\$

or with the same indexing as my main answer here, 34 bytes:

sub f{"@_"<2||f("@_"-2)+f("@_"-1)}

Try it online! - Displays terms \0ドル\$ through \30ドル\$

See Patience, young "Padovan" for more variations and comparisons.

Perl 5 -p, 28 bytes

1x$_~~/^(..?)*$(??{++$\})/}{

Try it online!

I've just learned now, 16 months after posting the main answer above, that Ton Hospel's Sum of combinations with repetition answer used this same basic technique, predating my post by 3 years.

By combining the tricks used in that answer with those already used here, the program length can be reduced even further.

Perl actually literally wraps the program in a loop using string concatenation when called with -p, which I was surprised to learn (I would have implemented it in Perl as an emulated loop). So when this program is wrapped in while (<>) { ... ; print $_} by the -p flag, it becomes:

while (<>) {1x$_~~/^(..?)*$(??{++$\})/}{; print $_}

while (<>) implicitly assigns the input from stdin, <>, to $_ (which isn't done when using <> normally) at the beginning of each iteration of its loop.

$\ is the print output terminator. By default it is empty, but the above program turns it into an integer by incrementing it on every possible match found by the regex. If only one number \$n\$ is sent to the program via stdin, followed by EOF, then upon exiting the loop $\ will actually represent the \$n\$th Fibonacci number.

The while (<>) exits when it encounters EOF, giving $_ an empty value. So then print $_ will print that empty value, followed by the value of $\.

As such, it defeats the intended purpose of the -p flag, as this program works properly when given a single value followed by EOF; if given multiple newline delimited values, it will output the sum of those Fibonacci numbers after finally being sent EOF (if running the program interactively, this would be done by pressing Ctrl+D at the beginning of a line).

Contrast this with an actually loopable Perl -p program at 37 bytes:

1x$_~~/^(..?)*$(?{++$i})1円/;$i%=$_=$i

Try it online!

If the same multiline input is given to the 28 byte program, this happens: Try it online!

Sadly, the $\ trick can't be used with say; it only applies to print. The ,ドル variable applies to both print and say, but only comes into play if at least two items are printed, e.g. say"","".

answered Apr 11, 2021 at 2:29
\$\endgroup\$
4
  • 1
    \$\begingroup\$ You can convert this to Perl 6 using the ex flag to match all possible combinations. Try it online! \$\endgroup\$ Commented Apr 16, 2021 at 22:49
  • \$\begingroup\$ @JoKing Awesome, thanks! I was thinking of looking into Raku, but now I definitely will. \$\endgroup\$ Commented Apr 16, 2021 at 23:04
  • \$\begingroup\$ @JoKing Have you considered defining a SBCS for Raku? It's a shame not to be able to use as it would save a byte. There are probably plenty of other examples. \$\endgroup\$ Commented Apr 17, 2021 at 5:53
  • 1
    \$\begingroup\$ 33 with smartmatch: 1x<>~~/^(..?)*$(?{++$i})1円/;say$i \$\endgroup\$ Commented Feb 10, 2022 at 6:57
7
\$\begingroup\$

K - 8 bytes

+/[;1;0]

Explanation

It makes use of ngn/k's recurrence builtin.

How to use

Calculates the nth fibonacci number.

To calculate the nth put the number at the end of the program:

+/[;1;0]40
answered Oct 25, 2022 at 23:24
\$\endgroup\$
4
  • 2
    \$\begingroup\$ Welcome to Code Golf, and nice answer! \$\endgroup\$ Commented Oct 25, 2022 at 23:36
  • \$\begingroup\$ It's annoying how this doesn't seem to be documented. (and hence I have no idea how it works, lol) \$\endgroup\$ Commented Oct 26, 2022 at 1:16
  • \$\begingroup\$ Yeah its not really documented because its specific to ngn/k, but here is something: ngn.codeberg.page/txt/slash.html So it just applies F to the previous two items. And if you use the 4 arg overload, it applies F to every 3 previous elements and so on. hopefully that clears some things up :) \$\endgroup\$ Commented Oct 26, 2022 at 1:56
  • \$\begingroup\$ Ah I see, so the [...;...;] is just a way of providing multiple arguments to +/? The main problem is that the ngn/k documentation isn't very verbose, it just says like one word to say what a function does, so it doesn't make sense often. \$\endgroup\$ Commented Oct 26, 2022 at 2:17
6
\$\begingroup\$

Ruby, 25 chars

st0le's answer shortened.

p 1,a=b=1;loop{p b=a+a=b}
answered Apr 4, 2011 at 11:44
\$\endgroup\$
2
  • 7
    \$\begingroup\$ Actually you can shorten it even further using a=b=1;loop{p a;b=a+a=b} \$\endgroup\$ Commented Apr 4, 2011 at 12:20
  • 10
    \$\begingroup\$ So you st0le his answer? :P \$\endgroup\$ Commented Jan 20, 2016 at 22:55
6
\$\begingroup\$

FAC: Functional APL, 4 characters (!!)

Not mine, therefore posted as community wiki. FAC is a dialect of APL that Hai-Chen Tu apparently suggested as his PhD dissertation in 1985. He later wrote an article together with Alan J. Perlis called "FAC: A Functional APL Language". This dialect of APL uses "lazy arrays" and allow for arrays of infinite length. It defines an operator "iter" () to allow for compact definition of some recursive sequences.

The monadic ("unary") case of is basically Haskell's iterate, and is defined as (F⌼) A ≡ A, (F A), (F (F A)), .... The dyadic ("binary") case is defined somewhat analogously for two variables: A (F⌼) B ≡ A, B, (A F B), (B F (A F B)), .... Why is this useful? Well, as it turns out this is precisely the kind of recurrence the Fibonacci sequence has. In fact, one of the examples given of it is

1+⌼1

producing the familiar sequence 1 1 2 3 5 8 ....

So, there you go, quite possibly the shortest possible Fibonacci implementation in a non-novelty programming language. :D

answered Nov 30, 2013 at 10:39
\$\endgroup\$
1
  • \$\begingroup\$ Oh, I accidentally un-community-wikied your post as part of my (manual) bulk-unwikiing. Oh well. ;-) \$\endgroup\$ Commented Dec 2, 2013 at 13:57
1
2 3 4 5
...
12

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.