Гольф на заказ последовательности Фибоначчи

25

Последовательность Фибоначчи довольно известна здесь. Черт, у него даже есть свой тег. Однако, несмотря на это, мы уверены, что хотим придерживаться наших корней 1, 1, ...(или это 0, 1, ...? Мы можем никогда не узнать ...). В этом испытании правила одинаковы, но вместо того, чтобы получить nэлемент th в последовательности Фибоначчи, вы получите nэлемент th в последовательности Фибоначчи, начиная с x, y, ....

вход

Три целых числа в любом порядке. nиндекс (0 или 1 проиндексированный) члена в последовательности для вашего вывода. xи yпервые два элемента в последовательности Фибоначчи вашего текущего прогона программы.

Выход

n- Й член последовательности Фибоначчи , начиная с x, y.

Тестовые случаи

(0-индексированные)

n   x     y     out
5   0     0     0
6   0     1     8
6   1     1     13
2   5     5     10
10  2     2     178
3   3     10    23
13  2308  4261  1325165
0   0     1     0
1   0     1     1

(1-индексированных)

n   x     y     out
6   0     0     0
7   0     1     8
7   1     1     13
3   5     5     10
11  2     2     178
4   3     10    23
14  2308  4261  1325165
1   0     1     0
2   0     1     1

Предостережения

Предположим 0 <= x <= y.

Обратите внимание на ваш порядок ввода (должен быть постоянным).

Стивен
источник
Можем ли мы взять список в качестве входных данных?
Бизнес кошка
@ BusinessCat ты имеешь в виду как [1, 2, 3]? Да. Все, что вам нужно принять 3 целых числа.
Стивен
@StephenS Как насчет того , вход в n,[x,y]котором nэто число и xи yэто номер в списке? Это, вероятно, слишком гибко;)
Том
1
@ CAD97 Я добавлю их, я забыл о них :)
Стивен

Ответы:

15

Желе , 3 байта

+¡ạ

Занимает х , у и n (с 0 индексами) в качестве отдельных аргументов командной строки в указанном порядке.

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

Как это работает

+¡ạ  Main link. Left argument: x. Right argument: y. Third argument: n

  ạ  Yield abs(x - y) = y - x, the (-1)-th value of the Lucas sequence.
+¡   Add the quicklink's left and right argument (initially x and y-x), replacing
     the right argument with the left one and the left argument with the result.
     Do this n times and return the final value of the left argument.
Деннис
источник
11

CJam , 14 9 байтов

l~{_@+}*;

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

Формат ввода - «xy n». Я все еще новичок в этом, поэтому я на 100% уверен, что есть лучшие способы сделать это, но, пожалуйста, вместо того, чтобы говорить мне «делай это», старайся только давать мне подсказки, чтобы я мог найти ответ сам и получить лучше. Благодарность!

FrodCube
источник
1
riririможно сократить до 2 байтов. fIможно сократить до 1 байта.
Деннис
6
Добро пожаловать в PPCG!
Мартин Эндер
@ Денис улучшился! Спасибо! И спасибо за прием.
FrodCube
9

JavaScript (ES6), 27 26 байт

Ничего особенного, только стандартная функция Фибоначчи JS с удаленными начальными значениями 0 и 1.

n=>g=(x,y)=>n--?g(y,x+y):x

Попытайся

f=
n=>g=(x,y)=>n--?g(y,x+y):x
o.value=f(i.value=13)(j.value=2308,k.value=4261)
oninput=_=>o.value=f(+i.value)(+j.value,+k.value)
*{font-family:sans-serif;}
input{margin:0 5px 0 0;width:50px;}
#o{width:75px;}
<label for=i>n: </label><input id=i type=number><label for=j>x: </label><input id=j type=number><label for=k>y: </label><input id=k type=number><label for=o>= </label><input id=o>

мохнатый
источник
6

Python 2, 40 байт

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

n,a,b=input()
exec'a,b=b,a+b;'*n
print a
Мертвый Опоссум
источник
Ха-ха, не подлежит ограничению рекурсии / стека в отличие от некоторых других ответов. Хороший трюк.
ShreevatsaR
@ShreevatsaR Спасибо! Но рекурсивная лямбда все равно меня побеждает: D
Мертвый опоссум
5

Haskell , 30 байт

x#y=(f!!)where f=x:scanl(+)y f

Попробуйте онлайн! 0 индексированные. Используйте как (x#y)n, например, (0#1)5для пятого элемента оригинальной последовательности.

Наиболее вероятный кратчайший способ получить последовательность Фибоначчи в Хаскеле - f=0:scanl(+)1fопределить бесконечный список, f=[0,1,1,2,3,5,8,...]содержащий последовательность. Замена 0и 1с аргументами xи yдает пользовательскую последовательность. (f!!)затем функция, возвращающая n-й элемент f.

Laikoni
источник
5

Mathematica, 36 байт

LinearRecurrence[{1,1},{##2},{#+1}]&

вход

[П, х, у]

J42161217
источник
1
Вы можете использовать ##2вместо #2,#3.
алефальфа
очень хорошо! исправлено!
J42161217
4

Brain-Flak , 38 байт

{({}[()]<(({}<>)<>{}<(<>{}<>)>)>)}{}{}

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

{({}[()]<                      >)}     # For n .. 0
         (({}<>)<>            )        # Copy TOS to the other stack and add it to...
                  {}                   # The second value
                    <(<>{}<>)>         # Copy what was TOS back
                                  {}{} # Pop the counter and the n+1th result
Райли
источник
4

Рубин, 27 байт

->a,b,n{n.times{b=a+a=b};a}
гигабайт
источник
3

Желе , 6 байт

;SḊµ¡I

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

объяснение

   µ¡  - repeat n times (computes the n+1th and n+2th element):
 S     -  take the sum of the elements of the previous iteration (starting at (x,y))
;      -  append to the end of the previous iteration
  Ḋ    -  remove the first element
     I - Take the difference of the n+1th and n+2th to get the n-th.
fireflame241
источник
3

TAESGL , 4 байта

ēB)Ė

1-индексированных

переводчик

объяснение

Вклад принимается как n,[x,y]

 ēB)Ė
AēB)     get implicit input "A" Fibonacci numbers where "B" is [x,y]
    Ė    pop the last item in the array
Том
источник
3

Пролог (SWI) , 77 байт

f(N,Y,Z):-M is N-1,f(M,X,Y),Z is X+Y.
l(N,A,B,X):-asserta(f(0,A,B)),f(N,X,_).

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

Начал играть в гольф ответ Лики Нун и пришел к чему-то совершенно другому.

У этого есть правило (Nᵗʰ, (N+1)ᵗʰ)с точки зрения ((N-1)ᵗʰ, Nᵗʰ)и использует управление базой данных Утверждать 0ᵗʰ и во время выполнения 1ˢᵗ элементов.

f(N,X,Y)значит Nᵗʰэлемент есть Xи (N+1)ᵗʰэлемент есть Y.

eush77
источник
2

Брайнгольф , 15 байт

VR<2-M[R!+v]R_;

_; больше не требуется в последней версии Braingolf, однако это примерно 5 минут назад, поэтому не будет конкурировать.

Skidsdev
источник
2

Python 2 , 112 байт

1-индексироваться.

import itertools
def f(x,y):
 while 1:yield x;x,y=y,x+y
def g(x,y,n):return next(itertools.islice(f(x,y),n-1,n))

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

totallyhuman
источник
Erp, слишком поздно и слишком большой.
полностью человек
2

MATL , 7 байт

:"wy+]x

Выход основан на 0.

Попробуйте это в MATL Online!

объяснение

Обозначим входные данные n(индекс) a, b(начальные условия).

:"     % Implicitly input n. Do this n times
       %   At this point in each iteration, the stack contains the two most
       %   recently computed terms of the sequence, say s, t. In the first
       %   iteration the stack is empty, but a, b will be implicitly input
       %   by the next statement
  w    %   Swap. The stack contains t, s
  y    %   Duplicate from below. The stack contains t, s, t
  +    %   Add. The stack contains t, s+t. These are now the new two most
       %   recently comnputed terms
]      % End
x      % Delete (we have computed one term too many). Implicitly display
Луис Мендо
источник
2

R, 39 байт

f=function(x,y,n)'if'(n,f(y,x+y,n-1),x)

Простая рекурсивная функция. Как ни странно, это короче, чем все, что я могу придумать для обычной последовательности Фибоначчи (без встроенных модулей), потому что это не должно присваивать 1обеим xиy = P

Вычисляет n+1номера последовательности, включая начальные значения. Каждая рекурсия рассчитывается с n-1и останавливается, когда n==0. Затем возвращается самое низкое из двух чисел, возвращая n-ое значение.

JAD
источник
2

PHP> = 7.1, 55 байт

for([,$n,$x,$y]=$argv;$n--;$x=$y,$y=$t)$t=$x+$y;echo$x;

Онлайн версия

PHP> = 7.1, 73 байта

for([,$n,$x,$y]=$argv,$r=[$x,$y];$i<$n;)$r[]=$r[+$i]+$r[++$i];echo$r[$n];

Онлайн версия

Йорг Хюльсерманн
источник
1
Пользуясь порядка оценки незнакомого РНР: $y=+$x+$x=$y. Кроме того, вы можете использовать только $n--вместо $i++<$n.
user63956
2

Common Lisp, 49 байт, 0 проиндексирован

(defun fib(n x y)(if(= 0 n)x(fib(1- n)y(+ x y))))

Я нуб Лисп, так что любые советы будут оценены;)

Объяснение:

(defun fib(n x y)                                  | Define a function taking 3 arguments
                 (if(= 0 n)x                       | If n = 0, return x
                            (fib(1- n)y(+ x y))))  | Otherwise, call fib with n-1, y, and x+y
Bolce Bussiere
источник
2

Пролог (SWI) , 85 байт

l(0,X,Y,X).
l(1,X,Y,Y).
l(N,X,Y,C):-M is N-1,P is N-2,l(M,X,Y,A),l(P,X,Y,B),C is A+B.

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

0 индексированные.

Дрянная Монахиня
источник
Не могли бы вы отредактировать этот ответ? Я, кажется, случайно понизил это в день, когда Вы отправили это.
Esolanging Fruit
@EsolangingFruit сделано
монахиня
2

ш ** nfuck, 39 29 байт

Спасибо @JoKing за -10!

,<,<,[>[>+>+<<-]<[>+<-]>-]>>.

TIO не будет работать особенно хорошо для этого (или для любого BF решения проблемы, связанной с числами). Я настоятельно рекомендую @ EsotericIDE Тимви (или реализуем BF самостоятельно).

Берет x, тогдаy потом тоn . 0 индексированные. Предполагается неограниченная или упаковочная лента.

объяснение

,<,<,            Take inputs. Tape: [n, y, x]
[                While n:
  > [->+>+<<]      Add y to x, copying it to the next cell along as well. Tape: [n, 0, x+y, y]
  < [>+<-]         Move n over. Tape: [0, n, x+y, y]
  >-               Decrement n.
] >>.            End loop. Print cell 2 to the right (x for n == 0).
Хулдрасет на'Барья
источник
Почему вы беспокоитесь о перемещении х и у, когда вы можете просто переместить n? Попробуйте онлайн
Джо Кинг,
@JoKing Рассматривал это (но дольше в одиночку), но это не совсем работает, если OP не разрешает " -1-индексирование".
Хулдраесет на'Барья
О, просто добавь >в конец или поменяй порядок х и у
Джо Кинг,
@JoKing Моя ладонь сильно ударила меня по лицу прямо сейчас. Благодарность!
Хулдраесет на'Барья
Почему вы пытались подвергнуть цензуре «мозг», а не второе слово в названии языка программирования?
MilkyWay90
2

C (gcc) , 29 байт

f(n,x,y){n=n?f(n-1,y,x+y):x;}

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

Эта реализация основана на 0.

PikalaxALT
источник
Приятно и добро пожаловать! Вот более хорошая настройка TIO для тестирования, если вы решите ее использовать.
Khuldraeseth na'Barya
1

05AB1E , 9 байтов

`©GDŠ+}®@

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

объяснение

`           # split inputs as separate to stack
 ©          # store n in register
  G         # n-1 times do
   D        # duplicate top of stack
    Š       # move down 2 places on stack
     +      # add top 2 values of stack
      }     # end loop
       ®@   # get the value nth value from the bottom of stack
Emigna
источник
1

Кляйн , 18 + 3 байта

Это использует 000топологию

:?\(:(+)$)1-+
((/@

Передайте ввод в форме x y n.

Мастер пшеницы
источник
1

Аксиома, 88 57 байт

f(k,x,y)==(repeat(k<=0=>break;c:=y;y:=x+y;x:=c;k:=k-1);x)

это пройдет предложенный тест (0 проиндексировано)

(14) -> f(5,0,0)
   (14)  0
                                                 Type: NonNegativeInteger
(15) -> f(6,0,1)
   (15)  8
                                                    Type: PositiveInteger
(16) -> f(2,5,5)
   (16)  10
                                                    Type: PositiveInteger
(17) -> f(10,2,2)
   (17)  178
                                                    Type: PositiveInteger
(18) -> f(3,3,10)
   (18)  23
                                                    Type: PositiveInteger
(19) -> f(13,2308,4261)
   (19)  1325165
                                                    Type: PositiveInteger
RosLuP
источник
1

TI-Basic, 32 байта

Prompt N,X,Y
While N
X+Y➡Z
Y➡X
Z➡Y
DS<(N,0
End
X
pizzapants184
источник