Golf una secuencia de Fibonacci personalizada


25

La secuencia de Fibonacci es una cosa bastante conocida por aquí. Diablos, incluso tiene su propia etiqueta. Sin embargo, por todo eso, seguro que nos gusta mantenernos en nuestras raíces 1, 1, ...(¿o no 0, 1, ...? Puede que nunca lo sepamos ...). En este desafío, las reglas son las mismas, pero en lugar de obtener el nelemento th en la secuencia de Fibonacci, comenzará con el nelemento th en la secuencia de estilo Fibonacci x, y, ....

Entrada

Tres enteros, en el orden que quieras. nes el índice (0 o 1 indexado) del término en la secuencia para su salida. xy yson los dos primeros elementos en la secuencia de Fibonacci de la ejecución de su programa actual.

Salida

El nésimo término de la sucesión de Fibonacci comenzando con x, y.

Casos de prueba

(0 indexado)

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 indexado)

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

Advertencias

Asumir 0 <= x <= y.

Tenga en cuenta su orden de entrada (debe ser constante).


¿Podemos tomar una lista como entrada?
Business Cat

@BusinessCat quieres decir como [1, 2, 3]? Sí. Lo que sea necesario para aceptar 3 enteros.
Stephen

@StephenS ¿Qué hay de tomar una entrada como n,[x,y]cuando nes un número y xe yson números en una lista? Sin embargo, probablemente sea demasiado flexible;)
Tom

1
@ CAD97 Los agregaré, me había olvidado de ellos :)
Stephen

Respuestas:


15

Jalea , 3 bytes

+¡ạ

Toma x , y , yn (indexados a 0) como argumentos separados de la línea de comandos, en ese orden.

Pruébalo en línea!

Cómo funciona

+¡ạ  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 bytes

l~{_@+}*;

Pruébalo en línea!

El formato de entrada es "xy n". Todavía soy un novato en esto, así que estoy 100% seguro de que hay mejores formas de hacerlo, pero por favor, en lugar de decirme "haz esto", trata de darme pistas para que pueda encontrar la respuesta yo mismo y obtener mejor. ¡Gracias!


1
riririse puede acortar a 2 bytes. fIse puede acortar a 1 byte.
Dennis

66
Bienvenido a PPCG!
Martin Ender

@Dennis mejorado! ¡Gracias! Y gracias por la bienvenida.
FrodCube


9

JavaScript (ES6), 27 26 bytes

No hay nada lujoso aquí, solo una función estándar de JS Fibonacci con los valores iniciales de 0 y 1 eliminados.

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

Intentalo

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>



5

Haskell , 30 bytes

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

Pruébalo en línea! 0 indexado. Use como (x#y)n, por ejemplo, (0#1)5para el quinto elemento de la secuencia original.

La forma más corta más probable de obtener la secuencia de Fibonacci en Haskell es f=0:scanl(+)1f, que define una lista infinita que f=[0,1,1,2,3,5,8,...]contiene la secuencia. Reemplazar 0y 1con argumentos xy yproduce la secuencia personalizada. (f!!)es entonces una función que devuelve el enésimo elemento de f.




4

Brain-Flak , 38 bytes

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

Pruébalo en línea!

{({}[()]<                      >)}     # 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

Rubí, 27 bytes

->a,b,n{n.times{b=a+a=b};a}

3

Jalea , 6 bytes

;SḊµ¡I

Pruébalo en línea!

Explicación

   µ¡  - 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 bytes

ēB)Ė

1 indexado

Interprete

Explicación

Entrada tomada como n,[x,y]

 ēB)Ė
AēB)     get implicit input "A" Fibonacci numbers where "B" is [x,y]
    Ė    pop the last item in the array



2

Braingolf , 15 bytes

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

_; ya no es necesario en la última versión de Braingolf, sin embargo, eso fue hace unos 5 minutos, por lo que no competiría.



2

MATL , 7 bytes

:"wy+]x

La salida está basada en 0.

¡Pruébalo en MATL Online!

Explicación

Dejar que el denotarán entradas n(índice), a, b(condiciones iniciales).

:"     % 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 bytes

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

Una simple función recursiva. Curiosamente, esto es más corto que cualquier cosa que se me ocurra para la secuencia regular de Fibonacci (sin elementos integrados), porque esto no tiene que asignarse 1a ambos xy y= P

Calcula los n+1números de la secuencia, incluidos los valores iniciales. Cada recursión se calcula con n-1y se detiene cuando n==0. Luego se devuelve el menor de los dos números, devolviendo el nvalor -th.



2

PHP> = 7.1, 55 bytes

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

Versión en línea

PHP> = 7.1, 73 bytes

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

Versión en línea


1
Aprovechando orden de evaluación extraña de PHP: $y=+$x+$x=$y. Además, puede usar solo en $n--lugar de $i++<$n.
user63956

2

Lisp común, 49 bytes, indexado 0

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

Soy un novato de Lisp, por lo que cualquier consejo sería apreciado;)

Explicación:

(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

br ** nfuck, 39 29 bytes

¡Gracias a @JoKing por -10!

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

TIO no funcionará particularmente bien para esto (o para cualquier solución BF a un problema que involucra números). Recomiendo encarecidamente EsotericIDE de @ Timwi (o implementar BF usted mismo).

Toma x, entonces y, entonces n. 0 indexado. Asume una cinta sin límites o envolvente.

Explicación

,<,<,            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).

¿Por qué te molestas en mover x e y cuando puedes mover n? Pruébelo en línea
Jo King

@JoKing lo consideró (pero más tiempo por mi cuenta), pero no funciona del todo, a menos que OP permita la " -1indexación".
Khuldraeseth na'Barya

Oh, solo agregue una >al final o cambie la orden x e y
Jo King

@JoKing Mi palma golpeó mi cara con bastante fuerza en este momento. ¡Gracias!
Khuldraeseth na'Barya

¿Por qué te molestaste en censurar "cerebro" pero no la segunda palabra en el nombre del lenguaje de programación?
MilkyWay90


1

05AB1E , 9 bytes

`©GDŠ+}®@

Pruébalo en línea!

Explicación

`           # 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

Axioma, 88 57 bytes

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

esto pasaría la prueba propuesta (0 indexado)

(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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.