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

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 байт благодаря Мартину Эндеру.

ngenisis
источник
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)

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

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

FlipTack
источник
Почему -~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

Максима, 32 байта

f(a,b):=sum(x^fib(x-a+1),x,a,b);
rahnema1
источник
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))
rturnbull
источник
1

Желе , 13 байт

ạµ1+⁸С0
r*çS

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

Линн
источник
Здорово, единственный другой ответ, который я нашел, где ввод f(1,25)работ;). +1
Волшебная Урна Осьминога
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;
}
Peech
источник
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
JAD
источник
Использование анонимной функции вместо 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);}
Titus
источник
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)
RosLuP
источник
0

PowerShell , 67 байт

$e=1;$args[0]..$args[1]|%{$s+=("$_*"*$e+1|iex);$e,$f=($e+$f),$e};$s

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

Нашел немного лучший способ сделать последовательность, но powershell не сравнится с другими языками для этого :)

Синусоида
источник