Bin ich eine spezielle N-Bonacci-Nummer?

11

Die N-Bonacci-Sequenz, die ursprünglich von @DJMcMayhem in dieser Frage erfunden wurde , ist eine Sequenz, die erzeugt wird, indem mit den ganzen Zahlen 0 und 1 begonnen und dann die vorherigen N-Zahlen addiert werden, um die nächste Zahl zu erzeugen. Die spezielle N-Bonacci-Sequenz ist eine N-Bonacci-Sequenz, die mit einem anderen Zahlenpaar als 0 und 1 beginnt und als X und Y bezeichnet wird. Wenn N größer als die Anzahl der bereits in der Sequenz enthaltenen Terme ist, fügen Sie einfach alle verfügbaren hinzu Begriffe.

So hat beispielsweise die normale Fibonacci-Sequenz ein N von 2 (nimmt die beiden vorherigen Elemente) und ein X und Y von 0 und 1 oder 1 und 1, je nachdem, wen Sie fragen.

Deine Aufgabe:

Sie müssen ein Programm oder eine Funktion schreiben, die prüft, ob eine eingegebene Ganzzahl (A) Teil der speziellen N-Bonacci-Sequenz ist, die von den nächsten drei Ganzzahlen erzeugt wird (wobei die zweite Eingabe als N und die dritte und vierte als X und Y verwendet wird). . Stellen Sie sicher, dass Sie den Sonderfall N = 1 behandeln.

Eingang:

Vier nicht negative ganze Zahlen, A, N, X und Y.

Ausgabe:

Ein Wahrheits- / Falschwert, der angibt, ob A Teil der N-Bonacci-Sequenz ist, die durch die Eingänge N, X und Y erzeugt wird.

Testfälle:

Input:    Output:
13,2,0,1->truthy
12,3,1,4->falsy
4,5,0,1-->truthy
8,1,8,9-->truthy
9,1,8,9-->truthy

12,5,0,1->falsy  [0,1]>[0,1,1]>[0,1,1,2]>[0,1,1,2,4]>[0,1,1,2,4,8]>[0,1,1,2,4,8,16]>etc.  

Wertung:

Dies ist , also gewinnt die niedrigste Punktzahl in Bytes.

Greif
quelle
1
N==1ist so ein komischer Fall.
Magic Octopus Urn
Ja, aber seltsame Fälle machen diesen Spaß :)
Gryphon
Wenn Sie in der Tat Antworten wünschen, um den Fall zu behandeln N=1, möchten Sie dies möglicherweise in der Frage angeben, da viele Antworten (einschließlich aller aktuellen Antworten, glaube ich) eine Fehlerbedingung aufweisen, die eine streng zunehmende Reihe voraussetzt. Kann Xund Ykann auch negativ sein? Das wird wahrscheinlich auch alle vorhandenen Antworten ungültig machen.
Apsiller
1
Ich denke, alle vorhandenen Antworten können den nicht zunehmenden Fall, in dem sowohl X als auch Y Null sind, nicht behandeln. Ist es notwendig, auch diesen Fall zu behandeln?
Apsiller
1
Ich denke, Sie sollten die wahrheitsgemäßen Fälle hinzufügen 8,1,8,9und 9,1,8,9sicherstellen, dass die Fallbehandlung sowohl N=1den nicht wiederholten XWert als auch den YWert erkennt . (Wenn Sie 0,0Fälle behandeln möchten, sollten Sie das auch hinzufügen.)
Apsiller

Antworten:

5

Gelee , 12 Bytes

ḣ⁴S;µṀ<⁵µ¿⁵e

Ein volles Programm Mitnahmen [X,Y], N, A.

Probieren Sie es online aus!

Wie?

ḣ⁴S;µṀ<⁵µ¿⁵e - Main link (monadic): [X,Y]
    µ   µ¿   - while:
     Ṁ       -   maximum value of the list
       ⁵     -   5th command line argument (3rd input) = A
      <      -   less than?
             - ...do:
 ⁴           -   4th command line argument (2nd input) = N
ḣ            -   head (get the first N (or less) items from the list)
  S          -   sum
   ;         -   concatenate (add the result to the front of the list)
          ⁵  - 5th command line argument (3rd input) = A
           e - exists in the resulting list?
Jonathan Allan
quelle
Ausgezeichnet. Scheint sowieso für mich zu arbeiten. +1
Gryphon
Um stattdessen die umgekehrte N-Bonacci-Sequenz bis zu einem Wert größer oder gleich A zu sehen, entfernen Sie einfach die ⁵evom Ende; viel einfacher zu sagen, dass es dann funktionieren wird (unter Hinweis darauf, dass die Reihenfolge der ersten beiden Begriffe keine Konsequenz hat).
Jonathan Allan
Ich habe eine Reihe von Testfällen ausprobiert. Wenn also niemand einen findet, der fehlschlägt, ist es gut für mich.
Gryphon
5

05AB1E , 18 Bytes

[DR²£O©‚˜³®>‹#]³QZ

Probieren Sie es online aus!


Verwendet: [X,Y], N, A


Ich habe das Gefühl, dass eine unbeabsichtigte Funktionalität das schwieriger gemacht hat, als es sein musste.

Es gibt kein Größeres als oder Gleiches, das habe ich noch nie bemerkt.

Und hat nicht funktioniert und benötigt a ]für +1 Bytes #]³.

Magische Krakenurne
quelle
4

Python 2 , 59 56 Bytes

a,n,l=input()
while l[0]<a:l=[sum(l[:n])]+l
print a in l

Probieren Sie es online aus!

Nimmt Eingabe als A,N,[X,Y]

ovs
quelle
Hier ist ein Wrapper für alle Testfälle, wenn Sie es mögen.
Undichte Nonne
Hier sind 2 Bytes Golf gespielt.
Undichte Nonne
3

Perl 6 , 47 Bytes

->\A,\N,\X,\Y{A∈(X,Y,{[+] @_.tail(N)}...*>A)}

Probier es aus

Erweitert:

->
  \A,
  \N,
  \X, \Y
{
    A          # is 「A」

              # an element of

    (          # this Sequence

      X, Y,        # seed values of sequence

      {            # generate the rest of the Seq using this code block

        [+]        # reduce by addition

          @_       # of all previously generated values
          .tail(N) # only use the last 「N」 of them
      }

      ...          # keep generating values until

      * > A        # it is greater than 「A」

    )
}
Brad Gilbert b2gills
quelle
1

R , 69 60 Bytes

function(a,n,l){while(l<a)l=c(sum(l[1:n],na.rm=T),l)
a%in%l}

Probieren Sie es online aus!

Gibt eine anonyme Funktion, eine Aufnahme a,nund einen Vektor zurück l=c(y,x). Konstruiert die N-Bonacci-Sequenz rückwärts (dh ein kleinerer Index befindet sich weiter in der Sequenz), da while(l<a)nur das erste Element von überprüft wird l.

Giuseppe
quelle
1

Common Lisp, 164 Bytes

(defun f(a n x y &aux(l(list y x)))(if(= n 1)(or(= a x)(= a y))(loop(if(<= a(car l))(return(member a l))(setf l(cons(reduce'+ l)(if(<(length l)n)l(butlast l))))))))

Diese Funktion gibt NILfür false, nicht NIL für true zurück (gemäß der Definition des generalisierten Booleschen Werts von Common Lisp).

(defun f(a n x y &aux (l (list y x)))    ; initialize a list l for the N values
  (if (= n 1)                            ; special case for N = 1
      (or (= a x) (= a y))               ;    true only if A = X or A = Y
      (loop
        (if (<= a (car l))               ; when the last number generated is greater than A
            (return (member a l))        ; return true if A is in the list
            (setf l (cons (reduce '+ l)  ; otherwise compute the sum of l
                          (if (< (length l) n)   ; and push it to l (truncating the list at 
                              l                  ; end if it has already size = N)
                              (butlast l))))))))
Renzo
quelle
Hat Sie Sonderfallbehandlung für N=1detektieren eine Avon beispielsweise beide 1und / oder 2wenn X=1 Y=2? Meine Lisp-Lesefähigkeiten sind nicht besonders gut, aber es sieht so aus, als würden Sie nur Aeinen der beiden Anfangswerte vergleichen .
Apsiller
@apsillers, wenn N = 1, vergleiche ich A nur mit X und nicht mit Y. Soll ich es mit beiden vergleichen, die true zurückgeben, wenn es gleich einem von ihnen ist? Vielleicht ist die Reihenfolge für diesen Fall nicht gut definiert?
Renzo
Ok, jetzt sehe ich, dass die Frage geändert wurde. Ich habe meine Antwort aktualisiert.
Renzo
0

k, 29 Bytes

{x=*(*x>){(x=#y)_y,+/y}[y]/z}

Probieren Sie es online aus! 1ist wahr, 0ist falsch. Eingabe ist [A;N;X,Y].

zgrep
quelle
Ich habe es an allen Beispielen durchgeführt, die ich gesehen habe. 1 ist wahr, 0 ist falsch.
Zgrep
@Gryphon Ich habe die Eingabe in die Fußzeile anstatt in den Text verschoben, bin mir aber nicht sicher, was ich ändern soll. Es ist und war dieselbe Funktion.
Zgrep
Oh, ich verstehe jetzt. Ich dachte, Sie nehmen keine Eingaben entgegen, aber Sie nehmen sie in den Code auf. Macht jetzt viel mehr Sinn. Ich weiß nicht, k, also nahm ich an, dass Sie die Frage falsch interpretiert haben, da alles, was es tun würde, die Ausgabe 1 0 1 1
Gryphon
0

PHP> = 7,1, 103 Bytes

for([,$n,$d,$s,$e]=$argv,$f=[$s,$e];$x<$n;)$x=$f[]=array_sum(array_slice($f,-$d));echo+in_array($n,$f);

Testfälle

Jörg Hülsermann
quelle
0

Mathematica, 94 Bytes

(s={#3,#4};t=1;While[t<#2-1,s~AppendTo~Tr@s;t++];!LinearRecurrence[1~Table~#2,s,#^2]~FreeQ~#)&


Eingabeformat

[A, N, X, Y]

J42161217
quelle