Imprimir una carta Fibonacci


28

Dado N (2 <= N ), imprima N líneas de la serie de letras de Fibonacci como esta (es decir, N = 5) Primero, comience con ay b:

a
b

Luego, agregue las dos líneas.

a
b
ab

Sigue agregando las dos últimas líneas.

a
b
ab
bab

Sigue adelante...

a
b
ab
bab
abbab

Y ya hemos terminado.

Recuerda, este es el , por lo que gana el código con la menor cantidad de bytes.



¿Puede ser una función que devuelve una lista de términos hasta N?
FlipTack el

¿Tenemos que imprimir el resultado o podemos devolver una lista de cadenas de una función?
nimi

Espera, ¿entonces no tiene que funcionar para n = 1?
Phoenix socrático el

Además, ¿podemos usar indexación basada en 0?
Phoenix socrático el

Respuestas:


10

Python 2, 41 bytes

Guardado 3 bytes gracias a @xnor

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

Prueba de ideona

Simplemente sigue la definición recursiva.


Esto es más corto que un programa: a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor

1
Es posible que desee especificar Python 2 :)
FlipTack

8

Haskell, 29 35 32 bytes

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

Recurrencia simple

Como referencia: la versión anterior (una adaptación de esta respuesta ) concatenaba las cadenas en el orden incorrecto, así que tuve que agregar una flip(...)que la hizo demasiado larga (35 bytes).

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

La salida es diferente del ejemplo (orden diferente en concatenación):["b","a","ab","aba","abaab"]
Angs

@ Angs: ¡Vaya, qué error! Fijo.
nimi

6

05AB1E , 12 11 bytes

¡Gracias a Emigna por guardar un byte!

'a='b¹GD=Š«

Utiliza la codificación CP-1252 . Pruébalo en línea!


1
̓podría ser lo Gmismo que no estás usando N:)
Emigna

@Emigna ¡Oh, sí, tienes razón! Gracias :)!
Adnan

5

Jalea , 11 10 bytes

”a”bṄ;¥@¡f

Pruébalo en línea!

Cómo funciona

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

Tenía la ”a”b;@Ṅparte hacia abajo, pero no podía entender a dónde ir desde allí ... ahora sé :-)
ETHproductions

5

Java 7, 69 bytes

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

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

}
}

Realmente necesitas formatear un poco más tu código no protegido en tus respuestas. Sin embargo, xD +1, e incluso funciona para cualquier otra cadena de inicio diferente a solo ay b. Sin embargo, no estoy seguro de si los parámetros "a"y "b"deben contarse para el recuento de bytes, ya que la pregunta establece específicamente que debe usar ay b. No es que Java gane alguna vez de todos modos. ;)
Kevin Cruijssen

@KevinCruijssen los parámetros de cadena son necesarios porque sus valores cambian cada vez que se invoca el método.

@Snowman, sé que son obligatorios. Solo digo que el recuento de bytes quizás debería ser de 75 bytes (+6 para "a"y "b") en lugar de 69 porque el desafío solicitó específicamente ay b, y el método de código cortado actualmente utiliza Una entrada variable. No estoy seguro de cuáles son las reglas con respecto a algo como esto, pero personalmente creo que debería contarse. De lo contrario, en algunos idiomas podría tener una función que ejecute una función de parámetro, y luego simplemente dar la función de desafío completa en el parámetro sin contar sus bytes. Suena como un tipo de regla de escapatoria estándar.
Kevin Cruijssen

1
Me encantan las respuestas de Java. Se destacan tan bien: 12 bytes aquí, 5 allí, 17 aquí ... 70 bytes allí ... espera, ¿qué? Oh, es Java otra vez ... +1
RudolfJelin

5

Emacs, 26 , 25 pulsaciones de teclas

Programa

#npara ser leído como clave con dígitos (s) n :

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

Explicación

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

Con n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

1
Estoy desgarrado Por un lado, siempre voté a editor-golf, pero por otro lado uso vim. Oh bueno, +1 de todos modos. :)
DJMcMayhem

@DrMcMoylex solo conviértalo a vim con Cu Mx convert-to-vim
YSC

5

JavaScript (ES6), 43 42 bytes

Guardado un byte gracias a @Arnauld

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

4

CJam, 19 17 bytes

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

explicación

"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

Por cierto, el número de cadenas está actualmente desactivado en uno; el último pdebería ser a ;. Puede deshacerse de las comillas alrededor de la salida si usa en nlugar de p. Finalmente, 'a'bguarda dos bytes "a""b".
Dennis

3

V , 18 bytes

ia
bkÀñyjGpgJkñdj

Pruébalo en línea!

O, la versión más legible:

ia
b<esc>kÀñyjGpgJkñdj

Explicación:

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

MATL , 14 bytes

97c98ci2-:"yyh

Pruébalo en línea!

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

3

Python 2, 55 bytes

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


2

Lote, 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%

Afortunadamente, las variables se expanden para cada línea antes de que las asignaciones surtan efecto, por lo que puedo establecer ambas ay busar sus valores anteriores sin necesidad de una temporal. Editar: Guardado 9 bytes gracias a @ nephi12.


Estaba a punto de hacer esto;) Por cierto, puede guardar 8 bytes eliminando la "salida / b" e iniciando su ciclo desde 2:for /l %%i in (2,1,%1) etc..
nephi12

Una más (la nueva línea) al poner los comandos establecidos en la misma línea @set a=a&set b=bcomo lo hizo con el último. aunque técnicamente todos podrían estar en la misma línea ... pero eso sería feo ... hmm ...
nephi12


2

Perl, 36 35 bytes

Incluye +3 para -n

Dar cuenta de 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 para la bandera -n

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

Ligera mejora sobre la solución existente de 49 bytes, pero desarrollada por separado. Los paréntesis parasay($a) son necesarios porque, de lo contrario, se interpreta $a,($a,$b)=($b,$a.$b)como el argumento de sayque genera más basura de la que necesitamos.

Perl, 42 bytes

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

Un enfoque separado de la solución anterior:

$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

Todavía no estoy convencido de que no pueda combinar la transliteración y el reemplazo en una sola operación más corta. Si encuentro uno, lo publicaré.



1

Perl, 48 bytes

Código de 47 bytes + 1 para -n .

Enfoque simple Intente usar un segmento de matriz originalmente, $a[@a]="@a[-2,-1]"pero eso requiere $"=""o similar :(. ¡Ahorre 1 byte gracias a @ Dada !

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

Uso

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

Puede guardar un byte usando en @;lugar de @apara que pueda omitir el punto y coma final (¿entiende a qué me refiero?). (Lo sé, un byte es bastante barato, pero no tenía una idea mejor ...)
Dada

@Dada Sí, lo intenté, pero no se compilará en mi máquina, así que pensé que tal vez hay algo extraño con la mía: 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.pero no pensé que sería justo agregar una respuesta si no pudiera ¡que funcione!
Dom Hastings

¿Seguro que esto no está relacionado con el en -pelugar de -nE? De todos modos, funciona en el mío, por lo que probablemente esté relacionado con su versión o sistema perl ... ¡Pero créanme, lo probé y funciona! ;)
Dada

@Dada también me pasa lo mismo -nE(¡no sé de dónde -pevino! Debe ser viernes ...) ¡Lo actualizaré cuando tenga un mes! ¡Gracias por compartir!
Dom Hastings

1

SOML , 8 bytes (no competitivos)

 a b.{;t⁴+

explicación:

 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 razón por la que esto no compite es porque este lenguaje todavía está en desarrollo y agregué un par de nuevas funciones mientras escribía esto.

Además, 1er post en PPCG!


1
Bienvenido a PPCG! Gran primer post!
Oliver Ni

1

05AB1E, 15 bytes

'a'bVUFX,XYUYJV

1

C , 156 bytes (sin sangría)

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

Dos buffers (u & v) almacenan las dos últimas líneas. La línea más nueva (seguida con dos punteros: inicio = c, final = d) se agrega a la más antigua (inicio = a, final = b). Intercambiar (a, b) y (c, d) y bucle. Preste atención al tamaño del búfer antes de solicitar demasiadas líneas. No tan corto (como se esperaba de un lenguaje de bajo nivel), pero fue divertido de codificar.


Usted codificó el 5pero debe ser entrada del usuario
Karl Napf

Hmm ... No veo la "entrada del usuario" como un requisito en el rompecabezas ... Siguiendo la misma ruta que Perl, Python, C ++, ... respuestas, reemplace "int main ()" con "void f (int norte)".
Phil

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

Bueno, la entrada del usuario fue una mala elección en términos de palabras. Quise decir más como dinámico Ny no fijo. O el usuario puede ser alguien que use su función / programa.
Karl Napf el

He corregido un error estúpido sobre no copiar el terminador nul. También he puesto la función en un estado más legible (los liners son divertidos, pero no prácticos). Para probar esta función, use esto: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil

1

PHP, 63 62 bytes

Versión recursiva:

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

espacios en blanco innecesarios despuésreturn
Tito

0

Pyth , 17 bytes

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

Un programa que toma la entrada de un número entero e imprime el resultado.

Pruébalo en línea!

Cómo funciona

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.

⎕IOdebe ser 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~#&

Define una función que gtoma la entrada numérica única; devuelve una lista de cadenas. Implementación recursiva directa, utilizando el operador de unión de cadenas<> .

Mathematica, 56 bytes

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

Función sin nombre, mismo formato de entrada / salida que el anterior. Esta solución utiliza una forma alternativa de generar las cadenas: cada cadena de la lista es el resultado de reemplazar simultáneamente, en la cadena anterior, todas las apariciones de "a" con "b" y todas las apariciones de "b" con "ab".



0

PHP, 53 bytes

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

guardar un byte usando comillas dobles y colocando $bla cadena.
Tito

0

C ++ 11, 89 98 bytes

+7 bytes para todas las líneas, no solo la última. +2 bytes más por Nser el número de líneas impresas, no algunas cosas basadas en 0.

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

Uso:

f(5)

0

Ruby (1.9+) 46 bytes

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.