Drucken Sie einen Brief Fibonacci


28

Mit N (2 <= N ) drucken Sie N Zeilen der Buchstaben-Fibonacci-Reihe wie folgt (dh N = 5). Beginnen Sie zuerst mit aund b:

a
b

Fügen Sie als Nächstes die beiden Zeilen hinzu.

a
b
ab

Fügen Sie die letzten beiden Zeilen hinzu.

a
b
ab
bab

Mach weiter...

a
b
ab
bab
abbab

Und wir sind fertig.

Denken Sie daran, das ist , also gewinnt der Code mit den wenigsten Bytes.



Kann es eine Funktion sein, die eine Liste von Begriffen bis N zurückgibt?
FlipTack

Müssen wir das Ergebnis drucken oder können wir eine Liste von Zeichenfolgen aus einer Funktion zurückgeben?
Nimi

Warten Sie, damit es nicht für n = 1 funktionieren muss?
Socratic Phoenix

Können wir auch 0-basierte Indizierung verwenden?
Socratic Phoenix

Antworten:


10

Python 2, 41 Bytes

3 Bytes dank @xnor gespart

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

Test auf Ideone

Folgt einfach der rekursiven Definition.


Dies ist kürzer als Programm: a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor

1
Möglicherweise möchten Sie Python 2 angeben :)
FlipTack

8

Haskell, 29 35 32 Bytes

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

Einfache Rekursion.

Als Referenz: Die alte Version (eine Anpassung dieser Antwort ) verkettete die Zeichenfolgen in der falschen Reihenfolge, so dass ich eine hinzufügen musste, flip(...)die es zu lang machte (35 Bytes).

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

Die Ausgabe unterscheidet sich vom Beispiel (unterschiedliche Reihenfolge in der Verkettung):["b","a","ab","aba","abaab"]
Angs

@Angs: Ups, was für ein Fehler! Fest.
Nimi

6

05AB1E , 12 11 Bytes

Danke an Emigna für das Speichern eines Bytes!

'a='b¹GD=Š«

Verwendet die CP-1252- Codierung. Probieren Sie es online!


1
̓könnte genauso gut sein Gwie du nicht verwendest N:)
Emigna

@Emigna Oh ja, du hast recht! Vielen Dank :)!
Adnan

5

Jelly , 11 bis 10 Bytes

”a”bṄ;¥@¡f

Probieren Sie es online!

Wie es funktioniert

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

Ich hatte den ”a”b;@ṄTeil unten, aber ich konnte nicht herausfinden, wohin ich von dort gehen soll ... jetzt weiß ich :-)
ETHproductions

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

}
}

Sie müssen Ihren ungolfed Code in Ihren Antworten wirklich ein bisschen mehr formatieren. XD +1, und es funktioniert sogar für alle anderen Startzeichenfolgen als nur aund b. Ich bin nicht sicher, ob die "a"und "b"-Parameter für die Byteanzahl gezählt werden sollen, da in der Frage ausdrücklich angegeben ist, dass aund verwendet werden sollen b. Nicht, dass Java jemals gewinnen würde. ;)
Kevin Cruijssen

@KevinCruijssen Die Zeichenfolgenparameter sind erforderlich, da sich ihre Werte bei jedem Aufruf der Methode ändern.

@Snowman Ich weiß, dass sie erforderlich sind. Ich sage nur, dass die Byteanzahl vielleicht 75 Bytes (+6 für "a"und "b") anstelle von 69 sein sollte, weil die Herausforderung speziell nach aund gefragt bhat und die Code-Snipped / -Methode derzeit verwendet eine variable Eingabe. Ich bin nicht sicher, welche Regeln diesbezüglich gelten, aber ich persönlich bin der Meinung, dass dies gezählt werden sollte. Andernfalls könnten Sie in einigen Sprachen eine Funktion haben, die eine Parameterfunktion ausführt, und dann einfach die gesamte Challenge-Funktion im Parameter angeben, ohne dessen Bytes zu zählen. Klingt nach einer Regel mit Standardlücken.
Kevin Cruijssen

1
Ich liebe Java-Antworten. Sie stechen so gut heraus - 12 Bytes hier, 5 dort, 17 hier ... 70 Bytes dort ... Moment, was? Oh, es ist wieder Java ... +1
RudolfJelin

5

Emacs, 26 , 25-ish Tastenanschläge

Programm

#nLesen als Schlüssel mit Ziffer (n) werden n :

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

Erläuterung

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

Mit n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

1
Ich bin zerrissen. Einerseits stimme ich immer für Editor-Golf, andererseits benutze ich vim. Na ja, sowieso +1. :)
DJMcMayhem

@ DrMcMoylex konvertieren Sie es einfach zu VIM mit Cu Mx konvertieren-zu-VIM
YSC

5

JavaScript (ES6), 43 42 Bytes

Ein Byte dank @Arnauld gespeichert

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

4

CJam, 19 17 Bytes

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

Erläuterung

"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

Übrigens ist die Anzahl der Zeichenfolgen derzeit um eins verringert. das letzte psollte a sein ;. Sie können die Anführungszeichen um die Ausgabe loswerden, wenn Sie nanstelle von verwenden p. Schließlich 'a'bspeichert zwei Bytes über "a""b".
Dennis

3

V , 18 Bytes

ia
bkÀñyjGpgJkñdj

Probieren Sie es online!

Oder die besser lesbare Version:

ia
b<esc>kÀñyjGpgJkñdj

Erläuterung:

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


3

Python 2, 55 Bytes

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

3

Retina , 33 Bytes

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

Probieren Sie es online!

10 (!) Bytes gespart dank @ MartinEnder !

Erläuterung

Konvertiert die Eingabe in unär, subtrahiert 2und addiert das aund und bersetzt dann rekursiv das verbleibende 1s durch die Verkettung der beiden vorherigen Zeichenfolgen.


Ein paar Bytes gespart, indem unnötige Captures vermieden wurden: retina.tryitonline.net/…
Martin Ender

@ MartinEnder Schön! Ich habe die Kraft von nicht ganz gesehen $%` ! und diese andere Gefangennahme war nur schlechte Planung ... Erstaunlich, danke!
Dom Hastings

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%

Zum Glück Variablen werden für jede Zeile erweitert , bevor Zuweisungen wirksam, so dass ich beide setzen können aund bmit ihren alten Werten , ohne dass eine temporäre. Bearbeiten: 9 Bytes dank @ nephi12 gespeichert.


Ich wollte das machen;) Übrigens, Sie können 8 Bytes sparen, indem Sie "exit / b" entfernen und Ihre Schleife von 2:for /l %%i in (2,1,%1) etc..
nephi12

Noch eine (die neue Zeile), indem Sie die set-Befehle in dieselbe Zeile setzen, @set a=a&set b=bwie Sie es mit der letzten getan haben. obwohl technisch könnten sie alle auf der gleichen Linie sein ... aber das wäre hässlich ... hmm ...
nephi12


2

Perl, 36-35 Bytes

Beinhaltet +3 für -n

Rechnen Sie mit STDIN

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

fibo.pl

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

2

Perl, 45 +1 = 46 Bytes

+1 Byte für -n Flag

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

Leichte Verbesserung gegenüber der bestehenden 49-Byte-Lösung, wurde jedoch separat entwickelt. Die Klammern für say($a)sind notwendig, da sie andernfalls $a,($a,$b)=($b,$a.$b)als Argument interpretiert werden, das saymehr Junk ausgibt, als wir benötigen.

Perl, 42 Bytes

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

Ein separater Ansatz von der obigen Lösung:

$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

Ich bin noch nicht davon überzeugt, dass ich Transliteration und Ersetzung nicht in einer einzigen, kürzeren Operation kombinieren kann. Wenn ich einen finde, werde ich ihn posten.



1

Perl, 48 Bytes

47 Byte Code + 1 für -n .

Einfacher Ansatz. Versuchen Sie ursprünglich $a[@a]="@a[-2,-1]", ein Array-Slice zu verwenden, aber das erfordert $"=""oder ähnliches :(. 1 Byte sparen dank @ Dada !

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

Verwendung

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

Sie können ein Byte speichern, indem Sie @;stattdessen @adas letzte Semikolon weglassen (sehen Sie, was ich meine?). (Ich weiß, ein Byte ist ziemlich billig, aber ich hatte keine bessere Idee ..)
Dada

@Dada Ja, das habe ich versucht, aber es lässt sich nicht auf meinem Computer kompilieren, also dachte ich, bei mir ist vielleicht etwas Merkwürdiges los: 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.Aber ich hätte nicht gedacht, dass es fair wäre, eine Antwort hinzuzufügen, wenn ich es nicht könnte Bring es zum Laufen!
Dom Hastings

Sicher, das hat nichts mit dem zu -petun -nE? Wie auch immer, es funktioniert auf meinem, also hängt es wahrscheinlich mit Ihrer Perl-Version oder Ihrem Perl-System zusammen ... Aber glauben Sie mir, ich habe es getestet und es funktioniert! ;)
Dada

@Dada Ich bekomme das selbe auch mit -nE(weiß nicht woher -pe! Muss Freitag sein ...) Ich aktualisiere das, wenn ich ein Mo bekomme! Danke für das Teilen!
Dom Hastings

1

SOML , 8 Bytes (nicht konkurrierend)

 a b.{;t⁴+

Erläuterung:

 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"]

Der Grund, warum dies nicht konkurriert, ist, dass sich diese Sprache noch in der Entwicklung befindet und ich beim Schreiben ein paar neue Funktionen hinzugefügt habe.

Auch 1. Post auf PPCG!


1
Willkommen bei PPCG! Toller erster Beitrag!
Oliver Ni

1

05AB1E, 15 Bytes

'a'bVUFX,XYUYJV

1

C , 156 Bytes (ohne Einzug)

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

Zwei Puffer (u & v) speichern die letzten beiden Zeilen. Die neueste Zeile (mit zwei Zeigern verfolgt: Start = c, Ende = d) wird an die älteste angefügt (Start = a, Ende = b). Vertausche (a, b) und (c, d) und schleife. Achten Sie auf die Puffergröße, bevor Sie zu viele Zeilen anfordern. Nicht so kurz (wie von einer einfachen Sprache erwartet), aber es hat Spaß gemacht, zu programmieren.


Sie haben das hardcodiert, 5aber es sollte eine Benutzereingabe sein
Karl Napf

Hmm ... Ich sehe "Benutzereingaben" nicht als Anforderung im Puzzle ... Folgen Sie dem gleichen Pfad wie Perl, Python, C ++, ... und ersetzen Sie "int main ()" durch "void f (int n) ".
Phil

Given N (2 <= N), print N lines of the letter Fibonacci series like this (i.e. N = 5)
Karl Napf

Nun, Benutzereingaben waren eine schlechte Wortwahl. Ich meinte eher dynamisch Nund nicht fixiert. Oder der Benutzer ist jemand, der Ihre Funktion / Ihr Programm verwendet.
Karl Napf

Ich habe einen dummen Fehler behoben, der darin bestand, den Nullterminator nicht zu kopieren. Ich habe die Funktion auch in einen besser lesbaren Zustand versetzt (Einzeiler sind lustig, aber nicht praktisch). Verwenden Sie Folgendes, um diese Funktion tatsächlich zu testen: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil

1

PHP, 63 62 Bytes

Rekursive Version:

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

unnötiges Leerzeichen danachreturn
Titus

0

Pyth , 17 Bytes

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

Ein Programm, das die Eingabe einer Ganzzahl akzeptiert und das Ergebnis ausgibt.

Probieren Sie es online!

Wie es funktioniert

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


0

APL, 30 Bytes.

⎕IOmuss sein 1.

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

0

Mathematica, 49 Bytes

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

Definiert eine Funktion, gdie die einzelne numerische Eingabe übernimmt. gibt eine Liste von Zeichenketten zurück. Einfache rekursive Implementierung mit dem Operator zum Verbinden von Zeichenfolgen<> .

Mathematica, 56 Bytes

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

Unbenannte Funktion, gleiches Eingabe- / Ausgabeformat wie oben. Diese Lösung verwendet eine alternative Methode zum Generieren der Zeichenfolgen: Jede Zeichenfolge in der Liste ist das Ergebnis des gleichzeitigen Ersetzens aller Vorkommen von "a" durch "b" und aller Vorkommen von "b" durch "ab" in der vorherigen Zeichenfolge.



0

PHP, 53 Bytes

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

Speichern Sie ein Byte, indem Sie doppelte Anführungszeichen verwenden und $bdie Zeichenfolge eingeben.
Titus

0

C ++ 11, 89 98 Bytes

+7 Bytes für alle Zeilen, nicht nur die letzte. +2 Bytes mehr für Ndie Anzahl der gedruckten Zeilen, keine 0-basierten Sachen.

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

Verwendung:

f(5)

0

Ruby (1.9+) 46 Bytes

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.