Print a letter Fibonacci

28

2

Given N (2 <= N), print N lines of the letter Fibonacci series like this (i.e. N = 5) First, start with a and b:

a
b

Next, add the two lines.

a
b
ab

Keep adding the last two lines.

a
b
ab
bab

Keep going...

a
b
ab
bab
abbab

And we're done.

Remmeber, this is , so the code with the fewest bytes wins.

Oliver Ni

Posted 2016-11-03T20:52:41.003

Reputation: 9 650

4Related – AdmBorkBork – 2016-11-03T21:01:29.307

Can it be a function which returns a list of terms up to N? – FlipTack – 2016-11-03T21:21:29.583

Do we have to print the result or can we return a list of strings from a function? – nimi – 2016-11-03T21:21:41.253

Wait, so it doesn't have to work for n=1? – Socratic Phoenix – 2016-11-03T22:39:01.703

Also, can we use 0-based indexing? – Socratic Phoenix – 2016-11-03T22:45:36.607

@SocraticPhoenix The input isn't really an index, but the number of strings we should print. – Dennis – 2016-11-04T01:00:35.247

@Dennis ahh... I misunderstood, there goes my solution :( – Socratic Phoenix – 2016-11-04T01:34:10.777

printing the entire sequence seems like a trivial addition to the challenge that doesn't add any substance to the questions. print element(n) would be much more desirable IMO – downrep_nation – 2016-11-05T16:32:25.990

Answers

10

Python 2, 41 bytes

Saved 3 bytes thanks to @xnor

a,b="ab";exec"print a;a,b=b,a+b;"*input()

Test on Ideone

Simply follows the recursive definition.

ETHproductions

Posted 2016-11-03T20:52:41.003

Reputation: 47 880

This is shorter as a program: a,b="ab";exec"print a;a,b=b,a+b;"*input(). – xnor – 2016-11-03T23:56:42.273

1Might want to specify python 2 :) – FlipTack – 2016-11-04T07:47:34.653

8

Haskell, 29 35 32 bytes

a%b=a:b%(a++b)
(`take`("a"%"b"))

Simple recursion.

For reference: the old version (an adaption of this answer), concatenated the strings in the wrong order, so I had to add a flip(...) which made it too long (35 bytes).

f="a":scanl(flip(++))"b"f
(`take`f)

nimi

Posted 2016-11-03T20:52:41.003

Reputation: 34 639

The output is different from the example (different order in concatenation): ["b","a","ab","aba","abaab"] – Angs – 2016-11-04T05:57:33.077

@Angs: Oops what a mistake! Fixed. – nimi – 2016-11-04T06:18:43.407

6

05AB1E, 12 11 bytes

Thanks to Emigna for saving a byte!

'a='b¹GD=Š«

Uses the CP-1252 encoding. Try it online!

Adnan

Posted 2016-11-03T20:52:41.003

Reputation: 41 965

1̓ could just as well be G as you're not using N :) – Emigna – 2016-11-04T07:18:38.177

@Emigna Oh yeah, you're right! Thanks :)! – Adnan – 2016-11-04T13:08:37.633

5

JavaScript (ES6), 43 42 bytes

Saved a byte thanks to @Arnauld

f=(n,a="a",b="b")=>n&&f(n-!alert(a),b,a+b)

ETHproductions

Posted 2016-11-03T20:52:41.003

Reputation: 47 880

5

Jelly, 11 10 bytes

”a”bṄ;¥@¡f

Try it online!

How it works

”a”bṄ;¥@¡f  Main link. Argument: n

”a          Set the return value to 'a'.
  ”b    ¡   Call the link to the left n times, with left argument 'b' and right
            argument 'a'. After each call, the right argument is replaced with the
            left one, and the left argument with the return value. The final
            return value is yielded by the quicklink.
      ¥       Combine the two atoms to the left into a dyadic chain.
    Ṅ           Print the left argument of the chain, followed by a linefeed.
     ;          Concatenate the left and right argument of the chain.
       @      Call the chain with reversed argument order.
         f  Filter the result by presence in n. This yields an empty string
            and thus suppresses the implicit output.

Dennis

Posted 2016-11-03T20:52:41.003

Reputation: 196 637

I had the ”a”b;@Ṅ part down, but I couldn't figure out where to go from there... now I know :-) – ETHproductions – 2016-11-04T01:25:30.127

5

Java 7, 69 bytes

String c(int n,String a,String b){return n--<1?"":a+"\n"+c(n,b,a+b);}

ungolfed

 class fibb {


public static void main(String[] args) {
    System.out.println( c( 7, "a" , "b" ) );

}
static String c(int n,String a,String b) {

    return n-- < 1  ? "" : a + "\n" + c(n,b,a + b);

}
}

Numberknot

Posted 2016-11-03T20:52:41.003

Reputation: 885

You really need to format your ungolfed code a bit more in your answers.. xD +1 though, and it even works for any other starting strings different than just a and b. I'm not sure if the "a" and "b" parameters should be counted towards the byte-count though, since the question specifically states it should use a and b. Not that Java will ever win anyway. ;) – Kevin Cruijssen – 2016-11-04T07:55:44.123

@KevinCruijssen the string parameters are required because their values change each time the method is invoked. – None – 2016-11-04T13:59:52.447

@Snowman I know they are required.. I'm just saying that the byte-count should maybe be 75 bytes (+6 for "a" and "b") instead of 69 because the challenge specifically asked for a and b, and the code-snipped/method currently uses a variable input. Not sure what the rules are regarding something like this, but I personally think it should be counted. Otherwise you could in some languages have a function that executes a parameter function, and then simply give the entire challenge-function in the parameter without counting its bytes. Sounds like a standard-loophole type of rule. – Kevin Cruijssen – 2016-11-04T14:24:42.910

1I love Java answers. They stand out so nice - 12 bytes here, 5 there, 17 here... 70 bytes there... wait, what? Oh, it's Java again... +1 – RudolfJelin – 2016-11-04T21:36:16.300

5

Emacs, 26, 25-ish keystrokes

Program

#n to be read as key with digit(s) n:

ARETBRETF3UPUPC-SPACEC-EM-WDOWNDOWNC-Y UPC-AC-SPACEC-EM-WDOWNC-EC-YRETF4C-#(n-2)F4

Explanation

command(s)               explanation                      buffer reads (| = cursor aka point)
-----------------------------------------------------------------------------------------------
A<RET> B<RET>            input starting points            "a\nb\n|"
<F3>                     start new macro                  "a\nb\n|"
<UP><UP>                 move point two lines up          "|a\nb\n"
C-<SPACE> C-E M-W        copy line at point               "a|\nb\n"
<DOWN><DOWN>             move point two lines down        "a\nb\n|"
C-Y                      yank (paste)                     "a\nb\na|"
<UP>                     move point one line up           "a\nb|\na"
C-A C-<SPACE> C-E M-W    copy line at point               "a\nb|\na"
<DOWN>                   move point one line down         "a\nb|\na|"
C-E C-Y <RET>            yank (paste) and add new line    "a\nb|\nab\n|"
<F4>                     stop macro recording             "a\nb|\nab\n|"
C-#(n-3) <F4>            apply macro n-3 times            "a\nb|\nab\nbab\nabbab\n|"

With n=10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

YSC

Posted 2016-11-03T20:52:41.003

Reputation: 732

1I'm torn. On one hand, I always upvote editor-golf, but on the other hand I use vim. Oh well, +1 anyway. :) – James – 2016-11-04T16:19:16.997

@DrMcMoylex just convert it to vim with C-u M-x convert-to-vim – YSC – 2016-11-04T17:12:20.207

4

CJam, 19 17 bytes

'a'b{_@_n\+}ri*;;

explanation

"a": Push character literal "a" onto the stack.
"b": Push character literal "b" onto the stack.
{_@_p\+}
    {: Block begin.
    _: duplicate top element on the stack
    @: rotate top 3 elements on the stack
    _: duplicate top element on the stack
    n: print string representation
    \: swap top 2 elements on the stack
    +: add, concat
    }: Block end.
r: read token (whitespace-separated)
i: convert to integer
*: multiply, join, repeat, fold (reduce)
;: pop and discard
;: pop and discard

Setop

Posted 2016-11-03T20:52:41.003

Reputation: 188

By the way, the number of strings is currently off by one; the last p should be a ;. You can get rid of the quotes around the output if you use n instead of p. Finally, 'a'b saves two bytes over "a""b". – Dennis – 2016-11-04T02:56:04.060

3

V, 18 bytes

ia
bkÀñyjGpgJkñdj

Try it online!

Or, the more readable version:

ia
b<esc>kÀñyjGpgJkñdj

Explanation:

ia
b<esc>          " Insert the starting text and escape back to normal mode
k               " Move up a line
 Àñ       ñ     " Arg1 times:
   yj           "   Yank the current line and the line below
     G          "   Move to the end of the buffer
      p         "   Paste what we just yanked
       gJ       "   Join these two lines
         k      "   Move up one line
           dj   " Delete the last two lines

James

Posted 2016-11-03T20:52:41.003

Reputation: 54 537

3

Python 2, 55 bytes

def f(n):m='a','b';exec'print m[-2];m+=m[-2]+m[-1],;'*n

miles

Posted 2016-11-03T20:52:41.003

Reputation: 15 654

3

MATL, 14 bytes

97c98ci2-:"yyh

Try it online!

97c     % Push 'a'
98c     % Push 'b'
i2-     % Input number. Subtract 2
:"      % Repeat that many times
  yy    %   Duplicate the top two elements
  h     %   Concatenate them

Luis Mendo

Posted 2016-11-03T20:52:41.003

Reputation: 87 464

3

Retina, 33 bytes

.+
$*
^11
a¶b
+`¶(.+?)1
¶$1¶$%`$1

Try it online!

Saved 10 (!) bytes thanks to @MartinEnder!

Explanation

Converts the input to unary, subtracts 2 and adds the a and the b, then recursively replaces the remaining 1s with the concatenation of the two previous strings.

Dom Hastings

Posted 2016-11-03T20:52:41.003

Reputation: 16 415

Saved a few bytes by avoiding unnecessary captures: http://retina.tryitonline.net/#code=LisKJCoKXjExCmHCtmIKK2DCtiguKz8pMQrCtiQxwrYkJWAkMQ&input=NQ

– Martin Ender – 2016-11-05T00:15:39.917

@MartinEnder Nice! Didn't quite see the power of $%`! and that other capture was just bad planning... Amazing, thank you! – Dom Hastings – 2016-11-05T10:12:39.020

2

Batch, 102 93 bytes

@set a=a
@set b=b
@for /l %%i in (2,1,%1)do @call:l
:l
@echo %a%
@set a=%b%&set b=%a%%b%

Fortunately variables are expanded for every line before assignments take effect, so I can set both a and b using their old values without needing a temporary. Edit: Saved 9 bytes thanks to @nephi12.

Neil

Posted 2016-11-03T20:52:41.003

Reputation: 95 035

I was about to do this ;) By the way, you can save 8 bytes by removing the "exit/b" and starting your loop from 2: for /l %%i in (2,1,%1) etc.. – nephi12 – 2016-11-04T00:41:52.907

One more (the newline) by putting the set commands on the same line @set a=a&set b=b like you did with the last one. though techncally they could all be on the same line... but that would be ugly... hmm... – nephi12 – 2016-11-04T00:48:05.627

2

Perl, 45 +1 = 46 bytes

+1 byte for -n flag

$a=a,$b=b;say($a),($a,$b)=($b,$a.$b)for 1..$_

Slight improvement over the existing 49-byte solution, but developed separately. The parentheses for say($a) are necessary because otherwise, it interprets $a,($a,$b)=($b,$a.$b) as the argument of say which outputs more junk than we need.

Perl, 42 bytes

$b=<>;$_=a;say,y/ab/bc/,s/c/ab/g while$b--

A separate approach from the above solution:

$b=<>;                                       #Read the input into $b
      $_=a;                                  #Create the initial string 'a' stored in $_
           say                               #Print $_ on a new line
               y/ab/bc/                      #Perform a transliteration on $_ as follows:
                                   #Replace 'a' with 'b' and 'b' with 'c' everywhere in $_
                        s/c/ab/g             #Perform a replacement on $_ as follows:
                                   #Replace 'c' with 'ab' everywhere in $_
              ,        ,         while$b--   #Perform the operations separated by commas
                                   #iteratively as long as $b-- remains truthy

I'm not yet convinced I can't combine the transliteration and replacement into a single, shorter operation. If I find one, I'll post it.

Gabriel Benamy

Posted 2016-11-03T20:52:41.003

Reputation: 2 827

2

Stack my Golf, 63 bytes

Get my language here: https://github.com/cheertarts/Stack-My-Golf.

($1=(_(a))($2=(_(b))($2-f:1-f,)?)?)f\($1=(f)($1-p(\n),:f,)?)p\p

There is probably a shorter way but this is the most obvious.

Quincy B

Posted 2016-11-03T20:52:41.003

Reputation: 21

2

Perl, 36 35 bytes

Includes +3 for -n

Give count on STDIN

perl -M5.010 fibo.pl <<< 5

fibo.pl

#!/usr/bin/perl -n
$_=$'.s/1//.$_,say$`for(a1.b)x$_

Ton Hospel

Posted 2016-11-03T20:52:41.003

Reputation: 14 114

1

Swift 3, 76 Bytes

func f(_ n:Int,_ x:String="a",_ y:String="b"){if n>1{print(x);f(n-1,y,x+y)}}

Alexander - Reinstate Monica

Posted 2016-11-03T20:52:41.003

Reputation: 481

1

Perl, 48 bytes

47 bytes code + 1 for -n.

Simple approach. Try using an array slice originally $a[@a]="@a[-2,-1]" but that necessitates $"="" or similar :(. Save 1 byte thanks to @Dada!

@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@

Usage

perl -nE '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5
a
b
ab
bab
abbab

Dom Hastings

Posted 2016-11-03T20:52:41.003

Reputation: 16 415

You can save one byte by using @; instead of @a so you can omit the final semicolon (see what I mean?). (I know, one byte is pretty cheap but I didn't have any better idea..) – Dada – 2016-11-04T13:46:13.710

@Dada Yeah, I tried that, but it wound't compile on my machine, so I thought perhaps there's something odd going on with mine: perl -pe '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5 syntax error at -e line 1, at EOF Execution of -e aborted due to compilation errors. but didn't think it'd be fair to add as an answer if I couldn't get it working! – Dom Hastings – 2016-11-04T13:50:17.183

Sure this isn't related to the -pe instead of -nE ? Any way, it works on mine, so it's probably related to your perl version or system... But trust me, I tested it and it works! ;) – Dada – 2016-11-04T13:53:09.027

@Dada I get the same with -nE as well (don't know where -pe came from! Must be Friday...) I'll update that when I get a mo! Thanks for sharing! – Dom Hastings – 2016-11-04T13:57:50.777

1

PHP, 63 62 bytes

Recursive version:

function f($n,$a=a,$b=b){return$n--?"$a
".f($n,$b,$a.$b):'';}

Crypto

Posted 2016-11-03T20:52:41.003

Reputation: 862

unnecessary whitespace after return – Titus – 2016-11-11T15:49:47.300

1

C, 156 bytes (without indent)

void f(int n)
{
    char u[999]="a",v[999]="b",*a=u,*b=a+1,*c=v,*d=c+1,*e,i;
    for(i=0;i<n;++i)
    {
        printf("%s\n",a);
        for(e=c;*b++=*e++;);
        e=a;a=c;c=e;e=b+1;b=d;d=e;
    }
}

Two buffers (u & v) store the last two lines. The newest line (tracked with two pointers: start=c, end=d) is appended to the oldest one (start=a, end=b). Swap (a,b) and (c,d), and loop. Pay attention to buffer size before requesting too much lines. Not so short (as expected of a low-level language), but was fun to code.

Phil

Posted 2016-11-03T20:52:41.003

Reputation: 11

You hardcoded the 5 but it should be user input – Karl Napf – 2016-11-04T16:10:22.147

Hmm... I do not see "user input" as a requirement in the puzzle... Following the same path as Perl, Python, C++, ... answers, replace "int main()" with "void f(int n)". – Phil – 2016-11-04T16:56:30.587

Given N (2 <= N), print N lines of the letter Fibonacci series like this (i.e. N = 5) – Karl Napf – 2016-11-04T19:02:12.980

Well, user input was a bad choice in term of words. I meant more like dynamic N and not fixed. Or the user might be somebody who uses your function/program. – Karl Napf – 2016-11-04T19:03:17.603

I've corrected a stupid mistake about not copying the nul terminator. I've also put the function in a more readable state (one liners are funny, but not handy). To actually test this function, use this : int main(int n, char**p){f(n<2?5:atoi(p[1]));return 0;} – Phil – 2016-11-07T12:43:52.380

1

SOML, 8 bytes (non-competing)

 a b.{;t⁴+

explanation:

 a b.{;t⁴+                                        stack on 1st cycle
 a              push "a"                               ["a"]
   b            push "b"                               ["a","b"]
    .{          repeat input times                     ["a","b"]
      ;         swap the two top things on the stack   ["b","a"]
       t        output the top thing on the stack      ["b","a"]
        ⁴       copy the 2nd from top thing from stack ["b","a","b"]
         +      join them together                     ["b","ab"]

The reason this is non-competing is because this language is still in development and I did add a couple new functions while writing this.

Also, 1st post on PPCG!

dzaima

Posted 2016-11-03T20:52:41.003

Reputation: 19 048

1Welcome to PPCG! Great first post! – Oliver Ni – 2016-11-06T15:21:18.383

1

05AB1E, 15 bytes

'a'bVUFX,XYUYJV

user60288

Posted 2016-11-03T20:52:41.003

Reputation:

0

Pyth, 17 bytes

J,\a\bjP.U=+Js>2J

A program that takes input of an integer and prints the result.

Try it online!

How it works

J,\a\bjP.U=+Js>2J  Program. Input: Q
 ,\a\b             Yield the two element list ['a', 'b']
J                  Assign to J
        .U         Reduce over [0, 1, 2, 3, ..., Q] (implicit input):
          =J+        J = J +
              >2J     the last two elements of J
             s        concatenated
       P           All of that except the last element
      j            Join on newlines
                   Implicitly print

TheBikingViking

Posted 2016-11-03T20:52:41.003

Reputation: 3 674

0

Pyth - 16 15 bytes

A"ab" m=H+
~GHH

Try it online here.

Maltysen

Posted 2016-11-03T20:52:41.003

Reputation: 25 023

0

APL, 30 bytes.

⎕IO must be 1.

{⎕←⍵}¨{⍵∊⍳2:⍵⌷'ab'⋄∊∇¨⍵-⌽⍳2}¨⍳

Zacharý

Posted 2016-11-03T20:52:41.003

Reputation: 5 710

0

Mathematica, 49 bytes

f@1="a";f@2="b";f@n_:=f[n-2]<>f[n-1];g=f~Array~#&

Defines a function g taking the single numerical input; returns a list of strings. Straightforward recursive implementation, using the string-joining operator <>.

Mathematica, 56 bytes

NestList[#~StringReplace~{"a"->"b","b"->"ab"}&,"a",#-1]&

Unnamed function, same input/output format as above. This solution uses an alternate way to generate the strings: each string in the list is the result of simultaneously replacing, in the previous string, all occurrences of "a" with "b" and all occurrences of "b" with "ab".

Greg Martin

Posted 2016-11-03T20:52:41.003

Reputation: 13 940

0

PHP, 61 57 bytes

<?=$c=a;for($b=b;--$argv[1];$b=$c.$b,$c=$a)echo"
",$a=$b;

come php 7.1 you can save 3 bytes by changing to: an "old" version that I wish was short:

<?=$a=a;for($b=b;--$argv[1];[$a,$b]=[$b,$a.$b])echo"
$b";

If a trailing new line is acceptable then:

for($b=b;$argv[1]--;$a=$b,$b=$c.$b)echo$c=$a?:a,"
";

is only 52 bytes.

edit: 4 bytes saved (on both usable versions) thanks to Titus.

user59178

Posted 2016-11-03T20:52:41.003

Reputation: 1 007

You do not have to use open tags unless there's a full program requirement :) – chocochaos – 2016-11-04T15:45:30.630

@chocochaos I know, but i'm using it to print the first a and <?= is shorter than echo. I can do better if a trailing new line is fine and will edit the answer to that effect. – user59178 – 2016-11-04T17:20:30.073

save 4 bytes on your 1st version <?=$c=a;for($b=b;--$argv[1];$b=$c.$b,$c=$a)echo"\n",$a=$b; and 4 bytes on your 3rd version for($b=b;$argv[1]--;$a=$b,$b=$c.$b)echo$c=$a?:a,"\n"; – Titus – 2016-11-11T15:32:00.740

@Titus thanks, that's really clever, I'll pay attention to that in the future! – user59178 – 2016-11-11T17:50:04.230

0

Groovy, 79 Bytes

{println("a\nb");x=['a','b'];(it-2).times{println(y=x.sum());x[0]=x[1];x[1]=y}}

Magic Octopus Urn

Posted 2016-11-03T20:52:41.003

Reputation: 19 422

0

C++11, 89 98 bytes

+7 bytes for all lines, not only the last one. +2 bytes more for N being the number of lines printed, not some 0-based stuff.

#include<string>
using S=std::string;S f(int n,S a="a",S b="b"){return n-1?a+"\n"+f(n-1,b,a+b):a;}

Usage:

f(5)

Karl Napf

Posted 2016-11-03T20:52:41.003

Reputation: 4 131

0

PHP, 53 bytes

for($a=b,$b=a;$argv[1]--;$a=($_=$b).$b=$a)echo$b.'
';

chocochaos

Posted 2016-11-03T20:52:41.003

Reputation: 547

save one byte by using double quotes and putting $b in the string. – Titus – 2016-11-11T15:48:21.097

0

Ruby (1.9+) 46 bytes

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}

shabunc

Posted 2016-11-03T20:52:41.003

Reputation: 169

0

Pyth - 14 bytes

(yeah, another pyth answer)

A<G2VQG=H+~GHH

Try it online

Explanation

A<G2              - take "ab" from the var G, dump "a" into G and "b" into H.
    VQ            - for N in range(Q)
      G           - print G
          ~GH     - like =GH but returns the previous G
         +   H    - concatenate the old G with the current H
       =H         - put that value back into H

Yotam Salmon

Posted 2016-11-03T20:52:41.003

Reputation: 201

0

Actually, 16 bytes

There might be a shorter way to duplicate the top two elements of the stack in Actually, but I'm not sure what that way is. Golfing suggestions welcome. Try it online!

'a'b,¬`2╟2αio`na

Ungolfing

'a'b     Push "a" then "b" to the stack.
,        Explicitly take input n.
¬        Push n-2.
`...`n   Run the following function n-2 times.
  2╟2α     Push a list that repeats the top two elements of the stack twice.
  i        Flatten that list to the stack. Stack: b, a, b, a, prev_iterations
  o        Append b to the end of a. Stack: ab, b, a, prev_iterations
a        Reverse the stack so that the strings will print in the correct order.
         Implicit print all of the elements in the stack.

A different approach

This is also 16 bytes. Try it online!

'a'b,¬`│ok╔Ri`na

Ungolfing

The main difference is the function in the middle, so I'll only ungolf that here.

`...`n   Run the following function n-2 times.
  │        Duplicate the stack.
  o        Append the last item to the end of the second-to-last item.
  k╔       Uniquify the stack by wrapping the stack in a list and then calling uniquify().
  Ri       Reverse that list before returning everything to the stack
            so that the last items are at TOS again.

Sherlock9

Posted 2016-11-03T20:52:41.003

Reputation: 11 664

0

Java 8 40 bytes

Same answer as @Numberknot only written as a lambda in Java 8 which makes it smaller.

c=(n,a,b)->n--<1?"":a+"\n"+c.f(n,b,a+b);

Ungolfed version:

interface Function
{
    String f(int n, String a, String b);
}

public class Main
{
    static Function c; //c needs to be a member or static variable in order
                       //to reference it recursively inside the lambda

    public static void main(String[] args)
    {
        c=(n,a,b)->n--<1?"":a+"\n"+c.f(n,b,a+b);
    }
}

BananyaDev

Posted 2016-11-03T20:52:41.003

Reputation: 41

0

R, 82 bytes

This can surely be golfed.

x=c("b","a");for(i in 2:scan()-2)x=c(paste0(x[2],x[1]),x);cat(rev(x[-1]),sep="\n")

Billywob

Posted 2016-11-03T20:52:41.003

Reputation: 3 363

0

C#, 142 Bytes

Edit: only had it printing the last line out... V2:

Golfed:

string L(int n){var r=new List<string>(){"a","b"};int i=3;while(i<=n){r.Add(string.Concat(r[i-3],r[i-2]));i++;}return string.Join("\r\n", r);}

Ungolfed:

public string L(int n)
{
  var r = new List<string>() { "a", "b" };

  int i = 3;

  while (i <= n)
  {
    r.Add(string.Concat(r[i-3], r[i-2]));
    i++;
  }

  return string.Join("\r\n", r);
}

Test:

var printALetterFibonacci = new PrintALetterFibonacci();
Console.WriteLine(printALetterFibonacci.L(5));

a
b
ab
bab
abbab

var printALetterFibonacci = new PrintALetterFibonacci();
Console.WriteLine(printALetterFibonacci.L(7));

a
b
ab
bab
abbab
bababbab
abbabbababbab

Pete Arden

Posted 2016-11-03T20:52:41.003

Reputation: 1 151

1This just returns the final line, you should print/output the (N-1) lines leading up to it as well. – Harald Korneliussen – 2016-11-07T13:45:07.183

@HaraldKorneliussen I missed that in the post, corrected now, thanks :) – Pete Arden – 2016-11-07T18:35:36.050

0

GNU sed, 43 Bytes

Includes +2 for -rn.

s/1/a\nb\n/
:
P
s/(.*)\n(.*\n)./\2\1\2/
t

Takes input in unary (see this consensus).

Try it Online!

Explanation:

s/1/a\nb\n/              # prepend an 'a' and a 'b' on their own lines and remove a '1'
:                        # nameless label
P                        # print everything before the first newline
s/(.*)\n(.*\n)./\2\1\2/  # replace the first two lines and the next character 
                         # (one of the '1's) with the second line then the first line 
                         # concatenated with the second
                         # E.g.
                         #     a           b
                         #     b      ->   ab
                         #     11111       1111
t                        # loop to the label if there was a '1' left (i.e. there was
                         # a substitution)

Riley

Posted 2016-11-03T20:52:41.003

Reputation: 11 345

0

Powershell 1.0+, 41 51 :( Bytes

$x,$y='a','b';0..(read-host)|%{$x;$x,$y=$y,($x+$y)}

4 *nix goto https://github.com/PowerShell/PowerShell

Corrected for user input :)

Cellcore

Posted 2016-11-03T20:52:41.003

Reputation: 1

Welcome to PPCG! This answer doesn't look like it takes input -- instead it just always prints out the first 10 results. – AdmBorkBork – 2016-11-11T13:49:39.717

Hi TimmyD, thats right, but you can alter the amount of lines here :) 0..N – Cellcore – 2016-11-11T16:12:15.263

I did not really figure out if it is needed to ask the user for Input in the question, but I can extend it for user Input ;) – Cellcore – 2016-11-11T16:13:36.673

Yes, you'll need to take input via a standard input method. For this, something like 0..$args[0] and having the input be a command-line parameter would probably be shortest.

– AdmBorkBork – 2016-11-11T16:17:21.987

Unfortunately i found only (read-host) then it would be like: – Cellcore – 2016-11-11T16:50:21.713

that 1..(read-host) which is too long. except giving alias before is alowed ;) – Cellcore – 2016-11-11T16:51:32.927

-1

Javascript (ES6), 35 bytes

f=v=>v&&v-1?f(v-2)+f(v-1):v?'b':'a'

Marcus Dirr

Posted 2016-11-03T20:52:41.003

Reputation: 11

Can you make use of 'ab'[v]? – Neil – 2016-11-04T15:58:56.293