Wydrukuj list Fibonacciego

28

Biorąc pod uwagę N (2 <= N ), wypisz N wierszy z serii liter Fibonacciego w ten sposób (tj. N = 5) Najpierw zacznij od ai b:

a
b

Następnie dodaj dwie linie.

a
b
ab

Dodawaj dwa ostatnie wiersze.

a
b
ab
bab

Tak trzymaj...

a
b
ab
bab
abbab

I skończyliśmy.

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło
4
Powiązane
AdmBorkBork
Czy może to być funkcja zwracająca listę terminów do N?
FlipTack
Czy musimy wydrukować wynik, czy możemy zwrócić listę ciągów znaków z funkcji?
nimi
Czekaj, więc to nie musi działać dla n = 1?
Socratic Phoenix,
Czy możemy również używać indeksowania opartego na 0?
Socratic Phoenix,

Odpowiedzi:

10

Python 2, 41 bajtów

Zaoszczędź 3 bajty dzięki @xnor

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

Testuj na Ideone

Po prostu podąża za rekurencyjną definicją.

ETHprodukcje
źródło
Jest krótsza jako program: a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor
1
Może chcę podać python 2 :)
FlipTack
8

Haskell, 29 35 32 bajtów

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

Prosta rekurencja.

Dla porównania: stara wersja (adaptacja tej odpowiedzi ) połączyła łańcuchy w niewłaściwej kolejności, więc musiałem dodać wartość, flip(...)która spowodowała, że ​​była za długa (35 bajtów).

f="a":scanl(flip(++))"b"f
(`take`f)
nimi
źródło
Wynik jest inny niż w przykładzie (inna kolejność w konkatenacji):["b","a","ab","aba","abaab"]
Angs
@Angs: Ups, co za błąd! Naprawiony.
nimi
6

05AB1E , 12 11 bajtów

Dzięki Emignie za uratowanie bajtu!

'a='b¹GD=Š«

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
1
̓równie dobrze może być, Gjak nie używasz N:)
Emigna
@Emigna O tak, masz rację! Dzięki :)!
Adnan
5

Galaretka , 11 10 bajtów

”a”bṄ;¥@¡f

Wypróbuj online!

Jak to działa

”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
źródło
Miałem tę ”a”b;@Ṅczęść, ale nie mogłem dowiedzieć się, dokąd się udać ... teraz wiem :-)
ETHprodukcje
5

Java 7, 69 bajtów

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

bez golfa

 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
źródło
Naprawdę musisz sformatować swój niespokojny kod w swoich odpowiedziach trochę więcej. XD +1, ale działa nawet na inne ciągi początkowe inne niż tylko ai b. Nie jestem jednak pewien, czy parametry "a"i "b"należy liczyć do liczby bajtów, ponieważ pytanie wyraźnie określa, że ​​należy użyć ai b. Nie znaczy to, że Java i tak wygra. ;)
Kevin Cruijssen
@KevinCruijssen parametry ciągu są wymagane, ponieważ ich wartości zmieniają się przy każdym wywołaniu metody.
@Snowman Wiem, że są one wymagane. Mówię tylko, że liczba bajtów może być 75 bajtów (+6 dla "a"i "b") zamiast 69, ponieważ wyzwanie konkretnie wymagane dla ai b, i metoda wycinana / zmienne wejście. Nie jestem pewien, jakie są zasady dotyczące czegoś takiego, ale osobiście uważam, że należy to policzyć. W przeciwnym razie możesz w niektórych językach mieć funkcję, która wykonuje funkcję parametru, a następnie po prostu podać całą funkcję wyzwania w parametrze, nie licząc jego bajtów. Brzmi jak reguła z typową luką.
Kevin Cruijssen
1
Uwielbiam odpowiedzi Java. Tak się wyróżniają - 12 bajtów tutaj, 5 tam, 17 tutaj ... 70 bajtów tam ... czekaj, co? Och, to znowu Java ... +1
RudolfJelin
5

Emacs, 26 , 25-ish

Program

#nnależy czytać jako klucz z cyframi (cyframi) n :

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

Wyjaśnienie

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

Przy n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab
YSC
źródło
1
Jestem rozdarta. Z jednej strony zawsze opowiadam się za edytorem golfa, ale z drugiej strony używam vima. No cóż, w każdym razie +1. :)
DJMcMayhem
@DrMcMoylex wystarczy przekonwertować go na vim za pomocą Cu Mx convert-to-vim
YSC
5

JavaScript (ES6), 43 42 bajty

Zapisano bajt dzięki @Arnauld

f=(n,a="a",b="b")=>n&&f(n-!alert(a),b,a+b)
ETHprodukcje
źródło
4

CJam, 19 17 bajtów

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

wyjaśnienie

"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
źródło
Nawiasem mówiąc, liczba ciągów jest obecnie wyłączona o jeden; ostatnia ppowinna być ;. Możesz pozbyć się cytatów wokół wyniku, jeśli użyjesz nzamiast p. Na koniec 'a'boszczędza dwa bajty "a""b".
Dennis
3

V , 18 bajtów

ia
bkÀñyjGpgJkñdj

Wypróbuj online!

Lub bardziej czytelna wersja:

ia
b<esc>kÀñyjGpgJkñdj

Wyjaśnienie:

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
źródło
3

MATL , 14 bajtów

97c98ci2-:"yyh

Wypróbuj 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
Luis Mendo
źródło
3

Python 2, 55 bajtów

def f(n):m='a','b';exec'print m[-2];m+=m[-2]+m[-1],;'*n
mile
źródło
3

Siatkówka , 33 bajty

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

Wypróbuj online!

Zaoszczędź 10 (!) Bajtów dzięki @ MartinEnder !

Wyjaśnienie

Konwertuje dane wejściowe na jednoargumentowe, odejmuje 2i dodaje ai b, a następnie rekurencyjnie zastępuje pozostałe 1s łączeniem dwóch poprzednich ciągów.

Dom Hastings
źródło
Zaoszczędzono kilka bajtów, unikając niepotrzebnych przechwyceń: retina.tryitonline.net/…
Martin Ender
@MartinEnder Nice! Nie bardzo widziałem moc $%` ! a inne przechwytywanie było po prostu złym planowaniem ... Niesamowite, dziękuję!
Dom Hastings,
2

Partia, 102 93 bajty

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

Na szczęście zmienne są rozwijane dla każdej linii, zanim przypisania zaczną obowiązywać, więc mogę ustawić obie ai bużywać ich starych wartości bez potrzeby tymczasowego. Edycja: Zapisano 9 bajtów dzięki @ nephi12.

Neil
źródło
for /l %%i in (2,1,%1) etc..
Właśnie
Jeszcze jeden (nowy wiersz), umieszczając ustawione polecenia w tym samym wierszu, @set a=a&set b=bco w poprzednim. chociaż technicznie wszyscy mogliby być na tej samej linii ... ale to byłoby brzydkie ... hmm ...
nephi12
2

Stack my Golf, 63 bajty

Pobierz mój język tutaj: https://github.com/cheertarts/Stack-My-Golf .

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

Prawdopodobnie jest krótsza droga, ale jest to najbardziej oczywista.

Quincy B.
źródło
2

Perl, 36 35 bajtów

Obejmuje +3 za -n

Policz na STDIN

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

fibo.pl

#!/usr/bin/perl -n
$_=$'.s/1//.$_,say$`for(a1.b)x$_
Ton Hospel
źródło
2

Perl, 45 +1 = 46 bajtów

+1 bajt dla flagi -n

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

Niewielka poprawa w stosunku do istniejącego 49-bajtowego rozwiązania, ale opracowana osobno. Nawiasy dla say($a)są konieczne, ponieważ w przeciwnym razie interpretuje to $a,($a,$b)=($b,$a.$b)jako argument, sayktórego wynikiem jest więcej śmieci niż potrzebujemy.

Perl, 42 bajty

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

Oddzielne podejście od powyższego rozwiązania:

$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

Nie jestem jeszcze przekonany, że nie mogę połączyć transliteracji i zamiany w jedną krótszą operację. Jeśli go znajdę, opublikuję go.

Gabriel Benamy
źródło
1

Swift 3, 76 bajtów

func f(_ n:Int,_ x:String="a",_ y:String="b"){if n>1{print(x);f(n-1,y,x+y)}}
Alexander - Przywróć Monikę
źródło
1

Perl, 48 bajtów

47 bajtów kod + 1 dla -n.

Proste podejście. Spróbuj użyć fragmentu tablicy pierwotnie, $a[@a]="@a[-2,-1]"ale to wymaga $"=""lub jest podobne :(. Oszczędź 1 bajt dzięki @ Dada !

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

Stosowanie

perl -nE '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5
a
b
ab
bab
abbab
Dom Hastings
źródło
Możesz zapisać jeden bajt, używając @;zamiast, @awięc możesz pominąć ostatni średnik (rozumiesz, co mam na myśli?). (Wiem, jeden bajt jest dość tani, ale nie miałem lepszego pomysłu ..)
Dada
@Dada Tak, próbowałem tego, ale nie udało mi się skompilować na mojej maszynie, więc pomyślałem, że może dzieje się coś dziwnego z moją: 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.ale nie sądziłem, że byłoby sprawiedliwie dodać jako odpowiedź, gdybym nie mógł uruchom to!
Dom Hastings,
Jasne, że to nie jest związane z -pezamiast -nE? W każdym razie działa na moim, więc prawdopodobnie jest to związane z twoją wersją lub systemem Perla ... Ale zaufaj mi, przetestowałem to i działa! ;)
Dada
@Dada Mam to samo z -nE(nie wiem skąd się -pewziął! Musi być piątek ...) Zaktualizuję to, gdy dostanę mo! Dzięki za udostępnienie!
Dom Hastings,
1

SOML , 8 bajtów (niekonkurencyjny)

 a b.{;t⁴+

wyjaśnienie:

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

Powodem, dla którego nie jest konkurencyjny, jest to, że ten język jest wciąż w fazie rozwoju i podczas pisania tego dodałem kilka nowych funkcji.

Również pierwszy post na PPCG!

dzaima
źródło
1
Witamy w PPCG! Świetny pierwszy post!
Oliver Ni
1

05AB1E, 15 bajtów

'a'bVUFX,XYUYJV

źródło
1

C , 156 bajtów (bez wcięcia)

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

Dwa bufory (u & v) przechowują ostatnie dwa wiersze. Najnowsza linia (śledzona za pomocą dwóch wskaźników: start = c, end = d) jest dołączana do najstarszej (start = a, end = b). Zamień (a, b) i (c, d) i zapętl. Zwróć uwagę na rozmiar bufora przed zażądaniem zbyt dużej liczby linii. Nie tak krótki (jak można się spodziewać po języku niskiego poziomu), ale dobrze się bawił.

Phil
źródło
Zakodowałeś na stałe, 5ale powinien to być wkład użytkownika
Karl Napf,
Hmm ... Nie widzę „danych wejściowych użytkownika” jako wymogu w układance ... Podążając tą samą ścieżką co Perl, Python, C ++, ... odpowiedzi, zamień „int main ()” na „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,
Cóż, wkład użytkownika był złym wyborem pod względem słów. Miałem na myśli bardziej dynamiczny, Na nie naprawiony. Lub użytkownik może być kimś, kto używa twojej funkcji / programu.
Karl Napf,
Naprawiłem głupi błąd polegający na tym, że nie skopiowałem terminatora nul. Ustawiłem też tę funkcję w bardziej czytelnym stanie (jedna linijka jest zabawna, ale nie przydatna). Aby faktycznie przetestować tę funkcję, użyj tego: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil
1

PHP, 63 62 bajty

Wersja rekurencyjna:

function f($n,$a=a,$b=b){return$n--?"$a
".f($n,$b,$a.$b):'';}
Crypto
źródło
niepotrzebne białe znaki poreturn
Tytus
0

Pyth , 17 bajtów

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

Program, który pobiera liczbę całkowitą i wypisuje wynik.

Wypróbuj online!

Jak to działa

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
źródło
0

APL, 30 bajtów.

⎕IOmusi być 1.

{⎕←⍵}¨{⍵∊⍳2:⍵⌷'ab'⋄∊∇¨⍵-⌽⍳2}¨⍳
Zacharý
źródło
0

Mathematica, 49 bajtów

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

Definiuje funkcję gprzyjmującą pojedyncze dane liczbowe; zwraca listę ciągów znaków. Prosta implementacja rekurencyjna za pomocą operatora łączenia ciągów <>.

Mathematica, 56 bajtów

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

Funkcja bez nazwy, taki sam format wejścia / wyjścia jak powyżej. To rozwiązanie wykorzystuje alternatywny sposób generowania ciągów: każdy ciąg na liście jest wynikiem jednoczesnego zastąpienia, w poprzednim ciągu, wszystkich wystąpień „a” na „b” i wszystkich wystąpień „b” na „ab”.

Greg Martin
źródło
0

Groovy, 79 bajtów

{println("a\nb");x=['a','b'];(it-2).times{println(y=x.sum());x[0]=x[1];x[1]=y}}
Urna Magicznej Ośmiornicy
źródło
0

PHP, 53 bajty

for($a=b,$b=a;$argv[1]--;$a=($_=$b).$b=$a)echo$b.'
';
chocochaos
źródło
zapisz jeden bajt, używając podwójnych cudzysłowów i wstawiając $bciąg.
Tytus
0

C ++ 11, 89 98 bajtów

+7 bajtów dla wszystkich linii, nie tylko ostatniej. +2 bajty więcej za Nliczbę wydrukowanych linii, a nie niektóre rzeczy oparte na 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;}

Stosowanie:

f(5)
Karl Napf
źródło
0

Rubinowy (1.9+) 46 bajtów

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
shabunc
źródło