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.


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?

Ś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 #]³.



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」

    )
}

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!


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.


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

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].


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

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]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.