İlk n Çift Fibonacci Sayılarını Toplayın


19

Bunun için henüz bir yarışma yok gibi görünüyor.

Görev basit. nEşit olan Fibonacci dizisinin ilk sayılarını ekleyin ve sonucu alın.

Bu, OEIS A099919 tarafından verilir , ancak sekans, fib(1) = 0yerine ile başlayarak birer birer kaydırılır fib(1) = 1.

Bu kod golf. En düşük bayt sayısı kazanır.

Örnekler

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

İlişkili



@EasterlyIrk Test senaryoları ikincisini ifade eder, ancak açıkça belirtilmelidir.
Mego

@Mego evet, ben de düşündüm.
Rɪᴋᴇʀ

9
Lütfen cevapları bu kadar hızlı kabul etmeyin. Sadece golfier cevap, bir saat oldu olabilirdi . EDIT gelir: Şimdi zaten henüz kabul edilmemiş bir kısa yanıt var görüyoruz.
Rɪᴋᴇʀ

6
Bir yanıtı kabul etmeden önce en az bir hafta beklemek gelenekseldir, çünkü birçok insan bunu zorluğun artık aktif olmadığının bir işareti olarak yorumlar.
Zgarb

Yanıtlar:


8

Vaha , 8 7 5 bayt

@ETHProductions sayesinde 1 byte ve @Adnan sayesinde 2 byte tasarruf!

zc»+U

Çevrimiçi deneyin!

Açıklama:

Bu, MATL cevabımla aynı tekrarlama formülünü kullanıyor.


1
Oasis'in info.txt Ukodu kodda değiştirildi, bu 00sizi bir bayt kurtarabilir mi?
ETHproductions

@ETHproductions Teşekkürler! Bunu unuttum
Luis Mendo

1
Güzel! Sen yerini alabilir 4*ile zve 2+ile »:)
Adnan

@Adnan Teşekkürler! Gerçekten dokümanı okumalıyım :-)
Luis Mendo

17

Python, 33 bayt

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

Çevrimiçi deneyin

Sihirli formül!


3
Aman Tanrım. İkinci satırda 20'yi neden "yorumladığınızı" fark etmem gerekenden çok daha uzun sürdü: P
Theo

@xnor, Bu sihirli formüle referans var mı?
TheChetan

@TheChetan: muhtemelen a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Colin Barker, 26 Kasım 2016) OEIS sayfasından
Titus


7

Aslında , 6 bayt

r3*♂FΣ

Çevrimiçi deneyin!

Açıklama:

Her üçüncü Fibonacci sayısı (başlangıçtan itibaren F_0 = 0) çifttir. Böylece, ilk nhatta Fibonacci sayıları F_{i*3}için ide [0, n).

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

7

JavaScript (ES6), 27 bayt

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

Kurtarmaya özyineleme! Bu, OEIS sayfasındaki formüllerden birini kullanır:

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

(ancak birer birer kaydırılır çünkü meydan okuma onu birer birer kaydırır)



4

Perl 6 ,  38 35  32 bayt

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

Dene

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

Dene

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

Dene

Expanded:

{  # 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

}

3

Oktav , 36 35 33 bayt

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

Çevrimiçi deneyin!

açıklama

Bu anonim işlev, fark denklemini özyinelemeli bir filtrea(n) = 4*a(n-1)+a(n-2)+2 olarak uygular :

Y = filter(B,A,X)vektör verileri filtre Xvektörler tarafından tarif edilen filtre ile Ave Bfiltre veri oluşturma Y. Filtre, standart fark denkleminin "Doğrudan Form II Aktarılmış" uygulamasıdır:

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)

Bizim durumumuzda A = [1 -4 -1], B = 2ve girdi xbir vektör olmalıdır, sonuç çıktının son girişi olarak görünür y. Ancak, gerektiğinde çıkışta 0bir ilk 0görünmesi için girişin ilk değerini ayarladık .

'FAD'-69katsayı vektörünü üretmenin sadece daha kısa bir yoludur A = [1 -4 -1]; ve (1:n)>1girdi vektörünü üretir x = [0 1 1 ... 1].


3

dc , 25 22 bayt

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

Çevrimiçi deneyin!

Veya programı bir dosyaya kaydedin ve yazarak çalıştırın

dc -f *filename*

Program, negatif olmayan bir tamsayıyı kabul n stdin ve ilk toplamını verir N stdout'ta da Fibonacci sayıları. (Fibonacci sekansı, OP'nin örneklerine göre 0 ile başlamak için alınır.)


Bu program, ilk n çift Fibonacci sayısının toplamı için (F (3n-1) -1) / 2 formülünü kullanır; burada F, F (0) = 0, F (1) = ile verilen olağan Fibonacci işlevidir. 1, n> = 2 için F (n) = F (n-2) + F (n-1).


dc, yığın tabanlı bir hesap makinesidir. İşte ayrıntılı bir açıklama:

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.

Bu noktada, (1 + sqrt (5)) / 2 sayısı yığının en üstündedir.

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.

Bu noktada, 3n-1 yığının üstündedir (burada n giriştir) ve (1 + sqrt (5)) / 2 üstten ikinci sıradadır.

^   # 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).

Bu noktada, yığının üstündeki sayı (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5) 'tir. Bu sayıya en yakın tam sayı F'dir (3n-1). F (3n-1) 'in her zaman tek bir sayı olduğunu unutmayın.

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.

3

Mathematica, 27 21 bayt

Alternatif bir formülü işaret ettiği için xnor, başlangıç ​​indeksini düzeltmek için alephalpha

Fibonacci[3#-1]/2-.5&

1
Olabilir (Fibonacci(3*n+2)-1)/2Formül daha kısa?
xnor

2

MATL , 15 14 bayt

OOi:"t4*b+2+]x

Çevrimiçi deneyin!

açıklama

Bu, OEIS'in yineleme formüllerinden birini kullanır:

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

N girişi için kod , N kez yinelenir ; bu, gerekenden 2 kat fazladır. Bu ayar, ile telafi edilir 0, 0(yerine 0, 2başlangıç değerleri olarak) ve son olarak elde edilen değer, silme ve bir önceki göstererek.

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)

2

Toplu, 80 bayt

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

Her üçüncü Fibonacci sayısının çift olduğu gerçeğini kullanır ve bunları her seferinde üç tane hesaplar (bir seferde birden fazla hesaplamak aslında değerleri değiştirmenize gerek olmadığı için daha kolaydır). (Fibonacci(3*n+2)-1)/2Formülasyonu denedim ama aslında birkaç bayt daha uzun ( t+=kod boyutu açısından oldukça verimli olduğu ortaya çıktı).


2

C, 82 38 36 bayt

@BrainSteel sayesinde 2 bayt kaydedildi

OEIS sayfasındaki formüller onu daha kısa hale getirdi:

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

Çevrimiçi deneyin!

82 bayt:

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

İlk sürüm 75 bayttır, ancak her zaman önceki çağrıdan fdaha büyük bir çağrı yapmazsanız işlev yeniden kullanılamaz N:-)

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

Buraya ilk cevabım. Başka cevapları veya OEIS'i kontrol etmediniz. Sanırım kısaltmak için başvurabileceğim birkaç hileci var :-)


1
Biraz şeyleri karıştırarak bunu biraz daha kısa yapabilirsiniz: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 bayt)
BrainSteel

1

Haskell ( 32 31 bayt)

@ChristianSievers sayesinde bir bayt kaydedildi.

a(n) = 4*a(n-1)+a(n-2)+2, n>1OEIS'te verilen formülü kullanarak: Gary Detlefs

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


n<=1Tamsayıları söylemenin daha golfçü bir yolu n<2. Ayrıca, ikinci koşulun birincinin (deyimsel otherwiseolarak basitçe True) olumsuzlanması olması gerekmez , bu nedenle genellikle golf gibi bir 1<2şey kullanılır.
Christian Sievers

@ChristianSievers gerçekten de n <2 bariz bir gelişme, teşekkürler. İkincisi de çalışıyor, ancak bu durumda beni hiçbir şey kurtarmıyor. Hala Haskell öğreniyorum ve böyle bir muhafız alabileceğimin farkında değildim. Teşekkür ederim!
Dylan Meeus

1

Mathematica, 32 27 bayt

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

Xnor'a kredi . JungHwan Min sayesinde 5 bayt tasarruf etti.


Elbette Mathematica'nın Fibonacci var ve (Fibonacci(3*n+2) - 1)/2sumi yapmak ya da yazmak daha mı kısa ?
xnor

@JungHwanMin Bu intihal değil; OEIS sayfasından bahseder. Ayrıca, bu topluluk wiki adayı değil. Bkz Toplum Wikis kullanılmalıdır nasıl? .
Dennis

@devRichter Gönderinizi sildiğiniz için üzgünüz, ancak bir görüşme yapmanız gerekiyordu. Silinmesini istiyorsanız, bana bildirin, bu sohbeti bir sohbet odasına taşıyacağım.
Dennis

@Dennis hala, Vincenzo Librandi'ye açıkça kredi verilmesi gerektiğine inanıyorum - (yanlışlıkla son yorumumu sildim ... bu geri alınamaz mı?) Topluluk sonrası önerisi için düzeltilmiş duruyorum.
JungHwan Min

Demek istediğim, yazıdaki isminden bahsetmekti ... (ya da belki de (* Vincenzo Librandi, Mar 15 2014 *)
OEIS'te

1

R, 42 bayt

Sigara özyinelemeli çözümü @rtrunbull daha erken çözümün aksine olarak burada .

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

Fibonacci dizisinin her üçüncü değerinin eşit olduğu özelliği kullanır. Ayrıca F, varsayılan değer olarak tanımlanan gerçeği de kötüye FALSE=0kullanır ve değerlerin eklenmesine temel oluşturur.


1

R, 42 41 bayt

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

scan(): nstdin'den al.

scan():2-1: Arasındaki tam sayıları oluşturmak nüzere 2tarafından azalma, 1sonuçta, n-1içinden 1.

3*(scan():2-1) : Her üçüncü fibonacci sayısı çift olduğu için 3 ile çarpın.

DescTools::Fibonacci(3*(scan():2-1)): Bu fibonacci sayılarını döndürün (örn. 3Aracılığıyla (n-1)*3).

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

Daha önce, OEIS'in formüllerinden birini kullanarak bu ilginç çözümü vardı:

a=function(n)`if`(n<2,0,4*a(n-1)+a(n-2)+2)

Bayt saymanızı özyineleme olmadan eşleştirmeyi başardım :)
JAD

@JarkoDubbeldam Güzel! Ben de özyineleme hendek ve bir bayt iyileştirme yaptım :)
rturnbull

Güzel, bu tam olarak ne desctools::fibonacciyapamaz numbers::fibonacci? Çünkü bu sis biraz daha kısa olacak.
JAD

Ah, boşver, buldum. Tatlı, bulduğum diğer uygulamalar bir kerede birden fazla numara istemeyi desteklemiyor.
JAD

1
@JarkoDubbeldam Evet, `` gmp :: fibnum '' , işlev sınıfının türe dönüştürüldüğü türden nesneler döndürür bigz, çünkü ...*applyraw
rturnbull


1

PHP, 73 70 bayt

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

vitrine değişken değişkenleri . O (n). İle çalıştırın -nr.

Yıkmak

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

Sayılar PHP'de tamamen geçerli değişken adlarıdır.
Ama değişmezler için parantez gerektirirler; yani ${0}değil $0.

36 bayt, O (1)

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

xnor´s bağlantı noktası


0

PARI / GP, 21 bayt

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

\ tamsayı bölümüdür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.