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


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% уверен, что есть лучшие способы сделать это, но, пожалуйста, вместо того, чтобы говорить мне «делай это», старайся только давать мне подсказки, чтобы я мог найти ответ сам и получить лучше. Благодарность!


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.






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.

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.



2

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

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

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



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-ое значение.




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

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


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



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


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