Показники Фібоначчі


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?
Ніл

@Neil Я думаю, ти маєш рацію
Ентоні Фам

Це вище "a f (0) + ... + b f (b-a + 1)", це неправильно, наприклад для a = 1 і b = 2 було б 1 f (0) +2 f (2 ). Я думаю, було б 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

Пітон , 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:<+>). Команда WeverCode * + *приймає рівно два аргументи. ( &[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в оператор infix, наприклад a#b=sum....
німі

Розглядав інфікс як… b, але прочитав вимогу прийняти унар (ℤ, ℤ) → ℕ
Роман

Багато інших відповідей містять два окремі аргументи, тому я вважаю, що це добре.
німі

Alrightie вже, це виводить нас нарівні з лямбдою 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}

Нічого особливо розумного або оригінального тут не можна побачити. Вибачте.


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

0

Java 7, 96 байт

Гольф:

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

Безголівки:

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.