Сумма первых и четных чисел Фибоначчи

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

Связанный

dfernan
источник
@EasterlyIrk Тестовые случаи подразумевают последнее, но это должно быть явно указано.
Mego
@ Да, я тоже так понял.
17
9
Пожалуйста, не принимайте ответы так быстро. Прошел только час, может прийти ответ от гольфиста . РЕДАКТИРОВАТЬ: Я вижу, что уже есть более короткий ответ, который еще не принят.
Rɪᴋᴇʀ
6
Обычно принято ждать как минимум неделю, прежде чем принять ответ, потому что многие люди воспринимают его как признак того, что задача больше не активна.
Згарб

Ответы:

8

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

1 байт сохранен благодаря @ETHProductions и еще 2 сохранены благодаря @ Adnan!

zc»+U

Попробуйте онлайн!

Объяснение:

При этом используется та же формула повторения, что и в моем ответе на MATL.

Луис Мендо
источник
1
Оазис info.txt говорит, Uчто в коде заменяется 00, может ли это сэкономить вам байт?
ETHproductions
@ETHproductions Спасибо! Я забыл это
Луис Мендо
1
Ницца! Вы можете заменить 4*на zи 2+с »:)
Аднан
@ Adnan Спасибо! Я действительно должен прочитать документ :-)
Луис Мендо
17

Python, 33 байта

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

Попробуйте онлайн

Волшебная формула!

XNOR
источник
3
О Боже. У меня ушло гораздо больше времени, чем нужно было понять, почему вы «комментировали» эти 20 во второй строке: P
Тео
@xnor, есть ссылки на эту волшебную формулу?
Четвёртое
@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
Mego
источник
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

(но сдвинут на единицу, потому что вызов сдвигает на единицу)

ETHproductions
источник
4

Perl 6 ,  38 35  32 байта

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

Попытайся

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

Попытайся

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

Попытайся

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

}
Брэд Гилберт b2gills
источник
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

постоянный ток , 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

Mathematica, 27 21 байт

Спасибо xnor за указание на альтернативную формулу, alephalpha за исправление для начального индекса

Fibonacci[3#-1]/2-.5&
ngenisis
источник
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

С 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

Haskell ( 32 31 байт)

Сохранено один байт благодаря @ChristianSievers.

Используя формулу, приведенную в OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1Гэри Детлефс

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 - очевидное улучшение, спасибо. Второй тоже работает, хотя в этом случае меня ничего не спасает. Я все еще изучаю Хаскель и не понимаю, что у меня может быть такая охрана. Спасибо!
Дилан Мееус
1

Mathematica, 32 27 байт

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

Кредит XNOR . Сохранено 5 байтов благодаря JungHwan Мин.

devRicher
источник
Конечно, у Mathematica есть Фибоначчи, и короче, чтобы (Fibonacci(3*n+2) - 1)/2написать или записать суми?
xnor
@JungHwanMin Это не плагиат; упоминается страница OEIS. Кроме того, это не кандидат на вики сообщества. См. Как использовать вики сообщества? ,
Деннис
@devRichter Извините за удаление вашего сообщения, но нужно было поговорить. Если вы хотите, чтобы он был удален, дайте мне знать, и я перенесу этот разговор в чат.
Деннис
@ Денис, тем не менее, я считаю, что следует отдать должное Винченцо Либранди в явном виде - (случайно удалил мой последний комментарий ... это может быть удалено?) Что касается предложения о публикации в сообществе, я исправляюсь.
JungHwan Мин
Я имел в виду упоминание его имени в посте ... (или, возможно, включение комментария Mathematica (* Vincenzo Librandi, Mar 15 2014 *)в пост, как это делается в OEIS.)
JungHwan Мин
1

R, 42 байта

Нерекурсивное решение, в отличие от более раннего решения @rtrunbull здесь .

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

Использует свойство, которое каждое третье значение последовательности Фибоначчи является четным. Также злоупотребляет тем, что Fпо умолчанию определено как FALSE=0, что позволяет ему добавлять значения в качестве основы.

JAD
источник
1

R 42 42 байта

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

scan(): взять nиз стандартного

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)
rturnbull
источник
Мне удалось сопоставить ваш byountount без рекурсии :)
JAD
@JarkoDubbeldam Отлично! Я также отказался от рекурсии и сделал однобайтовое улучшение :)
rturnbull
Хорошо, что именно делает 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;

демонстрация переменных переменных . На). Беги с -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

Titus
источник
0

PARI / GP, 21 байт

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

\ является целочисленным частным.

alephalpha
источник