Jumlahkan Angka Fibonacci Pertama dan Genap

19

Sepertinya belum ada kontes untuk yang ini.

Tugasnya sederhana. Tambahkan nangka pertama dari urutan Fibonacci yang genap dan output hasilnya.

Ini diberikan oleh OEIS A099919 , kecuali bahwa urutan digeser oleh satu, dimulai dengan fib(1) = 0alih - alih fib(1) = 1.

Ini kode golf. Hitungan byte terendah menang.

Contohnya

n sum
1 0
2 2
3 10
4 44
5 188
6 798
7 3382
8 14328
9 60696

Terkait

dfernan
sumber
@ EasterlyIrk Kasus uji menyiratkan yang terakhir, tetapi harus dinyatakan secara eksplisit.
Mego
@Mego ya, saya pikir banyak.
Rɪᴋᴇʀ
9
Tolong jangan terima jawaban begitu cepat. Hanya satu jam, jawaban golf bisa masuk. EDIT: Saya mengerti sekarang sudah ada jawaban yang lebih pendek yang belum diterima.
R
6
Sudah biasa menunggu setidaknya seminggu sebelum menerima jawaban, karena banyak orang menafsirkannya sebagai tanda bahwa tantangan tidak lagi aktif.
Zgarb

Jawaban:

8

Oasis , 8 7 5 byte

1 byte disimpan berkat @ETHProductions dan 2 lagi tersimpan berkat @Adnan!

zc»+U

Cobalah online!

Penjelasan:

Ini menggunakan rumus perulangan yang sama dengan jawaban MATL saya.

Luis Mendo
sumber
1
Oasis's info.txt mengatakan Udiganti dengan kode 00, mungkinkah itu menghemat satu byte?
ETHproduk
@ ETHproduk Terima kasih! Saya lupa itu
Luis Mendo
1
Bagus! Anda dapat mengganti 4*dengan zdan 2+dengan »:)
Adnan
@ Adnan Terima kasih! Saya benar-benar harus membaca dokumen :-)
Luis Mendo
17

Python, 33 byte

c=2+5**.5
lambda n:(7-c)*c**n//20

Cobalah online

Formula ajaib!

Tidak
sumber
3
Ya Tuhan. Butuh waktu lebih lama daripada yang seharusnya saya sadari mengapa Anda "berkomentar" pada 20 di baris kedua: P
Theo
@xnor, Ada referensi ke rumus ajaib ini?
TheChetan
@TheChetan: mungkin a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Colin Barker, 26 Nov 2016) dari halaman OEIS
Titus
7

Sebenarnya , 6 byte

r3*♂FΣ

Cobalah online!

Penjelasan:

Setiap angka Fibonacci ketiga (mulai dari F_0 = 0) adalah genap. Dengan demikian, nangka Fibonacci bahkan pertama adalah F_{i*3}untuk idi [0, n).

r3*♂FΣ
r       [0, n)
 3*     multiply each element by 3
   ♂F   retrieve the corresponding element in the Fibonacci sequence
     Σ  sum
Mego
sumber
7

JavaScript (ES6), 27 byte

f=x=>x>1&&4*f(x-1)+f(x-2)+2

Rekursi untuk menyelamatkan! Ini menggunakan salah satu formula pada halaman OEIS:

f (n <1) = 0, f (n) = 4 * a (n + 1) + a (n) +2

(Tapi digeser satu per satu karena tantangan menggesernya per satu)

Produksi ETH
sumber
6

Pyke, 6 byte

3m*.bs

Coba di sini!

3m*    -   map(i*3, range(input))
   .b  -  map(nth_fib, ^)
     s - sum(^)
Biru
sumber
4

Perl 6 ,  38 35  32 byte

{[+] grep(*%%2,(1,&[+]...*))[^($_-1)]}

Cobalah

{[+] grep(*%%2,(0,1,*+*...*))[^$_]}

Cobalah

{[+] (0,1,*+*...*)[3,6...^$_*3]}

Cobalah

Diperluas:

{  # bare block lambda with implicit parameter 「$_」

  [+]                       # reduce with 「&infix:<+>」

    ( 0, 1, * + * ... * )\  # fibonacci sequence with leading 0

    [ 3, 6 ...^ $_ * 3 ]    # every 3rd value up to
                            # and excluding the value indexed by
                            # the input times 3

}
Brad Gilbert b2gills
sumber
3

Oktaf , 36 35 33 byte

@(n)filter(2,'FAD'-69,(1:n)>1)(n)

Cobalah online!

Penjelasan

Fungsi anonim ini mengimplementasikan persamaan perbedaan a(n) = 4*a(n-1)+a(n-2)+2sebagai filter rekursif :

Y = filter(B,A,X)memfilter data dalam vektor Xdengan filter yang dijelaskan oleh vektor Adan Buntuk membuat data yang difilter Y. Filter adalah implementasi "Direct Form II Transposed" dari persamaan perbedaan standar:

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

Dalam kasus kami A = [1 -4 -1], B = 2dan input xharus menjadi vektor yang, dengan hasil muncul sebagai entri terakhir dari output y. Namun, kami menetapkan 0nilai input pertama sehingga menjadi inisial0 muncul di output, seperti yang diperlukan.

'FAD'-69hanyalah cara yang lebih singkat untuk menghasilkan vektor koefisien A = [1 -4 -1]; dan (1:n)>1menghasilkan vektor input x = [0 1 1 ... 1].

Luis Mendo
sumber
3

dc , 25 22 byte

9k5v1+2/3?*1-^5v/0k2/p

Cobalah online!

Atau simpan program dalam file dan jalankan dengan mengetik

dc -f *filename*

Program ini menerima bilangan bulat n -negatif pada stdin, dan ini menghasilkan jumlah dari angka-angka pertama n bahkan Fibonacci pada stdout. (Urutan Fibonacci diambil untuk memulai dengan 0, sesuai dengan contoh OP.)


Program ini menggunakan rumus (F (3n-1) -1) / 2 untuk penjumlahan bilangan Fibonacci n n genap, di mana F adalah fungsi Fibonacci biasa, yang diberikan oleh F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) untuk n> = 2.


dc adalah kalkulator berbasis tumpukan. Berikut penjelasan terperinci:

9k  # Sets the precision to 9 decimal places (which is more than sufficient).

5v  # Push the square root of 5

1+  # Add 1 to the number at the top of the stack.

2/  # Divide the number at the top of the stack by 2.

Pada titik ini, angka (1 + sqrt (5)) / 2 berada di bagian atas tumpukan.

3   # Push 3 on top of the stack.

?   # Read a number from stdin, and push it.

\*  # Pop two numbers from the stack, multiply them, and push the product

1-  # Subtract 1 from the number at the top of the stack.

Pada titik ini, 3n-1 berada di atas tumpukan (di mana n adalah input), dan (1 + sqrt (5)) / 2 adalah yang kedua dari atas.

^   # Pop two numbers from the stack (x, then y), compute the power y^x, and push that back on the stack.

5v/ # Divide the top of the stack by sqrt(5).

Pada titik ini, angka di bagian atas tumpukan adalah (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5). Bilangan bulat terdekat dengan nomor ini adalah F (3n-1). Perhatikan bahwa F (3n-1) selalu merupakan angka ganjil.

0k # Change precision to 0 decimal places.

2/ # Divide the top of the stack by 2, truncating to an integer.

p # Print the top of the stack on stdout.
Mitchell Spector
sumber
3

Mathematica, 27 21 byte

Berkat xnor karena menunjukkan formula alternatif, alephalpha untuk mengoreksi indeks awal

Fibonacci[3#-1]/2-.5&
ngenisis
sumber
1
Mungkinkah (Fibonacci(3*n+2)-1)/2formula lebih pendek?
xnor
2

MATL , 15 14 byte

OOi:"t4*b+2+]x

Cobalah online!

Penjelasan

Ini menggunakan salah satu rumus pengulangan dari OEIS:

a (n) = 4 * a (n-1) + a (n-2) +2

Untuk input N , kode ini mengulangi N kali, yaitu 2 kali lebih banyak dari yang diperlukan. Ini dikompensasi dengan menetapkan 0, 0(bukan 0, 2) sebagai nilai awal, dan dengan menghapus nilai yang diperoleh terakhir dan menampilkan yang sebelumnya.

OO      % Push two zeros as initial values of a(n-2), a(n-1)
i       % Input N
:"      % Do this N times
  t     %   Duplicate a(n-1)
  4*    %   Multiply by 4
  b+    %   Bubble up a(n-2) and add to 4*a(n-1)
  2+    %   Add 2. Now we have 4*a(n-1)+a(n-2)+2 as a(n), on top of a(n-1)
]       % End
x       % Delete last value, a(n). Implicitly display the remaining value, a(n-1)
Luis Mendo
sumber
2

Batch, 80 byte

@set/at=x=0,y=1
@for /l %%i in (2,1,%1)do @set/az=x+y,y=z+x,t+=x=y+z
@echo %t%

Menggunakan fakta bahwa setiap angka Fibonacci ketiga genap, dan hanya menghitungnya tiga sekaligus (menghitung lebih dari satu pada satu waktu sebenarnya lebih mudah karena Anda tidak perlu menukar nilai di sekitar). Saya mencoba (Fibonacci(3*n+2)-1)/2formulasi tetapi sebenarnya beberapa byte lebih lama ( t+=ternyata cukup efisien dalam hal ukuran kode).

Neil
sumber
2

C, 82 38 36 byte

2 byte disimpan berkat @BrainSteel

Rumus pada halaman OEIS membuatnya jauh lebih pendek:

a(n){return--n<1?0:4*a(n)+a(n-1)+2;}

Cobalah online!

82 byte:

x,s,p,n,c;f(N){s=0;p=n=1;c=2;while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}

Versi pertama adalah 75 byte tetapi fungsinya tidak dapat digunakan kembali, kecuali jika Anda selalu memanggil fdengan lebih besar Ndari panggilan sebelumnya :-)

x,s,p=1,n=1,c=2;f(N){while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}

Jawaban pertama saya di sini. Tidak memeriksa jawaban lain atau OEIS. Saya kira ada beberapa trik yang bisa saya terapkan untuk membuatnya lebih pendek :-)

simon
sumber
1
Anda dapat membuat ini sedikit lebih pendek dengan mengocok sedikit: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 byte)
BrainSteel
1

Haskell ( 32 31 byte)

Disimpan satu byte berkat @ChristianSievers.

Menggunakan rumus yang diberikan dalam OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1oleh Gary Detlefs

a n|n>1=4*a(n-1)+a(n-2)+2|n<2=0

Dylan Meeus
sumber
Cara pegolf untuk mengatakan n<=1bilangan bulat adalah n<2. Juga, kondisi kedua tidak harus negasi dari yang pertama (idiomnya otherwisesederhana True), jadi biasanya dalam bermain golf sesuatu seperti 1<2digunakan.
Christian Sievers
@ChristianSievers memang n <2 adalah peningkatan yang jelas, terima kasih. Yang kedua juga berfungsi, meskipun tidak menyelamatkan saya dalam hal ini. Saya masih belajar Haskell dan tidak menyadari bahwa saya bisa memiliki penjaga seperti itu. Terima kasih!
Dylan Meeus
1

Mathematica, 32 27 byte

Fibonacci[3Input[]-1]/2-1/2

Kredit ke xnor . Disimpan 5 byte berkat JungHwan Min.

lebih kaya
sumber
Tentunya Mathematica memiliki Fibonacci dan lebih pendek untuk melakukan (Fibonacci(3*n+2) - 1)/2atau menulis sumi?
xnor
@JungHwanMin Ini bukan plagiarisme; itu menyebutkan halaman OEIS. Juga, ini bukan kandidat untuk wiki komunitas. Lihat Bagaimana seharusnya Komunitas Wikis digunakan? .
Dennis
@devRichter Maaf telah membatalkan penghapusan kiriman Anda, tetapi perlu melakukan percakapan. Jika Anda ingin menghapusnya, beri tahu saya dan saya akan memindahkan percakapan ini ke ruang obrolan.
Dennis
@Dennis masih, saya percaya kredit harus diberikan kepada Vincenzo Librandi secara eksplisit - (secara tidak sengaja menghapus komentar terakhir saya ... apakah itu dapat dihapus?) Untuk saran pos komunitas, saya berdiri dikoreksi.
JungHwan Min
Yang saya maksudkan adalah menyebutkan namanya di pos ... (atau mungkin memasukkan komentar Mathematica (* Vincenzo Librandi, Mar 15 2014 *)di pos, seperti yang ada di OEIS.)
JungHwan Min
1

R, 42 byte

Solusi non-rekursif, berbeda dengan solusi sebelumnya oleh @rtrunbull di sini .

for(i in 1:scan())F=F+gmp::fibnum(3*i-3);F

Menggunakan properti yang setiap nilai ketiga dari deret Fibonacci genap. Juga menyalahgunakan fakta yang Fsecara default didefinisikan FALSE=0, yang memungkinkannya sebagai dasar untuk menambahkan nilai.

JAD
sumber
1

R, 42 41 byte

sum(DescTools::Fibonacci(3*(scan():2-1)))

scan(): ambil ndari stdin.

scan():2-1: menghasilkan bilangan bulat dari nhingga 2, pengurangan dengan 1, menghasilkann-1 melalui 1.

3*(scan():2-1) : kalikan dengan 3, karena setiap angka fibonacci ketiga adalah genap.

DescTools::Fibonacci(3*(scan():2-1)): Kembalikan angka-angka fibonacci ini (yaitu 3melalui (n-1)*3).

sum(DescTools::Fibonacci(3*(scan():2-1))) : Jumlahkan hasilnya.

Sebelumnya, saya punya solusi tidak menarik ini menggunakan salah satu formula dari OEIS:

a=function(n)`if`(n<2,0,4*a(n-1)+a(n-2)+2)
rturnbull
sumber
Saya berhasil mencocokkan bytecount Anda tanpa rekursi :)
JAD
@JarkoDubbeldam Bagus! Saya sudah membuang rekursi juga dan membuat peningkatan satu byte :)
rturnbull
Bagus, apa tepatnya desctools::fibonacciyang numbers::fibonaccibisa dilakukan itu ? Karena kabut itu sedikit lebih pendek.
JAD
Oh tidak apa-apa, menemukannya. Manis, implementasi lain yang saya temukan tidak mendukung meminta beberapa nomor sekaligus.
JAD
1
@JarkoDubbeldam Ya, `` gmp :: fibnum '' mengembalikan objek bertipe bigz, yang *applydiubah oleh kelas fungsi menjadi mengetik rawkarena alasan ...
rturnbull
1

Japt , 10 byte

Uo@MgX*3Ãx

Cobalah online!

Terima kasih ETHproductions :)

Oliver
sumber
1

PHP, 73 70 byte

for(${0}=1;$i++<$argv[1];$$x=${0}+${1})${$x^=1}&1?$i--:$s+=$$x;echo$s;

menampilkan variabel variabel . Di). Jalankan dengan -nr.

kerusakan

for(${0}=1;         # init first two fibonaccis (${1}=NULL evaluates to 0 in addition)
                    # the loop will switch between $0 and $1 as target.
    $i++<$argv[1];  # loop until $i reaches input
    $$x=${0}+${1}       # 3. generate next Fibonacci
)
    ${$x^=1}            # 1. toggle index (NULL => 1 => 0 => 1 ...)
    &1?$i--             # 2. if current Fibonacci is odd, undo increment
    :$s+=$$x;           #    else add Fibonacci to sum
echo$s;             # print result

Angka adalah nama variabel yang benar-benar valid dalam PHP.
Tapi, untuk literal, mereka membutuhkan kawat gigi; yaitu ${0}tidak $0.

36 byte, O (1)

<?=(7-$c=2+5**.5)*$c**$argv[1]/20|0;

port jawaban xnor

Titus
sumber
0

PARI / GP, 21 byte

n->fibonacci(3*n-1)\2

\ adalah hasil bagi bilangan bulat.

alephalpha
sumber