Golf eine benutzerdefinierte Fibonacci-Sequenz


25

Die Fibonacci-Sequenz ist hier ziemlich bekannt. Verdammt, es hat sogar einen eigenen Tag. Trotzdem bleiben wir gerne bei unseren Wurzeln 1, 1, ...(oder ist es das 0, 1, ...? Wir werden es vielleicht nie erfahren ...). In dieser Herausforderung sind die Regeln gleich, aber anstatt das nth-Element in der Fibonacci-Sequenz zu erhalten, erhalten Sie das nth-Element in der Fibonacci-esque-Sequenz, beginnend mit x, y, ....

Eingang

Drei ganze Zahlen in beliebiger Reihenfolge. nist der Index (0 oder 1 indiziert) des Terms in der Sequenz für Ihre Ausgabe. xund ysind die ersten beiden Elemente in der Fibonacci-Sequenz Ihres aktuellen Programmlaufs.

Ausgabe

Das nte Glied in der Fibonacci - Folge , beginnend mit x, y.

Testfälle

(0-indiziert)

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

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

Vorbehalte

Annehmen 0 <= x <= y .

Bitte beachten Sie Ihre Eingabereihenfolge (muss konstant sein).


Können wir eine Liste als Eingabe nehmen?
Business Cat

@BusinessCat meinst du gerne [1, 2, 3]? Ja. Was auch immer Sie brauchen, um 3 ganze Zahlen zu akzeptieren.
Stephen

@StephenS Wie wäre es mit einer Eingabe als n,[x,y]Wo nist eine Zahl und xund ysind Zahlen in einer Liste? Das ist aber wahrscheinlich ein bisschen zu flexibel;)
Tom

1
@ CAD97 Ich werde sie hinzufügen, ich hatte sie vergessen :)
Stephen

Antworten:


15

Gelee , 3 Bytes

+¡ạ

Nimmt x , y und n (0-indiziert) als separate Befehlszeilenargumente in dieser Reihenfolge.

Probieren Sie es online!

Wie es funktioniert

+¡ạ  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~{_@+}*;

Probieren Sie es online!

Das Eingabeformat ist "xy n". Ich bin immer noch ein Neuling, daher bin ich mir zu 100% sicher, dass es bessere Möglichkeiten gibt, dies zu tun. Aber bitte, anstatt mir zu sagen, dass ich dies tue, versuche nur, mir Hinweise zu geben, damit ich die Antwort selbst finden und bekommen kann besser. Vielen Dank!


1
riririkann auf 2 Bytes gekürzt werden. fIkann auf 1 Byte gekürzt werden.
Dennis

6
Willkommen bei PPCG!
Martin Ender

@ Tennis verbessert! Vielen Dank! Und danke für die Begrüßung.
FrodCube


9

JavaScript (ES6), 27 bis 26 Byte

Nichts Besonderes hier, nur eine Standard-JS-Fibonacci-Funktion, bei der die Anfangswerte von 0 und 1 entfernt wurden.

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

Versuch es

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

Probieren Sie es online! 0-indiziert. Verwenden Sie als (x#y)nzB (0#1)5für das fünfte Element der Originalsequenz.

Der wahrscheinlich kürzeste Weg, um die Fibonacci-Sequenz in Haskell zu erhalten, ist f=0:scanl(+)1f, eine unendliche Liste zu definieren, f=[0,1,1,2,3,5,8,...]die die Sequenz enthält. Ersetzen 0und 1mit Argumenten xund yergibt die benutzerdefinierte Sequenz. (f!!)ist dann eine Funktion, die das n-te Element von zurückgibt f.




4

Brain-Flak , 38 Bytes

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

Probieren Sie es online!

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

Ruby, 27 Bytes

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

3

Gelee , 6 Bytes

;SḊµ¡I

Probieren Sie es online!

Erläuterung

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

Dolmetscher

Erläuterung

Eingabe übernommen als 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

Prolog (SWI) , 77 Bytes

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

Probieren Sie es online!

Begann mit dem Golfen von Leaky Nuns Antwort und kam zu etwas völlig anderem.

Dieser hat eine Regel (Nᵗʰ, (N+1)ᵗʰ)in Bezug auf ((N-1)ᵗʰ, Nᵗʰ)und verwendet die Datenbankverwaltung , um 0ᵗʰ- und 1ˢᵗ-Elemente zur Laufzeit zu aktivieren.

f(N,X,Y)bedeutet NᵗʰElement ist Xund (N+1)ᵗʰElement ist Y.



2

Braingolf , 15 Bytes

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

_; wird für die neueste Version von Braingolf nicht mehr benötigt, allerdings ist das ab ~ 5 Minuten her, wäre also nicht konkurrierend.



2

MATL , 7 Bytes

:"wy+]x

Die Ausgabe erfolgt auf 0-Basis.

Probieren Sie es bei MATL Online!

Erläuterung

Lassen Sie die Eingänge bezeichnet werden n(Index), a, b(Grundmietzeit).

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

Eine einfache rekursive Funktion. Komischerweise ist dies kürzer als alles, was ich mir für die reguläre Fibonacci-Sequenz (ohne eingebaute Funktionen) vorstellen kann, da dies nicht 1beiden xund y= P zugewiesen werden muss

Berechnet n+1die Folgenummern einschließlich der Anfangswerte. Jede Rekursion wird mit berechnet n-1und gestoppt, wenn n==0. Die niedrigste der beiden Zahlen wird dann zurückgegeben und gibt den n-ten Wert zurück.



2

PHP> = 7.1, 55 Bytes

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

Online Version

PHP> = 7.1, 73 Bytes

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

Online Version


1
Unter Ausnutzung fremder Auswerteauftrag PHP: $y=+$x+$x=$y. Sie können auch nur $n--anstelle von verwenden $i++<$n.
user63956

2

Common Lisp, 49 Bytes, 0-indiziert

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

Ich bin ein Lisp Noob, also wäre jeder Tipp dankbar;)

Erläuterung:

(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

Danke an @JoKing für -10!

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

TIO eignet sich nicht besonders gut dafür (oder für eine BF-Lösung für ein Problem mit Zahlen). Ich empfehle dringend @ Timwi's EsotericIDE (oder die Implementierung von BF selbst).

Nimmt xdann ydannn . 0-indiziert. Nimmt ein ungebundenes oder umwickeltes Band an.

Erläuterung

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

Warum bewegst du x und y, wenn du nur n bewegen kannst? Online
Jo King

@JoKing Berücksichtigt das (aber länger alleine), aber es funktioniert nicht ganz, es sei denn, OP erlaubt " -1-indexing".
Khuldraeseth na'Barya

Oh, fügen Sie einfach ein >am Ende oder tauschen Sie x und y Reihenfolge
Jo King

@JoKing Meine Handfläche traf mich gerade ziemlich hart. Vielen Dank!
Khuldraeseth na'Barya

Warum haben Sie sich die Mühe gemacht, "Gehirn" zu zensieren, aber nicht das zweite Wort im Namen der Programmiersprache?
MilkyWay90


1

05AB1E , 9 Bytes

`©GDŠ+}®@

Probieren Sie es online!

Erläuterung

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

Axiom, 88 57 Bytes

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

dies würde den vorgeschlagenen Test bestehen (0 indiziert)

(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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.