Підсумовуємо перші n парних чисел Фібоначчі


19

Здається, для цього ще немає конкурсу.

Завдання проста. Додайте перші nчисла послідовності Фібоначчі, які є парними, і виведіть результат.

Це дає OEIS A099919 , за винятком того, що послідовність зміщується на одиницю, починаючи з fib(1) = 0замість fib(1) = 1.

Це код гольфу. Виграє найменший байт.

Приклади

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

Пов'язані



@EasterlyIrk Тестові випадки мають на увазі останнє, але його слід чітко вказати.
Мего

@ Mee так, я зрозумів стільки ж.
Rɪᴋᴇʀ

9
Будь ласка, не приймайте відповіді так швидко. Минула лише година, відповідь на гравця могла надійти. EDIT: Я бачу, зараз є вже коротша відповідь, яка ще не прийнята.
Rɪᴋᴇʀ

6
Зазвичай чекати хоча б тиждень, перш ніж приймати відповідь, адже багато людей трактують це як знак того, що виклик більше не активний.
Згарб

Відповіді:


8

Оазис , 8 7 5 байт

1 байт збережено завдяки @ETHProductions та ще 2 збережені завдяки @Adnan!

zc»+U

Спробуйте в Інтернеті!

Пояснення:

Для цього використовується та ж формула повторення, що і моя відповідь MATL.


1
Інформація Oasis в info.txt говорить U, що замінена в коді на 00, може, це врятує вас байт?
ETHproductions

@ETHproductions Дякую! Я забув це
Луїс Мендо

1
Приємно! Ви можете замінити 4*на zі 2+на »:)
Аднан

@Adnan Дякую! Я дійсно повинен прочитати документ :-)
Луїс Мендо

17

Пітон, 33 байти

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

Спробуйте в Інтернеті

Чарівна формула!


3
О, Боже. Це зайняло у мене набагато більше часу, ніж це повинно було зрозуміти, чому ви "коментували", що 20 у другому рядку: P
Тео

@xnor, Будь-яке посилання на цю магічну формулу?
TheChetan

@TheChetan: можливо a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Колін Баркер, 26 листопада 2016 р.) Зі сторінки OEIS
Тіт


7

Власне , 6 байт

r3*♂FΣ

Спробуйте в Інтернеті!

Пояснення:

Кожне третє число Фібоначчі (починаючи з F_0 = 0) парне. Таким чином, перші nпарні числа Фібоначчі призначені F_{i*3}для iв [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 байт

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

Рекурсія на допомогу! Для цього використовується одна з формул на сторінці OEIS:

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

(але зміщується на одного, оскільки виклик змінює його на одного)



4

Perl 6 ,  38 35  32 байт

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

Спробуй це

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

Спробуй це

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

Спробуй це

Розширено:

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

Октава , 36 35 33 байт

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

Спробуйте в Інтернеті!

Пояснення

Ця анонімна функція реалізує рівняння різниці a(n) = 4*a(n-1)+a(n-2)+2як рекурсивний фільтр :

Y = filter(B,A,X)фільтрує дані у векторному Xфільтрі, описаному векторами, Aі Bстворює відфільтровані дані Y. Фільтр - це реалізація стандартного різницевого рівняння "Пряма форма II":

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)

У нашому випадку A = [1 -4 -1], B = 2і вхід xповинен бути вектором одиниць, результат буде відображатися як останній запис результату y. Однак ми встановимо 0перше значення вводу, щоб початкове 0відображалось у висновку, як потрібно.

'FAD'-69- лише коротший спосіб отримання вектора коефіцієнтів A = [1 -4 -1]; і (1:n)>1виробляє вхідний вектор x = [0 1 1 ... 1].


3

DC , 25 22 байт

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

Спробуйте в Інтернеті!

Або збережіть програму у файлі та запустіть її, ввівши

dc -f *filename*

Програма приймає невід'ємне ціле число n на stdin, і вона виводить суму перших n парних чисел Фібоначчі на stdout. (Послідовність Фібоначчі прийнято починати з 0, згідно з прикладами ОП.)


Ця програма використовує формулу (F (3n-1) -1) / 2 для суми перших n парних чисел Фібоначчі, де F - звичайна функція Фібоначчі, задана F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) при n> = 2.


DC - калькулятор на основі стека. Ось детальне пояснення:

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.

У цей момент число (1 + sqrt (5)) / 2 знаходиться у верхній частині стека.

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.

У цій точці 3n-1 знаходиться у верхній частині стека (де n - вхід), а (1 + sqrt (5)) / 2 - другий зверху.

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

У цей момент число у верхній частині стека дорівнює (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5). Найближче ціле число до цього числа F (3n-1). Зауважте, що F (3n-1) - завжди непарне число.

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

Математика, 27 21 байт

Завдяки xnor за вказівку альтернативної формули, алефальфа для корекції вихідного індексу

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

1
Чи може (Fibonacci(3*n+2)-1)/2формула бути коротшою?
xnor

2

MATL , 15 14 байт

OOi:"t4*b+2+]x

Спробуйте в Інтернеті!

Пояснення

Тут використовується одна з формул рецидиву від OEIS:

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

Для введення N код повторює N разів, що в 2 рази більше, ніж потрібно. Це компенсується за рахунок установки 0, 0(замість того , щоб 0, 2) в якості початкових значень, а також шляхом видалення останнього отриманого значення і відображення попереднього.

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

Пакет, 80 байт

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

Використовується той факт, що кожне третє число Фібоначчі є парним, і просто обчислює їх три за один раз (обчислювати більше одного за часом насправді простіше, оскільки вам не доведеться міняти значеннями навколо). Я спробував (Fibonacci(3*n+2)-1)/2рецептуру, але насправді вона на кілька байт довше ( t+=виявляється досить ефективною щодо розміру коду).


2

C, 82 38 36 байт

2 байти збережено завдяки @BrainSteel

Формули на сторінці OEIS значно скоротили:

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

Спробуйте в Інтернеті!

82 байти:

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

Перша версія - 75 байт, але функцію не можна використовувати повторно, якщо ви не завжди дзвоните f з більшою, 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;}

Моя перша відповідь тут. Не перевірив жодної іншої відповіді, ані OEIS. Напевно, є кілька хитрощів, які я можу застосувати, щоб скоротити його :-)


1
Ви можете зробити це на кілька разів коротше, перемішуючи речі: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 байт)
BrainSteel

1

Хаскелл ( 32 31 байт)

Збережено один байт завдяки @ChristianSievers.

Використовуючи формулу, наведену в OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1автор Gary Detlefs

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


Графічний спосіб сказати n<=1для цілих чисел - це n<2. Крім того, другою умовою не повинно бути заперечення першого (ідіоматичне otherwiseпросто True), тому зазвичай в гольфі використовується щось подібне 1<2.
Крістіан Сіверс

@ChristianSievers справді n <2 - це очевидне поліпшення, дякую. Другий також працює, хоча в цьому випадку мене нічого не врятує. Я все ще навчаюсь Haskell і не розумів, що можу мати такого охоронця. Дякую!
Ділан Мейус

1

Математика, 32 27 байт

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

Кредит xnor . Збережено 5 байт завдяки JungHwan Min.


Звичайно, у Mathematica є Фібоначчі, і це коротше робити (Fibonacci(3*n+2) - 1)/2або писати суму?
xnor

@JungHwanMin Це не плагіат; він згадує сторінку OEIS. Крім того, це не є кандидатом на вікі спільноти. Дивіться, як слід користуватися вікі-файлами спільноти? .
Денніс

@devRichter Вибачте за те, що відмінили вашу посаду, але потрібно було вести бесіду. Якщо ви хочете залишити його видаленим, дайте мені знати, і я перенесу цю розмову в чат.
Денніс

@ Денніс все-таки, я вважаю, що заслуговує надати честь Винченцо Лібранді явно - (випадково видалив мій останній коментар ... міг би бути відмінений?) За пропозицією спільноти, я виправданий.
JungHwan Min

Що я мав на увазі, це згадати його ім’я в дописі ... (або, можливо, включити коментар Mathematica (* Vincenzo Librandi, Mar 15 2014 *)у дописі, як це є на OEIS.)
JungHwan Min

1

R, 42 байти

Нерекурсивне рішення, на відміну від попереднього рішення від @rtrunbull тут .

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

Використовує властивість, що кожне третє значення послідовності Фібоначчі є парним. Також зловживає тим фактом, який Fза замовчуванням визначається як FALSE=0, що дозволяє йому як основу додавати значення.


1

R, 42 41 байт

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

scan(): взяти nвід stdin.

scan():2-1: генерувати цілі числа від nдо 2, зменшення за 1, поступаючись n-1через 1.

3*(scan():2-1) : помножте на 3, оскільки число кожного третього поля є парним.

DescTools::Fibonacci(3*(scan():2-1)): Поверніть ці цифри рівнянь (тобто 3через (n-1)*3).

sum(DescTools::Fibonacci(3*(scan():2-1))) : Підсумуйте результат.

Раніше у мене було це нецікаве рішення, використовуючи одну з формул OEIS:

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

Мені вдалося зрівняти ваш рахунок без рекурсії :)
JAD

@JarkoDubbeldam Приємно! Я також
скинув

Приємно, що саме робить desctools::fibonacciцей numbers::fibonacciнахил? Тому що той туман буде трохи коротшим.
JAD

О, ніколи не знайшов, знайшов. Приємно, що в інших реалізаціях, які я знайшов, не підтримується запит декількох номерів одночасно.
JAD

1
@JarkoDubbeldam Так, `` gmp :: fibnum '' повертає об’єкти типу bigz, які *applyклас функцій перетворює на тип rawчерез причини ...
rturnbull


1

PHP, 73 70 байт

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

показ змінних змінних . O (n). Бігайте з -nr.

зламатися

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

Числа - цілком дійсні імена змінних у PHP.
Але для літералів вони потребують дужок; тобто ${0}не $0.

36 байт, O (1)

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

порт відповіді xnor


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.