Imprimir uma carta Fibonacci


28

Dado N (2 <= N ), imprima N linhas da letra Fibonacci série como esta (ie N = 5) Primeiro, comece com ae b:

a
b

Em seguida, adicione as duas linhas.

a
b
ab

Continue adicionando as duas últimas linhas.

a
b
ab
bab

Continue...

a
b
ab
bab
abbab

E nós terminamos.

Lembre-se, isso é , então o código com o menor número de bytes vence.



Pode ser uma função que retorna uma lista de termos até N?
FlipTack

Temos que imprimir o resultado ou podemos retornar uma lista de strings de uma função?
N

Espere, para que ele não precise trabalhar para n = 1?
Socratic Phoenix

Além disso, podemos usar a indexação baseada em 0?
Socratic Phoenix

Respostas:


10

Python 2, 41 bytes

Guardado 3 bytes graças a @xnor

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

Teste em Ideona

Simplesmente segue a definição recursiva.


Esta é mais curto como um programa: a,b="ab";exec"print a;a,b=b,a+b;"*input().
Xnor

1
Pode querer especificar python 2 :)
FlipTack

8

Haskell, 29 35 32 bytes

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

Recursão simples.

Para referência: a versão antiga (uma adaptação desta resposta ) concatenou as seqüências na ordem errada, então tive que adicionar uma flip(...)que a tornava muito longa (35 bytes).

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

A saída é diferente do exemplo (ordem diferente na concatenação):["b","a","ab","aba","abaab"]
Angs 4/11/16

@ Angs: Opa que erro! Fixo.
N

6

05AB1E , 12 11 bytes

Agradecemos a Emigna por salvar um byte!

'a='b¹GD=Š«

Usa a codificação CP-1252 . Experimente online!


1
̓poderia muito bem ser Gque você não está usando N:)
Emigna

@Emigna Oh sim, você está certo! Obrigado :)!
Adnan

5

Geléia , 11 10 bytes

”a”bṄ;¥@¡f

Experimente online!

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

Eu tive a ”a”b;@Ṅbaixo parte, mas eu não conseguia descobrir onde ir de lá ... agora eu sei :-)
ETHproductions

5

Java 7, 69 bytes

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

destroçado

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

}
}

Você realmente precisa formatar o seu código ungolfed um pouco mais em suas respostas .. xD +1 embora, e ele funciona até mesmo para quaisquer outras cordas de partida diferentes do que apenas ae b. Não tenho certeza se os parâmetros "a"e "b"devem ser contados na contagem de bytes, pois a pergunta especifica especificamente que ele deve usar ae b. Não que o Java vença de qualquer maneira. ;)
Kevin Cruijssen 4/11

@KevinCruijssen os parâmetros da string são necessários porque seus valores mudam cada vez que o método é chamado.

@ Boneco de neve, eu sei que eles são obrigatórios .. Só estou dizendo que a contagem de bytes talvez deva ter 75 bytes (+6 para "a"e "b") em vez de 69 porque o desafio especificamente solicitado ae b, e o método snipado por código atualmente usa uma entrada variável. Não sei ao certo quais são as regras em relação a algo assim, mas pessoalmente acho que deve ser contado. Caso contrário, em alguns idiomas, você poderia ter uma função que executa uma função de parâmetro e, em seguida, simplesmente fornecer toda a função de desafio no parâmetro sem contar seus bytes. Parece um tipo de regra de brecha padrão.
Kevin Cruijssen

1
Eu amo respostas Java. Eles se destacam tão bem - 12 bytes aqui, 5 ali, 17 aqui ... 70 bytes ali ... espera, o que? Ah, é Java novamente ... +1
RudolfJelin 4/16

5

Pressionamentos de teclas Emacs, 26 , 25-ish

Programa

#npara ser lido como chave com dígito (s) n :

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

Explicação

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

Com n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

1
Estou dividido. Por um lado, sempre voto positivo em editor-golf, mas por outro lado uso o vim. Oh bem, +1 de qualquer maneira. :)
DJMcMayhem

@DrMcMoylex apenas convertê-lo para vim com Cu Mx converter-to-vim
YSC

5

JavaScript (ES6), 43 42 bytes

Guardou um byte graças 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*;;

explicação

"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

A propósito, o número de strings está atualmente desativado em um; o último pdeve ser a ;. Você pode se livrar das aspas ao redor da saída se usar em nvez de p. Por fim, 'a'bsalva dois bytes acima "a""b".
Dennis

3

V , 18 bytes

ia
bkÀñyjGpgJkñdj

Experimente online!

Ou, a versão mais legível:

ia
b<esc>kÀñyjGpgJkñdj

Explicação:

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

Experimente 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

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

Experimente online!

Economizou 10 (!) Bytes graças a @ MartinEnder !

Explicação

Converte a entrada para unários, subtrai 2e adiciona o ae b, em seguida, de forma recursiva substitui os restantes 1s com a concatenação das duas cordas anteriores.


Economizou alguns bytes evitando capturas desnecessárias: retina.tryitonline.net/…
Martin Ender

@MartinEnder Nice! Não via completamente o poder de $%` ! e essa outra captura foi apenas um mau planejamento ... Incrível, obrigado!
Dom Hastings

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%

Felizmente, as variáveis ​​são expandidas para cada linha antes que as atribuições entrem em vigor, para que eu possa definir os dois ae busar seus valores antigos sem precisar de um temporário. Editar: salvou 9 bytes graças a @ nephi12.


Eu estava prestes a fazer isso;) A propósito, você pode salvar 8 bytes removendo o "exit / b" e iniciando o loop de 2:for /l %%i in (2,1,%1) etc..
nephi12 4/16/16

Mais um (a nova linha), colocando os comandos set na mesma linha, @set a=a&set b=bcomo você fez com o último. embora techncally eles poderiam estar todos na mesma linha ... mas isso seria feio ... hmm ...
nephi12


2

Perl, 36 35 bytes

Inclui +3 para -n

Contar com 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 o sinalizador -n

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

Ligeira melhoria em relação à solução de 49 bytes existente, mas desenvolvida separadamente. Os parênteses para say($a)são necessários porque, caso contrário, ele interpreta $a,($a,$b)=($b,$a.$b)como o argumento sayque gera mais lixo do que o necessário.

Perl, 42 bytes

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

Uma abordagem separada da solução acima:

$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

Ainda não estou convencido de que não posso combinar a transliteração e a substituição em uma única operação mais curta. Se eu encontrar um, eu o publicarei.



1

Perl, 48 bytes

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

Abordagem simples. Tente usar uma fatia de matriz originalmente, $a[@a]="@a[-2,-1]"mas que exija $"=""ou similar :(. Salve 1 byte graças 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

Você pode salvar um byte usando em @;vez de @apara omitir o ponto e vírgula final (entende o que eu quero dizer?). (Eu sei, um byte é muito barato, mas eu não tinha nenhuma idéia melhor ..)
Dada

@ Dadá Sim, eu tentei isso, mas não foi compilado na minha máquina, então pensei que talvez houvesse algo estranho acontecendo com o meu: 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.mas não achei que seria justo adicionar uma resposta se não pudesse fazê-lo funcionar!
Dom Hastings

Claro que isso não está relacionado ao -peinvés de -nE? De qualquer forma, ele funciona no meu, então provavelmente está relacionado à sua versão ou sistema perl ... Mas confie em mim, eu testei e funciona! ;)
Dada

@ Dadá fico com o mesmo -nEtambém (não sei de onde -peveio! Deve ser sexta-feira ...) Vou atualizar isso quando chegar um mês! Obrigado por compartilhar!
Dom Hastings

1

SOML , 8 bytes (não concorrente)

 a b.{;t⁴+

explicação:

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

A razão pela qual isso não é competitivo é porque essa linguagem ainda está em desenvolvimento e eu adicionei algumas novas funções ao escrever isso.

Além disso, 1º post no PPCG!


1
Bem-vindo ao PPCG! Ótimo primeiro post!
Oliver Ni

1

05AB1E, 15 bytes

'a'bVUFX,XYUYJV

1

C , 156 bytes (sem recuo)

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

Dois buffers (u & v) armazenam as duas últimas linhas. A linha mais recente (rastreada com dois ponteiros: start = c, end = d) é anexada à mais antiga (start = a, end = b). Troque (a, b) e (c, d) e faça um loop. Preste atenção ao tamanho do buffer antes de solicitar muitas linhas. Não é tão curto (como esperado de um idioma de baixo nível), mas foi divertido de codificar.



Hmm ... não vejo "entrada do usuário" como um requisito no quebra-cabeça ... Seguindo o mesmo caminho das respostas Perl, Python, C ++, ..., substitua "int main ()" por "void f (int n) "
Phil

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

Bem, a entrada do usuário foi uma má escolha em termos de palavras. Eu quis dizer mais como dinâmico Ne não fixo. Ou o usuário pode ser alguém que usa sua função / programa.
Karl Napf 4/11

Corrigi um erro estúpido por não copiar o terminador nul. Também coloquei a função em um estado mais legível (os liners são engraçados, mas não são úteis). Para realmente testar esta função, use o seguinte: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil

1

PHP, 63 62 bytes

Versão recursiva:

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

espaço em branco desnecessário apósreturn
Titus

0

Pitão , 17 bytes

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

Um programa que recebe a entrada de um número inteiro e imprime o resultado.

Experimente online!

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

⎕IOdeve 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 uma função g que recebe a entrada numérica única; retorna uma lista de cadeias. Implementação recursiva direta, usando o operador de junção de string<> .

Mathematica, 56 bytes

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

Função sem nome, mesmo formato de entrada / saída como acima. Essa solução usa uma maneira alternativa de gerar as strings: cada string da lista é o resultado da substituição simultânea, na string anterior, de todas as ocorrências de "a" por "b" e todas as ocorrências de "b" por "ab".



0

PHP, 53 bytes

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

salve um byte usando aspas duplas e inserindo $ba string.
Titus

0

C ++ 11, 89 98 bytes

+7 bytes para todas as linhas, não apenas a última. +2 bytes a mais por Nser o número de linhas impressas, não algumas coisas baseadas em 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}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.