Czy jestem specjalnym numerem N-bonacci?

11

Sekwencja N-bonacci, pierwotnie wymyślona przez @DJMcMayhem w tym pytaniu , jest sekwencją generowaną przez rozpoczęcie od liczb całkowitych 0 i 1, a następnie dodanie poprzednich N liczb w celu wygenerowania następnej liczby. Specjalna sekwencja N-bonacci jest sekwencją N-bonacci rozpoczynającą się od pary liczb innych niż 0 i 1, które zostaną nazwane X i Y. Jeśli N jest większe niż liczba terminów już w sekwencji, po prostu dodaj wszystkie dostępne warunki.

Na przykład normalna sekwencja Fibonacciego ma N równą 2 (bierze poprzednie dwa elementy) oraz X i Y równe 0 i 1 lub 1 i 1, w zależności od tego, kogo zapytasz.

Twoje zadanie:

Masz napisać program lub funkcję, która sprawdza, czy wprowadzona liczba całkowita (A) jest częścią specjalnej sekwencji N-bonacci generowanej przez kolejne trzy liczby całkowite (używając drugiego wejścia jako N, a trzeciego i czwartego jako X i Y) . Upewnij się, że zajmujesz się przypadkiem specjalnym N = 1.

Wejście:

Cztery nieujemne liczby całkowite, A, N, X i Y.

Wynik:

Wartość prawda / fałsz wskazująca, czy A jest częścią sekwencji N-bonacci generowanej przez dane wejściowe N, X i Y.

Przypadki testowe:

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.  

Punktacja:

To jest , więc wygrywa najniższy wynik w bajtach.

Gryf
źródło
1
N==1to taki dziwny przypadek.
Magic Octopus Urn
Tak, ale dziwne przypadki sprawiają, że ta zabawa jest fajna :)
Gryphon
Jeśli naprawdę chcesz, aby odpowiedzi załatwiły sprawę N=1, możesz przywołać je w pytaniu, ponieważ wiele odpowiedzi (w tym wszystkie aktualne odpowiedzi, jak sądzę) będzie miało warunek niepowodzenia, który zakłada ściśle rosnącą serię. Czy może Xi może Ybyć negatywne? Prawdopodobnie spowoduje to również unieważnienie wszystkich istniejących odpowiedzi.
apsillers
1
Myślę, że wszystkie istniejące odpowiedzi nie radzą sobie z nie rosnącym przypadkiem, w którym zarówno X, jak i Y są zerowe. Czy konieczne jest również załatwienie tej sprawy?
apsillers
1
Myślę, że powinieneś dodać prawdziwe przypadki 8,1,8,9i 9,1,8,9upewnić się, że N=1obsługa spraw wykrywa nie powtarzającą się Xwartość, jak również Ywartość. (Jeśli chcesz zająć się 0,0sprawami, powinieneś również to dodać.)
apsillers

Odpowiedzi:

5

Galaretka , 12 bajtów

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

Pełną podejmowanie programu [X,Y], N, A.

Wypróbuj online!

W jaki sposób?

ḣ⁴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
źródło
Świetny. W każdym razie wydaje mi się, że działa. +1
Gryphon
Aby zamiast tego zobaczyć odwróconą sekwencję N-bonacciego do wartości większej lub równej A, wystarczy usunąć ⁵ekoniec; znacznie łatwiej powiedzieć, że wtedy zadziała (zauważając, że kolejność pierwszych dwóch terminów nie ma znaczenia).
Jonathan Allan
Wypróbowałem kilka przypadków testowych, więc jeśli ktoś go nie znajdzie, to mi pasuje.
Gryphon
5

05AB1E , 18 bajtów

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

Wypróbuj online!


Wykorzystuje: [X,Y], N, A


Wydaje mi się, że niektóre niezamierzone funkcje sprawiły, że było to trudniejsze niż trzeba.

Nie ma czegoś większego niż lub równego, nigdy wcześniej tego nie zauważyłem.

I nie działał i wymagał a ]dla +1 bajtów #]³.

Urna Magicznej Ośmiornicy
źródło
4

Python 2 , 59 56 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako A,N,[X,Y]

ovs
źródło
Oto opakowanie dla wszystkich przypadków testowych, jeśli Ci się spodoba.
Leaky Nun
Oto 2 bajty.
Leaky Nun
3

Perl 6 , 47 bajtów

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

Sprawdź to

Rozszerzony:

->
  \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
źródło
2

Python 2, 50 bajtów

a,n,l=input()
while[a]>l:l=[sum(l[:n])]+l
a in l>x

Pobiera dane wejściowe jako A,N,[Y,X]. Dane wyjściowe za pośrednictwem kodu wyjścia.

Wypróbuj online!

Lynn
źródło
1

R , 69 60 bajtów

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

Wypróbuj online!

Zwraca anonimową funkcję, przyjmowanie a,ni wektor l=c(y,x). Konstruuje sekwencję N-bonacci do tyłu (tj. Mniejszy indeks znajduje się dalej w sekwencji), ponieważ while(l<a)sprawdza tylko pierwszy element l.

Giuseppe
źródło
1

Common Lisp, 164 bajty

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

Ta funkcja zwraca wartość NILfalse, a wartość inną niż NIL dla true (zgodnie z definicją uogólnionego logicznego parametru 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
źródło
Czy zajmujesz się przypadkami specjalnymi w celu N=1wykrycia Anp. Obu 1i / lub 2kiedy X=1 Y=2? Moje umiejętności czytania Lisp nie są świetne, ale wygląda na to, że możesz porównać tylko Az jedną z dwóch początkowych wartości.
apsillers
@apillers, gdy N = 1, porównuję A tylko z X, a nie z Y. czy powinienem porównywać z obiema zwracanymi wartościami true, jeśli jest równy jednemu z nich? Może sekwencja nie jest dobrze zdefiniowana w tym przypadku?
Renzo
Ok, teraz widzę, że pytanie zostało zmienione, zaktualizowałem swoją odpowiedź.
Renzo
0

k, 29 bajtów

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

Wypróbuj online! 1jest prawdą, 0jest falsey. Dane wejściowe to [A;N;X,Y].

zgrep
źródło
Uruchomiłem to na wszystkich przykładach, które widziałem. 1 to prawda, 0 to falsey.
zgrep
@Gryphon Przesunąłem dane wejściowe do stopki zamiast do ciała, ale nie jestem pewien, co chcesz, żebym zmienił. Oba są i były tą samą funkcją.
zgrep
Och, teraz rozumiem. Myślałem, że nie bierzesz żadnych danych wejściowych, ale bierzesz je w kodzie. Teraz ma o wiele więcej sensu. Nie wiem k, więc założyłem, że źle zinterpretowałeś to pytanie, ponieważ wystarczyłoby 1 0 1 1
Gryphon
0

PHP> = 7,1, 103 bajtów

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

Przypadki testowe

Jörg Hülsermann
źródło
0

Mathematica, 94 bajty

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


format wejściowy

[A, N, X, Y]

J42161217
źródło