Stampa una lettera Fibonacci


28

Dato N (2 <= N ), stampa N righe della lettera serie Fibonacci in questo modo (cioè N = 5) Innanzitutto, inizia con ae b:

a
b

Quindi, aggiungi le due righe.

a
b
ab

Continua ad aggiungere le ultime due righe.

a
b
ab
bab

Continua così...

a
b
ab
bab
abbab

E abbiamo finito.

Ricorda, questo è , quindi vince il codice con il minor numero di byte.



Può essere una funzione che restituisce un elenco di termini fino a N?
FlipTack,

Dobbiamo stampare il risultato o possiamo restituire un elenco di stringhe da una funzione?
nimi,

Aspetta, quindi non deve funzionare per n = 1?
Socratic Phoenix,

Inoltre, possiamo usare l'indicizzazione basata su 0?
Socratic Phoenix,

Risposte:


10

Python 2, 41 byte

Salvato 3 byte grazie a @xnor

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

Test su Ideone

Segue semplicemente la definizione ricorsiva.


Questo è più breve come un programma: a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor

1
Potrebbe voler specificare Python 2 :)
FlipTack

8

Haskell, 29 35 32 byte

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

Ricorsione semplice.

Per riferimento: la vecchia versione (un adattamento di questa risposta ), concatenava le stringhe nell'ordine sbagliato, quindi ho dovuto aggiungere una flip(...)che la rendeva troppo lunga (35 byte).

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

L'output è diverso dall'esempio (ordine diverso in concatenazione):["b","a","ab","aba","abaab"]
Angs

@Angs: Oops che errore! Fisso.
nimi,

6

05AB1E , 12 11 byte

Grazie a Emigna per aver salvato un byte!

'a='b¹GD=Š«

Utilizza la codifica CP-1252 . Provalo online!


1
̓potrebbe anche essere Gche non stai usando N:)
Emigna,

@Emigna Oh sì, hai ragione! Grazie :)!
Adnan,

5

Gelatina , 11 10 byte

”a”bṄ;¥@¡f

Provalo online!

Come funziona

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

Avevo la ”a”b;@Ṅparte in basso, ma non riuscivo a capire dove andare da lì ... ora lo so :-)
ETHproductions

5

Java 7, 69 byte

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

}
}

Devi davvero formattare un po 'di più il tuo codice non golfato nelle tue risposte .. xD +1, e funziona anche con qualsiasi altra stringa iniziale diversa da ae e b. Non sono sicuro se i parametri "a"e "b"debbano essere conteggiati per il conteggio dei byte, poiché la domanda afferma specificamente che dovrebbe usare ae b. Non che Java vincerà mai comunque. ;)
Kevin Cruijssen il

@KevinCruijssen sono richiesti i parametri della stringa perché i loro valori cambiano ogni volta che viene invocato il metodo.

@Snowman So che sono richiesti .. Sto solo dicendo che il conteggio dei byte dovrebbe forse essere 75 byte (+6 per "a"e "b") invece di 69 perché la sfida ha richiesto specificamente ae b, e il metodo frammentato / attualmente utilizza un input variabile. Non sono sicuro di quali siano le regole riguardo a qualcosa del genere, ma personalmente penso che debba essere contato. Altrimenti in alcune lingue potresti avere una funzione che esegue una funzione di parametro, e quindi semplicemente dare l'intera funzione di sfida nel parametro senza contare i suoi byte. Sembra un tipo di regola standard di scappatoia.
Kevin Cruijssen,

1
Adoro le risposte Java. Si distinguono così bene - 12 byte qui, 5 lì, 17 qui ... 70 byte lì ... aspetta, cosa? Oh, è di nuovo Java ... +1
RudolfJelin

5

Tasti Emacs, 26 , 25 ish

Programma

#nda leggere come chiave con le cifre n :

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

Spiegazione

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
Sono a pezzi. Da un lato, scrivo sempre l'editor-golf, ma dall'altro uso vim. Vabbè, +1 comunque. :)
DJMcMayhem

@DrMcMoylex basta convertirlo in vim con Cu Mx convert-in-vim
YSC

5

JavaScript (ES6), 43 42 byte

Salvataggio di un byte grazie a @Arnauld

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

4

CJam, 19 17 byte

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

spiegazione

"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 proposito, il numero di stringhe è attualmente spento da uno; l'ultimo pdovrebbe essere a ;. È possibile eliminare le virgolette intorno all'output se si utilizza ninvece di p. Infine, 'a'bsalva due byte sopra "a""b".
Dennis,

3

V , 18 byte

ia
bkÀñyjGpgJkñdj

Provalo online!

Oppure, la versione più leggibile:

ia
b<esc>kÀñyjGpgJkñdj

Spiegazione:

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 byte

97c98ci2-:"yyh

Provalo 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 byte

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

3

Retina , 33 byte

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

Provalo online!

Salvato 10 (!) Byte grazie a @ MartinEnder !

Spiegazione

Converte l'input in unario, sottrae 2e aggiunge e ae bquindi sostituisce ricorsivamente le rimanenti 1s con la concatenazione delle due stringhe precedenti.



@MartinEnder Nice! Non ho visto il potere di $%` ! e quell'altra cattura era solo una cattiva pianificazione ... Incredibile, grazie!
Dom Hastings,

2

Lotto, 102 93 byte

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

Fortunatamente le variabili vengono espanse per ogni riga prima che le assegnazioni abbiano effetto, quindi posso impostare entrambe ae busare i loro vecchi valori senza bisogno di un temporaneo. Modifica: salvato 9 byte grazie a @ nephi12.


Stavo per fare questo;) A proposito, puoi salvare 8 byte rimuovendo "exit / b" e avviando il tuo ciclo da 2:for /l %%i in (2,1,%1) etc..
nephi12

Ancora uno (la nuova riga) mettendo i comandi set sulla stessa riga @set a=a&set b=bcome hai fatto con l'ultimo. anche se tecnicamente potrebbero essere tutti sulla stessa linea ... ma sarebbe brutto ... hmm ...
nephi12


2

Perl, 36 35 byte

Include +3 per -n

Dai il conto su 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 byte

+1 byte per -n flag

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

Leggero miglioramento rispetto alla soluzione a 49 byte esistente, ma sviluppato separatamente. Le parentesi say($a)sono necessarie perché altrimenti interpretano $a,($a,$b)=($b,$a.$b)come l'argomento di saycui genera più spazzatura del necessario.

Perl, 42 byte

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

Un approccio separato dalla soluzione sopra:

$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

Non sono ancora convinto di non poter combinare la traslitterazione e la sostituzione in un'unica operazione più breve. Se ne trovo uno, lo posterò.



1

Perl, 48 byte

47 byte codice + 1 per -n.

Approccio semplice Prova a utilizzare una porzione di array originariamente $a[@a]="@a[-2,-1]"ma ciò è necessario $"=""o simile :(. Risparmia 1 byte grazie 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

Puoi salvare un byte usando @;invece di @acosì puoi omettere il punto e virgola finale (vedi cosa intendo?). (Lo so, un byte è piuttosto economico ma non avevo idea migliore ..)
Dada,

@Dada Sì, l'ho provato, ma non si compila sulla mia macchina, quindi ho pensato che forse ci fosse qualcosa di strano nel mio: 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.ma non pensavo che sarebbe stato giusto aggiungere come risposta se non ci fossi riuscito farlo funzionare!
Dom Hastings,

Sicuro questo non è correlato al -peinvece di -nE? Ad ogni modo, funziona sul mio, quindi probabilmente è correlato alla tua versione o sistema perl ... Ma fidati, l'ho provato e funziona! ;)
Dada,

@Dada ottengo lo stesso anche con -nE(non so da dove -pevenga! Deve essere venerdì ...) Lo aggiornerò quando avrò un mese! Grazie per la condivisione!
Dom Hastings,

1

SOML , 8 byte (non concorrenti)

 a b.{;t⁴+

spiegazione:

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

Il motivo per cui questo non è in competizione è perché questo linguaggio è ancora in fase di sviluppo e ho aggiunto un paio di nuove funzioni mentre scrivevo questo.

Inoltre, 1 ° post su PPCG!


1
Benvenuti in PPCG! Ottimo primo post!
Oliver Ni,

1

05AB1E, 15 byte

'a'bVUFX,XYUYJV

1

C , 156 byte (senza rientro)

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

Due buffer (u & v) memorizzano le ultime due righe. La riga più recente (tracciata con due puntatori: inizio = c, fine = d) viene aggiunta alla più vecchia (inizio = a, fine = b). Scambia (a, b) e (c, d) e loop. Prestare attenzione alla dimensione del buffer prima di richiedere troppe righe. Non così breve (come previsto da una lingua di basso livello), ma è stato divertente da programmare.


Hai 5inserito il codice ma dovrebbe essere l'input dell'utente
Karl Napf

Hmm ... Non vedo "input dell'utente" come requisito nel puzzle ... Seguendo lo stesso percorso di Perl, Python, C ++, ... risposte, sostituisci "int main ()" con "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,

Bene, l'input dell'utente è stata una cattiva scelta in termini di parole. Intendevo più come dinamico Ne non fisso. Oppure l'utente potrebbe essere qualcuno che utilizza la tua funzione / programma.
Karl Napf,

Ho corretto uno stupido errore nel non copiare il nul terminator. Ho anche messo la funzione in uno stato più leggibile (una fodera è divertente, ma non utile). Per testare effettivamente questa funzione, utilizzare questo: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil

1

PHP, 63 62 byte

Versione ricorsiva:

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

spazi bianchi non necessari doporeturn
Tito

0

Pyth , 17 byte

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

Un programma che accetta l'input di un numero intero e stampa il risultato.

Provalo online!

Come funziona

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

⎕IOdeve essere 1.

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

0

Mathematica, 49 byte

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

Definisce una funzione che gaccetta il singolo input numerico; restituisce un elenco di stringhe. Implementazione ricorsiva semplice, usando l'operatore di string-join <>.

Mathematica, 56 byte

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

Funzione senza nome, stesso formato di input / output come sopra. Questa soluzione utilizza un modo alternativo per generare le stringhe: ogni stringa nell'elenco è il risultato della sostituzione simultanea, nella stringa precedente, di tutte le occorrenze di "a" con "b" e di tutte le occorrenze di "b" con "ab".



0

PHP, 53 byte

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

salva un byte usando le doppie virgolette e inserendo $bla stringa.
Tito

0

C ++ 11, 89 98 byte

+7 byte per tutte le linee, non solo l'ultima. +2 byte in più per Nessere il numero di righe stampate, non alcune cose basate su 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 byte

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.