19
\$\begingroup\$

Given an integer n, output the following ASCII art to n rows:

1+1=2 1+2=3 2+3=5 3+5=8 5+8=13 

Essentially, the first row is 1+1=2 and the nth row (1-indexed) is \$f_n + f_{n+1} = f_{n+2}\$ where \$f\$ is the Fibonacci sequence, padded so the numbers line up with the previous row.

You may instead output it infinitely. You may output a list of lines.

This is , shortest wins!

Testcase

The output for 20 should be:

1+1=2 1+2=3 2+3=5 3+5=8 5+8=13 8+13=21 13+21=34 21+34=55 34+55=89 55+89=144 89+144=233 144+233=377 233+377=610 377+610=987 610+987=1597 987+1597=2584 1597+2584=4181 2584+4181=6765 4181+6765=10946 6765+10946=17711 
\$\endgroup\$
10
  • 3
    \$\begingroup\$ How exactly is this a triangle? \$\endgroup\$ Commented Mar 5, 2022 at 4:07
  • 5
    \$\begingroup\$ Fibonacci swoosh? \$\endgroup\$ Commented Mar 5, 2022 at 6:10
  • 1
    \$\begingroup\$ Is leading whitespace allowed? \$\endgroup\$ Commented Mar 5, 2022 at 17:12
  • 1
    \$\begingroup\$ @pxeger Allowed? Seems to be required as I read it... \$\endgroup\$ Commented Mar 7, 2022 at 16:39
  • 1
    \$\begingroup\$ @DarrelHoffman I mean constant extra leading whitespace, like this: gist.github.com/pxeger/768a57edc59ce03a673d1d6a943ff0d7 \$\endgroup\$ Commented Mar 7, 2022 at 18:12

23 Answers 23

7
\$\begingroup\$

Python 2, 67 bytes

Outputs the sequence indefinitely.

a=b=l=1 while 1:print'%*d+%d='%(l,a,b)+`a+b`;l-=~len(`b`);a,b=b,a+b 

Try it online!

\$\endgroup\$
5
\$\begingroup\$

JavaScript (ES8), 79 bytes

f=(n,A=B=1,p)=>n?''.padEnd(p)+A+`+${B}=${B+=A} `+f(n-1,B-A,(A+"").length-~p):'' 

Try it online!

Commented

f = ( // f is a recursive function taking: n, // n = input A = B = 1, // A, B = Fibonacci variables p // p = padding length, initially undefined ) => // n ? // if n is not equal to 0: ''.padEnd(p) + // append p spaces (none if p is undefined) A + // followed by A `+${B}=${B += A}\n` + // followed by "+[B]=[B+A]\n" (A is added to B) f( // followed by the result of a recursive call: n - 1, // decrement n B - A, // update A to the previous value of B (A + "") // add the length of A coerced to a string + 1 .length - ~p // to p ) // end of recursive call : // else: '' // stop the recursion 
\$\endgroup\$
5
\$\begingroup\$

C (gcc), 71 66 bytes

-5 thanks to Sisyphus

i,j;main(k){for(;;)printf("%*d+%d%n=%d\n",i,j=k-j,k+=j,&i,j+k+k);} 

Try it online!

Outputs indefinitely.

\$\endgroup\$
1
  • \$\begingroup\$ 66 bytes using %n: Try it online! \$\endgroup\$ Commented Mar 8, 2022 at 11:47
4
\$\begingroup\$

Charcoal, 25 bytes

≔E²¦¹ηFN«I⌊η+≔⟦⌈ηΣη⟧η⟦⪫η= 

Try it online! Link is to verbose version of code. Explanation:

≔E²¦¹η 

Start with two 1s.

FN« 

Repeat n times.

I⌊η 

Output the first element of the old pair.

+ 

Output a +.

≔⟦⌈ηΣη⟧η 

Replace the pair with the second element and their sum.

⟦⪫η= 

Output the new pair joined with = and move the cursor down.

\$\endgroup\$
4
\$\begingroup\$

Pip, 30 bytes

W P[xi::o'+o+:i'=i+o]x.:sX#i+1 

Outputs forever. Attempt This Online!

Explanation

W P[xi::o'+o+:i'=i+o]x.:sX#i+1 i is 0, o is 1, x is "", s is " " (implicit) [ ] Put the following in a list: x The indent: x i::o Swap i (the smaller number) with o (the larger number) and return the new value of i '+ Plus sign o+:i Add i to o in-place and return the new value of o '= Equals sign i+o Add i and o P Print the list (concatenating its elements by default) W Loop while the list is truthy (which is always): #i Length of i +1 Plus 1 sX That many spaces x.: Concatenate with x in-place 
\$\endgroup\$
4
\$\begingroup\$

Python 3.8 (pre-release), 66 bytes @emanresu A

a=b=l=1 while l:=len(x:=f"{a:>{l}}+{b}=%d")-3:a,b=b,a+b;print(x%b) 

Try it online!

Old Python 3.8 (pre-release), 67 bytes

a=b=l=1 while l:=len(x:=f"{a:>{l}}+{b}"):a,b=b,a+b;print(x+f'={b}') 

Try it online!

Based on @dingledooper's Python 2 answer.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ You can save a byte with some cursed formatting :) \$\endgroup\$ Commented Mar 5, 2022 at 4:12
3
\$\begingroup\$

SNOBOL4 (CSNOBOL4), 90 87 84 bytes

	N =1 N	N =M + (M =N) 	OUTPUT =P =DUPL(' ',X) M '+' N '=' M + N 	P @X N '='	:(N) END 

Try it online!

Outputs infinitely, but experiences integer overflow after a short while.

\$\endgroup\$
3
\$\begingroup\$

Jelly, 22 bytes

+2ÆḞ€DżṖ©;⁾+=Ɗ⁶ṁ$®¦F)Y 

A full program that accepts an integer and prints the result.

Try it online!

How?

+2ÆḞ€DżṖ©;⁾+=Ɗ⁶ṁ$®¦F)Y - Main Link: integer, N ) - for each V in [1..N]: +2 - V add two ÆḞ€ - Fibbonacci of each of [1..V+2] D - to decimal digits -> [[1],[1],[2],...,Digits(Fib(V+2))] call this FibDigits Ɗ - last three links as a monad - f(V): Ṗ - pop -> [1..V-1] © - (copy this to the register) ⁾+= - ['+', '='] ; - concatenate -> [1,2,3,...,V-1,'+','='] call this Fillers ż - FibDigits zip with Fillers ¦ - sparse application... ® - ...to indices: recall from register -> [1..V-1] $ - ...action: last two links as a monad: ⁶ - space character ṁ - mould like (e.g. [[1,4,4],12] -> [[' ',' ',' '], ' '] F - flatten Y - join with newlines - implicit print 
\$\endgroup\$
3
\$\begingroup\$

Vyxal, 19 bytes

ÞF3l(:n‛+=Y∑꘍,nhL›+ 

Try it Online!

Outputs infinitely.

ÞF3l # Take the infinite list of Fibonacci numbers, and get overlapping groups of 3 ( # Looping over that... Y∑ # Interleave... n # The tuple of three numbers ‛+= # With '+=' : ꘍ # Pad that with the correct amount of spaces, without popping the padding amount , # Print that + # Add to the padding amount (initially 0) nhL› # The length of the first number in the tuple, plus one. 
\$\endgroup\$
2
\$\begingroup\$

Vyxal j, 30 bytes

ÞFẎ3l⟑‛+=fY∑¥$꘍:\=ḟnḢvL₌t¯-h-£ 

Try it Online!

A big cursed mess of formatting and registering.

\$\endgroup\$
2
\$\begingroup\$

Retina 0.8.2, 55 bytes

 1=1 {`.*\+ $.&$* = + \d+.(\d+) $&=$&$*_$1$*_ :`_+ $.& 

Try it online! Tries to output indefinitely but runs out of memory after about 50 seconds on TIO. Explanation:

 1=1 

Initialise the buffer with a hypothetical previous line.

{` 

Repeat indefinitely.

.*\+ $.&$* 

Replace up to and including the + with spaces. (This only applies after the first loop.)

= + 

Change the = into a +.

\d+.(\d+) $&=$&$*_$1$*_ 

Append the sum of the two values in unary.

:`_+ $.& 

Convert the unary to decimal and output the result.

\$\endgroup\$
2
\$\begingroup\$

Python, 117 107 103 99 88 bytes

p="1=1" while p:=" "*(a:=1+p.find("+"))+eval("f'{%s=}'"%p[a:].replace("=","+")):print(p)

Attempt This Online!

Outputs infinitely.

Can probably be much improved.

\$\endgroup\$
2
  • \$\begingroup\$ How do you use ":=" in a lambda? \$\endgroup\$ Commented Mar 4, 2022 at 21:16
  • 1
    \$\begingroup\$ @Fmbalbuena What do you mean by "how"? It's the same as anywhere else \$\endgroup\$ Commented Mar 4, 2022 at 21:19
2
\$\begingroup\$

05AB1E, 23 22 bytes

ÌLÅfü3ε„+=.ιJ¯Oú,yнg>ˆ 

-1 byte after being inspired by @JonathanAllan's Jelly answer

Outputs the first \$n\$ lines.

Try it online.

Or a minor 22 bytes alternative:

ÌLÅfDü3„+=δ.ιJs€g>.¥ú» 

Try it online.

And the infinite sequence would be 22 bytes as well:

∞Åfü3vy„+=.ιJ¯Oú,yнg>ˆ 

Try it online.

Explanation:

Ì # Increase the (implicit) input-integer by 2 L # Pop and push a list in the range [1,input+2] Åf # Get the 0-based n'th Fibonacci value for each of these ü3 # Pop and push all overlapping triplets of this list ε # Foreach over the triplets: # (implicitly push the current triplet) „+=.ι # Intersperse it with "+" and "=" delimiters J # Join this list together to a string ¯ # Push the global_array (empty by default) O # Sum it together ú # Pad the string with that many leading spaces , # Pop and output this line with trailing newline y # Push the pair again н # Pop and push its first item g # Pop and push its length > # Increase it by 1 ˆ # Pop and add it to the global_array 
\$\endgroup\$
2
  • \$\begingroup\$ You might be able to save bytes on the infinite version by porting my Vyxal answer and keeping the padding amount on the stack? \$\endgroup\$ Commented Mar 5, 2022 at 21:47
  • \$\begingroup\$ @emanresuA I'm afraid not. It would be 22 bytes as well. 05AB1E remembers the last value if it needs an argument and the stack is now empty, so I will have to push an explicit 0 at the start (otherwise it will use the infinite overlapping triplets list for the padding). In addition, I need an explicit Duplicate within the loop. That, combined with the 1 byte longer Fibonacci builtin compared to your Vyxal answer, is an alternative infinite 22-byter. \$\endgroup\$ Commented Mar 5, 2022 at 22:08
2
\$\begingroup\$

R, 76 bytes

l=b=1 repeat{cat(sprintf("%*d+%d=%d ",l,T,b,s<-T+b));l=l+nchar(b)+1;T=b;b=s} 

Try it online!

Outputs infinitely.


If leading whitespace is allowed:

R, 74 69 bytes

b=1 repeat cat(sprintf("%*d+%d=%d ",F<-F+nchar(+T)+1,T,b,b<-T+(T=b))) 

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Retina, 54 bytes

K`1+1=2 "$+"+`(\d+)=(\d+)$ $&¶$.%`* $1+$2=$.(*_$2* A`$ 

Try it online! No test suite because of the way the program uses history. Explanation:

K`1+1=2 

Replace the input with the first line of the output.

"$+"+` 

Repeat n times.

(\d+)=(\d+)$ 

Match fₙ=fₙ₊₁ from the previous line.

$&¶$.%`* $1+$2=$.(*_$2* 

Append fₙ+fₙ₊₁= plus their sum, with the correct amount of indent.

A`$ 

Since the program started with one line and appended n lines, it now has one line too many, so delete the last line.

\$\endgroup\$
1
\$\begingroup\$

Bash, 139 . . . 104 103 bytes

_()($[a=b=1];for n in `seq $1`;{ printf "%${s}s";echo -n $a+$b;$[c=a+b,s+=~${#a},a=b,b=c];echo "=$c";}) 

Try it online!

\$\endgroup\$
3
  • \$\begingroup\$ Is all that whitespace necessary? \$\endgroup\$ Commented Mar 5, 2022 at 5:14
  • \$\begingroup\$ @emanresuA not sure :) \$\endgroup\$ Commented Mar 5, 2022 at 5:14
  • \$\begingroup\$ Removed \$\endgroup\$ Commented Mar 5, 2022 at 5:17
1
\$\begingroup\$

Haskell, 89 bytes

l!s@[a,b,c]|[x,y,z]<-show<$>s=(l++x++'+':y++'=':z):(' '<$' ':x++l)![b,c,b+c] f=""![1,1,2] 

Try it online!

f is a stream of lines.
l!s formats current line and computes next triplet s and leading whitespace l

\$\endgroup\$
1
\$\begingroup\$

CJam, 49 47 45 bytes

liX:Y;{[ST*X`_,T)+:T;'+Y:K'=XY+:YN]oK:X;(_}g; 

Try it online!

\$\endgroup\$
1
\$\begingroup\$

C (gcc), 102 76 72 bytes

b;s;f(a){for(a=b=1;s=printf("%*d+%d",s,a,b);a=b-a)printf("=%d\n",b+=a);} 

Try it online!

Saved a whopping 26 bytes thanks to ceilingcat!!!
Saved 3 bytes thanks to m90!!!

Outputs forever!

\$\endgroup\$
2
  • \$\begingroup\$ A further improvement \$\endgroup\$ Commented Mar 6, 2022 at 12:43
  • \$\begingroup\$ @m90 Nice one - thanks! :D \$\endgroup\$ Commented Mar 6, 2022 at 17:07
1
\$\begingroup\$

Julia 1.0, 66 65 bytes

f(a=1,b=1,n=0)=print(" "^n,"$a+$b=$(a+b) ")f(b,a+b,n-~ndigits(a)) 

Try it online!

prints infinitely. To avoid Int64 overflow, replace a=1 with a=big(1) (+5 bytes)

\$\endgroup\$
0
\$\begingroup\$

Python 3, 146 141 bytes

print("1+1=2") a=[1,1,2] w=2 while 1:print(" "*w+str(a[1])+"+"+str(a[2])+"="+str(a[1]+a[2]));del a[0];w+=len(str(a[0]))+1;a.append(a[0]+a[1]) 

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Japt -mR, 23 22 bytes

Includes a trailing space on each line of output.

"+= "¬ËiMg°UÃvÈùT±XÊì 

Try it

"+= "¬ËiMg°UÃvÈùT±XÊì :Implicit map of each U in the range [0,input) "+= "¬ : Split "+= " to an array of characters Ë : Map i : Prepend °U : Prefix increment U Mg : Get the Uth Fibonacci number, 0-indexed à : End map v : Modify the first element È : By passing it through the following function as X ù : Left pad with spaces to length T± : Increment T (initially 0) by XÊ : Length of X à : End modification ¬ : Join :Implicit output joined with newlines 
\$\endgroup\$
0
\$\begingroup\$

Scala, 228 226 225 bytes

Saved 3 bytes thanks to the comment of @ceilingcat


Golfed version. Try it online!

object Main extends App{def f(n:Int)={def g(a:Int,b:Int,n:Int):List[(Int,Int,Int)]=n match{case 0=>Nil case _=>(a,b,a+b)::g(b,a+b,n-1)};g(1,1,n)};f(20).zipWithIndex.map{case((a,b,c),i)=>(" "*i)+s"$a+$b=$c"}.foreach(println)} 

Ungolfed version. Try it online!

object Main extends App { def formatList(list: List[(Int, Int, Int)]): List[String] = { list.zipWithIndex.map { case ((a, b, c), i) => (" " * (2 * i)) + s"$a + $b = $c" } } def fibonacciSeq(n: Int): List[(Int, Int, Int)] = { def fibHelper(a: Int, b: Int, n: Int): List[(Int, Int, Int)] = n match { case 0 => Nil case _ => (a, b, a + b) :: fibHelper(b, a + b, n - 1) } fibHelper(1, 1, n) } val formatted = formatList(fibonacciSeq(20)) formatted.foreach(println) } 
\$\endgroup\$
1
  • \$\begingroup\$ It looks like 20 is hardcoded into this; you must be able to take the value as input, or output infinitely. \$\endgroup\$ Commented Jul 1, 2023 at 8:33

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.