Imprimer une lettre Fibonacci

28

Étant donné N (2 <= N ), imprimez N lignes de la série des lettres Fibonacci comme ceci (c.-à-d. N = 5) Commencez par aet b:

a
b

Ensuite, ajoutez les deux lignes.

a
b
ab

Continuez à ajouter les deux dernières lignes.

a
b
ab
bab

Continue...

a
b
ab
bab
abbab

Et nous avons terminé.

Rappelez-vous, c'est le , donc le code avec le moins d'octets gagne.

Oliver Ni
la source
4
Connexes
AdmBorkBork
Peut-il s'agir d'une fonction qui renvoie une liste de termes jusqu'à N?
FlipTack
Doit-on imprimer le résultat ou peut-on renvoyer une liste de chaînes d'une fonction?
nimi
Attendez, donc ça ne doit pas fonctionner pour n = 1?
Socratic Phoenix
Peut-on également utiliser une indexation basée sur 0?
Socratic Phoenix

Réponses:

10

Python 2, 41 octets

Enregistré 3 octets grâce à @xnor

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

Test sur Ideone

Suit simplement la définition récursive.

ETHproductions
la source
Ceci est plus court comme un programme: a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor
1
Pourrait vouloir spécifier python 2 :)
FlipTack
8

Haskell, 29 35 32 octets

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

Récursivité simple.

Pour référence: l'ancienne version (une adaptation de cette réponse ), concaténait les chaînes dans le mauvais ordre, j'ai donc dû en ajouter une flip(...)qui la rendait trop longue (35 octets).

f="a":scanl(flip(++))"b"f
(`take`f)
nimi
la source
La sortie est différente de l'exemple (ordre différent dans la concaténation):["b","a","ab","aba","abaab"]
Angs
@Angs: Oups quelle erreur! Fixé.
nimi
6

05AB1E , 12 11 octets

Merci à Emigna d' avoir sauvé un octet!

'a='b¹GD=Š«

Utilise l' encodage CP-1252 . Essayez-le en ligne!

Adnan
la source
1
̓pourrait tout aussi bien être Gque vous n'utilisez pas N:)
Emigna
@Emigna Oh ouais, tu as raison! Merci :)!
Adnan
5

Gelée , 11 10 octets

”a”bṄ;¥@¡f

Essayez-le en ligne!

Comment ça marche

”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
la source
J'ai eu la ”a”b;@Ṅpartie vers le bas, mais je ne savais pas où aller à partir de là ... maintenant je sais :-)
ETHproductions
5

Java 7, 69 octets

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

non golfé

 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
la source
Vous avez vraiment besoin de formater un peu plus votre code non golfé dans vos réponses .. xD +1 cependant, et cela fonctionne même pour toute autre chaîne de départ différente de juste aet b. Je ne sais pas si les paramètres "a"et "b"doivent être pris en compte dans le nombre d'octets, car la question indique spécifiquement qu'il doit utiliser aet b. Pas que Java gagnera de toute façon. ;)
Kevin Cruijssen
@KevinCruijssen les paramètres de chaîne sont obligatoires car leurs valeurs changent chaque fois que la méthode est invoquée.
@Snowman Je sais qu'ils sont requis. Je dis simplement que le nombre d'octets devrait peut-être être de 75 octets (+6 pour "a"et "b") au lieu de 69 car le défi a spécifiquement demandé pour aet b, et la méthode coupée de code / utilise actuellement une entrée variable. Je ne sais pas quelles sont les règles concernant quelque chose comme ça, mais je pense personnellement que cela devrait être compté. Sinon, vous pourriez dans certaines langues avoir une fonction qui exécute une fonction de paramètre, puis donner simplement la fonction de défi entière dans le paramètre sans compter ses octets. Cela ressemble à une règle de type échappatoire standard.
Kevin Cruijssen
1
J'adore les réponses Java. Ils se démarquent tellement bien - 12 octets ici, 5 là, 17 ici ... 70 octets là ... attendez quoi? Oh, c'est encore Java ... +1
RudolfJelin
5

Emacs, 26 , 25 touches

Programme

#nà lire comme clé avec chiffre (s) n :

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

Explication

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

Avec n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab
YSC
la source
1
Je suis déchiré. D'une part, je vote toujours en faveur de editor-golf, mais d'autre part j'utilise vim. Eh bien, +1 de toute façon. :)
DJMcMayhem
@DrMcMoylex vient de le convertir en vim avec Cu Mx convert-to-vim
YSC
5

JavaScript (ES6), 43 42 octets

Un octet enregistré grâce à @Arnauld

f=(n,a="a",b="b")=>n&&f(n-!alert(a),b,a+b)
ETHproductions
la source
4

CJam, 19 17 octets

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

explication

"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
la source
Soit dit en passant, le nombre de chaînes est actuellement désactivé par un; le dernier pdevrait être a ;. Vous pouvez vous débarrasser des guillemets autour de la sortie si vous utilisez nau lieu de p. Enfin, 'a'benregistre deux octets de plus "a""b".
Dennis
3

V , 18 octets

ia
bkÀñyjGpgJkñdj

Essayez-le en ligne!

Ou, la version la plus lisible:

ia
b<esc>kÀñyjGpgJkñdj

Explication:

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
DJMcMayhem
la source
3

MATL , 14 octets

97c98ci2-:"yyh

Essayez-le en ligne!

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
la source
3

Python 2, 55 octets

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

Rétine , 33 octets

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

Essayez-le en ligne!

10 (!) Octets enregistrés grâce à @ MartinEnder !

Explication

Convertit l'entrée en unaire, soustrait 2et ajoute le aet le b, puis remplace récursivement les 1s restants par la concaténation des deux chaînes précédentes.

Dom Hastings
la source
Enregistré quelques octets en évitant les captures inutiles: retina.tryitonline.net/…
Martin Ender
@MartinEnder Nice! Je n'ai pas vraiment vu le pouvoir de $%` ! et cette autre capture était juste une mauvaise planification ... Incroyable, merci!
Dom Hastings
2

Lot, 102 93 octets

@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%

Heureusement, les variables sont développées pour chaque ligne avant que les affectations ne prennent effet, donc je peux définir les deux aet butiliser leurs anciennes valeurs sans avoir besoin d'un temporaire. Edit: 9 octets enregistrés grâce à @ nephi12.

Neil
la source
J'étais sur le point de le faire;) Au fait, vous pouvez économiser 8 octets en supprimant le "exit / b" et en démarrant votre boucle à partir de 2:for /l %%i in (2,1,%1) etc..
nephi12
Un de plus (la nouvelle ligne) en plaçant les commandes set sur la même ligne @set a=a&set b=bque vous l'avez fait avec la dernière. bien que techniquement, ils pourraient tous être sur la même ligne ... mais ce serait moche ... hmm ...
néphi12
2

Stack my Golf, 63 octets

Obtenez ma langue ici: https://github.com/cheertarts/Stack-My-Golf .

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

Il y a probablement un chemin plus court mais c'est le plus évident.

Quincy B
la source
2

Perl, 36 35 octets

Comprend +3 pour -n

Comptez sur STDIN

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

fibo.pl

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

Perl, 45 +1 = 46 octets

+1 octet pour l'indicateur -n

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

Légère amélioration par rapport à la solution existante de 49 octets, mais développée séparément. Les parenthèses poursay($a) sont nécessaires car sinon, il interprète $a,($a,$b)=($b,$a.$b)comme l'argument desay qui génère plus d'ordure que nécessaire.

Perl, 42 octets

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

Une approche distincte de la solution ci-dessus:

$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

Je ne suis pas encore convaincu que je ne peux pas combiner la translittération et le remplacement en une seule opération plus courte. Si j'en trouve un, je le posterai.

Gabriel Benamy
la source
1

Swift 3, 76 octets

func f(_ n:Int,_ x:String="a",_ y:String="b"){if n>1{print(x);f(n-1,y,x+y)}}
Alexander - Rétablir Monica
la source
1

Perl, 48 octets

Code de 47 octets + 1 pour -n .

Une approche simple. Essayez d'utiliser une tranche de tableau à l'origine $a[@a]="@a[-2,-1]"mais cela nécessite $"=""ou similaire :(. Économisez 1 octet grâce à @ 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
la source
Vous pouvez enregistrer un octet en utilisant @;au lieu de @aafin que vous puissiez omettre le point-virgule final (voyez ce que je veux dire?). (Je sais, un octet est assez bon marché mais je n'ai pas eu de meilleure idée ..)
Dada
@Dada Ouais, j'ai essayé, mais ça ne compile pas sur ma machine, alors j'ai pensé qu'il y avait peut-être quelque chose d'étrange avec le mien: 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.mais je ne pensais pas qu'il serait juste d'ajouter une réponse si je ne pouvais pas faites-le fonctionner!
Dom Hastings
Bien sûr, ce n'est pas lié à la -peplace de -nE? Quoi qu'il en soit, cela fonctionne sur le mien, donc c'est probablement lié à votre version ou système Perl ... Mais croyez-moi, je l'ai testé et ça marche! ;)
Dada
@Dada, j'obtiens la même chose -nEaussi (je ne sais pas d'où -pevient! Doit être vendredi ...) Je mettrai à jour cela quand j'aurai un mois! Merci d'avoir partagé!
Dom Hastings
1

SOML , 8 octets (non concurrent)

 a b.{;t⁴+

explication:

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

La raison pour laquelle il n'y a pas de concurrence est que ce langage est toujours en développement et j'ai ajouté quelques nouvelles fonctions lors de l'écriture.

Aussi, 1er post sur PPCG!

dzaima
la source
1
Bienvenue chez PPCG! Excellent premier post!
Oliver Ni
1

05AB1E, 15 octets

'a'bVUFX,XYUYJV

la source
1

C , 156 octets (sans retrait)

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

Deux tampons (u & v) stockent les deux dernières lignes. La ligne la plus récente (suivie avec deux pointeurs: début = c, fin = d) est ajoutée à la plus ancienne (début = a, fin = b). Permutez (a, b) et (c, d) et bouclez. Faites attention à la taille du tampon avant de demander trop de lignes. Pas si court (comme prévu pour un langage de bas niveau), mais c'était amusant à coder.

Phil
la source
Vous avez codé en dur le 5mais il devrait être saisi par l'utilisateur
Karl Napf
Hmm ... Je ne vois pas "l'entrée utilisateur" comme une exigence dans le puzzle ... En suivant le même chemin que Perl, Python, C ++, ... répond, remplacez "int main ()" par "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
Eh bien, la saisie des utilisateurs était un mauvais choix en termes de mots. Je voulais dire plutôt dynamique Net non fixe. Ou l'utilisateur peut être quelqu'un qui utilise votre fonction / programme.
Karl Napf
J'ai corrigé une erreur stupide de ne pas copier le terminateur nul. J'ai également mis la fonction dans un état plus lisible (un liners est drôle, mais pas pratique). Pour tester réellement cette fonction, utilisez ceci: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil
1

PHP, 63 62 octets

Version récursive:

function f($n,$a=a,$b=b){return$n--?"$a
".f($n,$b,$a.$b):'';}
Crypto
la source
espaces blancs inutiles aprèsreturn
Titus
0

Pyth , 17 octets

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

Un programme qui prend l'entrée d'un entier et imprime le résultat.

Essayez-le en ligne!

Comment ça marche

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
la source
0

APL, 30 octets.

⎕IOdoit être 1.

{⎕←⍵}¨{⍵∊⍳2:⍵⌷'ab'⋄∊∇¨⍵-⌽⍳2}¨⍳
Zacharý
la source
0

Mathematica, 49 octets

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

Définit une fonction gprenant la seule entrée numérique; renvoie une liste de chaînes. Implémentation récursive simple à l'aide de l'opérateur de jonction de chaînes<> .

Mathematica, 56 octets

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

Fonction sans nom, même format d'entrée / sortie que ci-dessus. Cette solution utilise une autre manière de générer les chaînes: chaque chaîne de la liste est le résultat du remplacement simultané, dans la chaîne précédente, de toutes les occurrences de "a" par "b" et de toutes les occurrences de "b" par "ab".

Greg Martin
la source
0

Groovy, 79 octets

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

PHP, 53 octets

for($a=b,$b=a;$argv[1]--;$a=($_=$b).$b=$a)echo$b.'
';
chocochaos
la source
save one byte by using double quotes and putting $b in the string.
Titus
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
la source
0

Ruby (1.9+) 46 bytes

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