Cetak Fibonacci surat


28

Diberikan N (2 <= N ), cetak N baris seri Fibonacci huruf seperti ini (yaitu N = 5) Pertama, mulai dengan adan b:

a
b

Selanjutnya, tambahkan dua baris.

a
b
ab

Terus tambahkan dua baris terakhir.

a
b
ab
bab

Teruskan...

a
b
ab
bab
abbab

Dan kita sudah selesai.

Ingat, ini adalah , jadi kode dengan byte paling sedikit menang.



Bisakah itu fungsi yang mengembalikan daftar istilah hingga N?
FlipTack

Apakah kita harus mencetak hasilnya atau dapatkah kita mengembalikan daftar string dari suatu fungsi?
nimi

Tunggu, jadi tidak harus bekerja untuk n = 1?
Socratic Phoenix

Juga, dapatkah kita menggunakan pengindeksan berbasis 0?
Socratic Phoenix

Jawaban:


10

Python 2, 41 byte

Disimpan 3 byte berkat @xnor

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

Uji Ideone

Cukup ikuti definisi rekursif.


Ini lebih pendek sebagai program: a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor 16

1
Mungkin ingin menentukan python 2 :)
FlipTack

8

Haskell, 29 35 32 byte

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

Rekursi sederhana.

Untuk referensi: versi lama (adaptasi dari jawaban ini ), merangkai string dalam urutan yang salah, jadi saya harus menambahkan flip(...)yang membuatnya terlalu lama (35 byte).

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

Outputnya berbeda dari contoh (urutan berbeda dalam rangkaian):["b","a","ab","aba","abaab"]
Angs

@ Angs: Ups, kesalahan besar! Tetap.
nimi

6

05AB1E , 12 11 byte

Terima kasih kepada Emigna karena telah menghemat satu byte!

'a='b¹GD=Š«

Menggunakan pengkodean CP-1252 . Cobalah online!


1
̓mungkin saja GAnda tidak menggunakan N:)
Emigna

@Emigna Oh ya, kau benar! Terima kasih :)!
Adnan

5

Jelly , 11 10 byte

”a”bṄ;¥@¡f

Cobalah online!

Bagaimana itu bekerja

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

Saya memiliki ”a”b;@Ṅbagian bawah, tapi saya tidak tahu harus ke mana harus pergi dari sana ... sekarang saya tahu :-)
ETHproduksi

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

}
}

Anda benar-benar perlu memformat kode yang tidak dipisahkan sedikit banyak dalam jawaban Anda .. xD +1 meskipun, dan bahkan berfungsi untuk string awal lain yang berbeda dari sekadar adan b. Saya tidak yakin apakah "a"dan "b"parameter harus dihitung terhadap byte-count, karena pertanyaan secara khusus menyatakan itu harus digunakan adan b. Lagipula, Java tidak akan pernah menang. ;)
Kevin Cruijssen

@KevinCruijssen parameter string diperlukan karena nilainya berubah setiap kali metode dipanggil.

@Snowman Saya tahu mereka diperlukan .. Saya hanya mengatakan bahwa byte-count mungkin harus 75 byte (+6 untuk "a"dan "b") daripada 69 karena tantangan yang secara spesifik meminta adan b, dan kode-snipped / metode saat ini menggunakan input variabel. Tidak yakin apa aturannya mengenai hal seperti ini, tapi saya pribadi berpikir itu harus diperhitungkan. Kalau tidak, Anda bisa dalam beberapa bahasa memiliki fungsi yang mengeksekusi fungsi parameter, dan kemudian cukup memberikan seluruh fungsi-tantangan dalam parameter tanpa menghitung byte-nya. Kedengarannya seperti jenis aturan celah standar.
Kevin Cruijssen

1
Saya suka jawaban Java. Mereka menonjol sangat bagus - 12 byte di sini, 5 di sana, 17 di sini ... 70 byte di sana ... tunggu, apa? Oh, ini Jawa lagi ... +1
RudolfJelin

5

Emacs, 26 , 25-ish penekanan tombol

Program

#nuntuk dibaca sebagai kunci dengan angka n :

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

Penjelasan

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

Dengan n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

1
Saya sobek. Di satu sisi, saya selalu mendukung editor-golf, tetapi di sisi lain saya menggunakan vim. Oh well, +1 juga. :)
DJMcMayhem

@DrMcMoylex hanya mengubahnya menjadi vim dengan Cu Mx convert-to-vim
YSC

5

JavaScript (ES6), 43 42 byte

Menyimpan satu byte berkat @Arnauld

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

4

CJam, 19 17 byte

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

penjelasan

"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

Ngomong-ngomong, jumlah string saat ini dimatikan oleh satu; yang terakhir pharus a ;. Anda dapat menghilangkan tanda kutip di sekitar output jika Anda menggunakan nbukan p. Akhirnya, 'a'bmenghemat dua byte "a""b".
Dennis

3

V , 18 byte

ia
bkÀñyjGpgJkñdj

Cobalah online!

Atau, versi yang lebih mudah dibaca:

ia
b<esc>kÀñyjGpgJkñdj

Penjelasan:

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

Cobalah 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

Cobalah online!

Disimpan 10 (!) Byte berkat @ MartinEnder !

Penjelasan

Mengonversi input menjadi unary, mengurangi 2dan menambahkan, adan b, kemudian secara rekursif menggantikan yang tersisa 1dengan gabungan dari dua string sebelumnya.


Menyimpan beberapa byte dengan menghindari tangkapan yang tidak perlu: retina.tryitonline.net/...
Martin Ender

@ MartinEnder Bagus! Tidak cukup melihat kekuatan $%` ! dan tangkapan lain itu hanya perencanaan yang buruk ... Luar biasa, terima kasih!
Dom Hastings

2

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

Untungnya variabel diperluas untuk setiap baris sebelum penugasan berlaku, jadi saya bisa mengatur keduanya adan bmenggunakan nilai lama mereka tanpa perlu sementara. Sunting: Disimpan 9 byte berkat @ nephi12.


Saya akan melakukan ini;) Omong-omong, Anda dapat menyimpan 8 byte dengan menghapus "keluar / b" dan memulai loop Anda dari 2:for /l %%i in (2,1,%1) etc..
nephi12

Satu lagi (baris baru) dengan meletakkan perintah yang ditetapkan pada baris yang sama @set a=a&set b=bseperti yang Anda lakukan dengan yang terakhir. meskipun secara teknis mereka semua bisa berada di jalur yang sama ... tapi itu akan menjadi jelek ... hmm ...
nephi12


2

Perl, 36 35 byte

Termasuk +3 untuk -n

Berikan penghitungan pada 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 untuk flag -n

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

Peningkatan sedikit atas solusi 49-byte yang ada, tetapi dikembangkan secara terpisah. Tanda kurung say($a)diperlukan karena jika tidak, tanda kutip $a,($a,$b)=($b,$a.$b)sebagai argumen sayyang menghasilkan lebih banyak sampah daripada yang kita butuhkan.

Perl, 42 byte

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

Pendekatan terpisah dari solusi di atas:

$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

Saya belum yakin bahwa saya tidak dapat menggabungkan transliterasi dan penggantian menjadi operasi tunggal yang lebih pendek. Jika saya menemukan satu, saya akan mempostingnya.



1

Perl, 48 byte

47 byte kode +1 untuk -n.

Pendekatan sederhana. Coba gunakan irisan array awalnya $a[@a]="@a[-2,-1]"tapi itu mengharuskan $"=""atau serupa :(. Simpan 1 byte berkat @ Dada !

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

Pemakaian

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

Anda dapat menyimpan satu byte dengan menggunakan @;alih-alih @aagar Anda dapat menghilangkan titik koma akhir (lihat apa yang saya maksud?). (Saya tahu, satu byte cukup murah tapi saya tidak punya ide yang lebih baik ..)
Dada

@Dada Ya, saya mencobanya, tetapi itu tidak bisa dikompilasi pada mesin saya, jadi saya pikir mungkin ada sesuatu yang aneh terjadi pada milik saya: 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.tetapi tidak berpikir itu akan adil untuk ditambahkan sebagai jawaban jika saya tidak bisa buat itu bekerja!
Dom Hastings

Yakin ini tidak terkait dengan -pebukan -nE? Bagaimanapun, ini bekerja pada saya, jadi itu mungkin terkait dengan versi perl atau sistem Anda ... Tapi percayalah, saya mengujinya dan berfungsi! ;)
Dada

@Dada saya mendapatkan yang sama -nEjuga (tidak tahu dari mana -peasalnya! Pasti hari Jumat ...) Saya akan memperbarui itu ketika saya mendapat mo! Terima kasih telah berbagi!
Dom Hastings

1

SOML , 8 byte (tidak bersaing)

 a b.{;t⁴+

penjelasan:

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

Alasan ini tidak bersaing adalah karena bahasa ini masih dalam pengembangan dan saya memang menambahkan beberapa fungsi baru saat menulis ini.

Juga, pos pertama di PPCG!


1
Selamat datang di PPCG! Pos pertama yang bagus!
Oliver Ni

1

05AB1E, 15 byte

'a'bVUFX,XYUYJV

1

C , 156 byte (tanpa indentasi)

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

Dua buffer (u & v) menyimpan dua baris terakhir. Baris terbaru (dilacak dengan dua petunjuk: start = c, end = d) ditambahkan ke yang terlama (start = a, end = b). Tukar (a, b) dan (c, d), dan loop. Perhatikan ukuran buffer sebelum meminta terlalu banyak baris. Tidak terlalu pendek (seperti yang diharapkan dari bahasa tingkat rendah), tetapi menyenangkan untuk dikodekan.


Anda melakukan hardcoded 5tetapi itu harus input pengguna
Karl Napf

Hmm ... Saya tidak melihat "input pengguna" sebagai persyaratan dalam teka-teki ... Mengikuti jalur yang sama dengan Perl, Python, C ++, ... jawaban, ganti "int main ()" dengan "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

Input pengguna adalah pilihan yang buruk dalam hal kata-kata. Maksud saya lebih seperti dinamis Ndan tidak tetap. Atau pengguna mungkin seseorang yang menggunakan fungsi / program Anda.
Karl Napf

Saya telah memperbaiki kesalahan bodoh tentang tidak menyalin terminator nul. Saya juga meletakkan fungsi ini dalam keadaan yang lebih mudah dibaca (satu kalimat lucu, tetapi tidak berguna). Untuk benar-benar menguji fungsi ini, gunakan ini: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil

1

PHP, 63 62 byte

Versi rekursif:

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

spasi putih yang tidak perlu setelahreturn
Titus

0

Pyth , 17 byte

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

Program yang mengambil input bilangan bulat dan mencetak hasilnya.

Cobalah online!

Bagaimana itu bekerja

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.

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

Menentukan fungsi yang gmengambil input numerik tunggal; mengembalikan daftar string. Implementasi rekursif langsung, menggunakan operator string-join <>.

Mathematica, 56 byte

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

Fungsi yang tidak disebutkan namanya, format input / output yang sama seperti di atas. Solusi ini menggunakan cara alternatif untuk menghasilkan string: setiap string dalam daftar adalah hasil dari penggantian secara bersamaan, dalam string sebelumnya, semua kemunculan "a" dengan "b" dan semua kemunculan "b" dengan "ab".


0

Groovy, 79 Bytes

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

0

PHP, 53 byte

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

simpan satu byte dengan menggunakan tanda kutip ganda dan masukkan ke $bdalam string.
Titus

0

C ++ 11, 89 98 byte

+7 byte untuk semua baris, tidak hanya yang terakhir. +2 byte lebih banyak karena Njumlah baris yang dicetak, bukan beberapa hal berbasis 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;}

Pemakaian:

f(5)

0

Ruby (1.9+) 46 byte

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.