Экспоненты Фибоначчи


11

Для этого задания вы должны вывести результат суммы некоторых чисел. Что это за цифры? Итак, вам даны входные данные, ( a, b), которые являются целыми числами (положительными, отрицательными или нулевыми) a != b, и a < b, и каждое целое число в пределах aи b(включая их) будет иметь показатели степени в соответствии с числами Фибоначчи. Это сбивает с толку, вот пример:

Input: (-2, 2)
Output: -2**1 + (-1**1) + 0**2 + 1**3 + 2**5 =
          -2  +    -1   +   0  +   1  +   32 = 30

Учитывая, что первое число Фибоначчи представлено f(0)формулой:

a**f(0) + ... + b**f(b-a+1) 

Ввод, обработка, вывод

Чтобы прояснить вышесказанное, вот несколько тестов, обработка ввода и ожидаемые результаты:

Input: (1, 2)
Processing: 1**1 + 2**1
Output: 3

Input: (4, 8)
Processing: 4**1 + 5**1 + 6**2 + 7**3 + 8**5
Output: 33156

Input: (-1, 2)
Processing: -1**1 + 0**1 + 1**2 + 2**3
Output: 8

Input: (-4, -1)
Processing: -4**1 + -3**1 + -2**2 + -1**3
Output: -4

правила

  • Стандартные лазейки не допускаются

  • Экспоненты должны быть в порядке согласно серии Фибоначчи

  • Код должен работать для вышеуказанных тестов

  • Только результат должен быть возвращен

Критерии победы

Самый короткий код выигрывает!


Так 0не входит ли здесь число Фибоначчи?
FlipTack

0 не является числом Фибоначчи, но является правильным выбором для ввода
Энтони Фам

6
33165 или 33156?
Нил

@ Нил Я думаю, что ты прав
Энтони Фам

Это выше "a f (0) + ... + b f (b-a + 1)", это неправильно, например, для a = 1 и b = 2 это будет 1 f (0) +2 f (2). ). Я думаю, будет a f (0) + ... + b f (ba); здесь f (0) = 0, а не 1
RosLuP

Ответы:


2

05AB1E , 9 байт

ŸDg!ÅFsmO

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

Ÿ         # Push [a, ..., b].
 Dg!      # Calculate ([a..b].length())! because factorial grows faster than fibbonacci...
    ÅF    # Get Fibonacci numbers up to FACTORIAL([a..b].length()).
      s   # Swap the arguments because the fibb numbers will be longer.
       m  # Vectorized exponentiation, dropping extra numbers of Fibonacci sequence.
        O # Sum.

Не работает на TIO для больших расхождений между aи b(EG [a..b].length() > 25).

Но это, кажется, работает для больших чисел, чем средний ответ здесь.

Неэффективно, потому что он вычисляет последовательность Фибоначчи до n!, что больше, чем необходимо для вычисления ответа, где nдлина последовательности a..b.


5

Mathematica, 38 байт 37 байт 31 байт

Sum[x^Fibonacci[x-#+1],{x,##}]&

Это просто ответ rahnema1, перенесенный на Mathematica. Ниже мое оригинальное решение:

Tr[Range@##^Fibonacci@Range[#2-#+1]]&

Объяснение:

##представляет последовательность всех аргументов, #представляет первый аргумент, #2представляет второй аргумент. При вызове с двумя аргументами aи b, Range[##]выдаст список {a, a+1, ..., b}и Range[#2-#+1]выдаст список одинаковой длины {1, 2, ..., b-a+1}. Так Fibonacciкак Listable, Fibonacci@Range[#2-#+1]даст список первых b-a+1чисел Фибоначчи. Так Powerкак Listable, вызов его в двух списках одинаковой длины приведет к его наложению на списки. Затем Trберет сумму.

Редактировать: 1 байт благодаря Мартину Эндеру.


3
Вы можете использовать Range@##.
Мартин Эндер

1
Не актуально сейчас, но оригинальный подход может быть улучшен на 3 байта Tr[(r=Range@##)^Fibonacci[r-#+1]]&.
Грег Мартин

Использование Rangeдважды должно было быть красным флагом. Благодаря!
ngenisis

5

Python , 49 байт

Рекурсивная лямбда, которая принимает aи в bкачестве отдельных аргументов (вы также можете установить первые два числа Фибоначчи, xи y, что вы хотите - не преднамеренно, но хорошая функция):

f=lambda a,b,x=1,y=1:a<=b and a**x+f(a+1,b,y,x+y)

Попробуйте онлайн! (включает тестовый набор)

Предложения по игре в гольф приветствуются.


Почему -~aи не просто a+1? Я думаю, -~aэто зависит от машины.
Тит

4

Perl 6 , 32 30 байт

{sum $^a..$^b Z**(1,&[+]...*)}

$^aи $^bявляются двумя аргументами функции; $^a..$^bэто диапазон чисел от $^aдо $^b, что молнии с экспоненциации путем Z**с последовательностью Фибоначчи, 1, &[+] ... *.

Спасибо Брэду Гилберту за то, что он сбрил два байта.


(1,&[+]...*)на один байт короче, а пробел после Z**не нужен.
Брэд Гилберт b2gills

@ BradGilbertb2gills Круто, я понятия не имел, что последовательность Фибоначчи может быть выражена таким образом.
Шон

На самом деле это работает, потому что &infix:<+>может принимать 0,1 или 2 аргумента. ( &[+]это короткий способ написания &infix:<+>). WhwhatCode * + *принимает ровно 2 аргумента. ( &[0]() == 0так что вы должны иметь 1там, чтобы начать последовательность)
Брэд Гилберт b2gills



3

JavaScript (ES7), 42 байта

f=(a,b,x=1,y=1)=>a<=b&&a**x+f(a+1,b,y,x+y)

Прямой порт превосходного ответа Python от @ FlipTack.


Хороший, оказался еще короче в JavaScript! :)
FlipTack

3

Haskell, 35 байт

f=scanl(+)1(0:f);(?)=sum.zipWith(^)

Использование:

$ ghc fibexps.hs -e '[4..8]?f'
33156

Вы можете превратить функцию oв инфиксный оператор, например a#b=sum....
Ними

Рассматривал инфикс как a… b, но прочитал требование принять унарный (ℤ, ℤ) → ℕ
Роман Чиборра

Многие другие ответы принимают два отдельных аргумента, так что я думаю, что все в порядке.
Ними

Уже хорошо, что приводит нас в соответствие с лямбда-кодом ECMAscript7. Но если нам разрешат кормить , (a,b)как a?bто почему бы нам не позволили подготовить его как немедленным [a..b]?fна (?)=sum.zipWith(^)?
Роман Чиборра

Я думаю, что это заходит слишком далеко. Входные данные представляют собой два числа (необязательно в виде пары, подойдут два отдельных аргумента), но вы передаете список чисел и функцию в свою основную функцию.
Ними

2

MATL , 23 байта

&:ll&Gw-XJq:"yy+]JQ$h^s

Попробуйте онлайн! Или проверьте все тестовые случаи .

&:      % Binary range between the two implicit inputs: [a a+1 ... b] 
ll      % Push 1, 1. These are the first two Fibonacci numbers
&G      % Push a, b again
w-      % Swap, subtract: gives b-a
XJ      % Copy to cilipboard J
q:      % Array [1 2 ... b-a-1]
"       % For each (repeat b-a-1 times)
  yy    %    Duplicate the top two numbers in the stack
  +     %    Add
]       % End
J       % Push b-a
Q       % Add 1: gives b-a+1
$       % Specify that the next function takes b-a+1 inputs
h       % Concatenate that many elements (Fibonacci numbers) into a row vector
^       % Power, element-wise: each entry in [a a+1 ... b] is raised to the
        % corresponding Fibonacci number
s       % Sum of array. Implicitly display

1

R, 51 байт

Анонимная функция.

function(a,b)sum((a:b)^numbers::fibonacci(b-a+1,T))


0

Рубин, 46 байт

->a,b{n=s=0;m=1;a.upto(b){|x|s+=x**n=m+m=n};s}

Ничего особенно умного или оригинального, чтобы увидеть здесь. Сожалею.


Для меня, не говорящего о Ruby, этот ℤ.upto(ℤ)метод является хорошим напоминанием о красоте поведения всех объектов в Ruby. Дальнейшая игра в гольф оставлена ​​в качестве упражнения для носителей языка Ruby. Вы уже отсканировали codegolf.stackexchange.com/questions/363/… еще?
Роман Чиборра

0

Java 7, 96 байт

Golfed:

int n(int a, int b){int x=1,y=1,z=0,s=0;while(a<=b){s+=Math.pow(a++,x);z=x+y;x=y;y=z;}return s;}

Ungolfed:

int n(int a, int b)
{
    int x = 1, y = 1, z = 0, s = 0;
    while (a <= b)
    {
        s += Math.pow(a++, x);
        z = x + y;
        x = y;
        y = z;
    }

    return s;
}

0

R, 57 байт

x=scan();sum((x[1]:x[2])^numbers::fibonacci(diff(x)+1,T))

Довольно просто. gmp::fibnumэто более короткая встроенная функция, но она не поддерживает возврат всей последовательности до n, что numbers::fibonacciпроисходит путем добавления аргумента T.

Сначала у меня было более хитрое решение, gmp::fibnumкоторое оказалось на 2 байта длиннее, чем это решение.

x=scan();for(i in x[1]:x[2])F=F+i^gmp::fibnum((T<-T+1)-1);F

Использование анонимной функции вместо scan()сохранения 6 байт; см. мое опубликованное решение.
rturnbull

Ах да, глупо с моей стороны.
JAD

0

постоянный ток , 56 байт

?sf?sa0dsbsg1sc[lblcdlfrdsb^lg+sg+sclf1+dsfla!<d]dsdxlgp

Заканчивается для ввода [1,30]в течение 51 секунды. Принимает два ввода в две отдельные строки после выполнения и отрицательные числа с начальным подчеркиванием ( _) вместо тире (т.е. -4будет вводиться как _4).


0

PHP, 77 75 байт

for($b=$argv[$$x=1];$b<=$argv[2];${$x=!$x}=${""}+${1})$s+=$b++**$$x;echo$s;

берет границы из аргументов командной строки. Беги с -nr. снова
показывать переменные PHP (и то, что я узнал о них) .

сломать

for($b=$argv[$$x=0}=1]; # $"" to 1st Fibonacci and base to 1st argument
    $b<=$argv[2];           # loop $b up to argument2 inclusive
    ${$x=!$x}                   # 5. toggle $x,             6. store to $1/$""
        =${""}+${1}             # 4. compute next Fibonacci number
)
    $s+=$b++**                  # 2. add exponential to sum,    3. post-increment base
        $$x;                    # 1. take current Fibonacci from $""/$1 as exponent
echo$s;                     # print result

Ответ FlipTack, портированный на PHP, имеет 70 байтов:

function f($a,$b,$x=1,$y=1){return$a>$b?0:$a**$x+f($a+1,$b,$y,$x+$y);}

0

Аксиома, 65 байт

f(a,b)==reduce(+,[i^fibonacci(j)for i in a..b for j in 1..b-a+1])

код теста и результаты

(74) -> f(1,2)
   (74)  3
                                                   Type: Fraction Integer
(75) -> f(4,8)
   (75)  33156
                                                   Type: Fraction Integer
(76) -> f(-1,2)
   (76)  8
                                                   Type: Fraction Integer
(77) -> f(-4,-1)
   (77)  - 4
                                                   Type: Fraction Integer
(78) -> f(3,1)
   >> Error detected within library code:
   reducing over an empty list needs the 3 argument form
    protected-symbol-warn called with (NIL)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.