Sono un numero N-bonacci speciale?


11

La sequenza N-bonacci, originariamente inventata da @DJMcMayhem in questa domanda , è una sequenza generata iniziando con gli interi 0 e 1, quindi aggiungendo i precedenti numeri N per generare il numero successivo. La speciale sequenza N-bonacci è una sequenza N-bonacci che inizia con una coppia di numeri diversi da 0 e 1, che saranno denominati X e Y. Se N è maggiore del numero di termini già presenti nella sequenza, è sufficiente aggiungere tutti i disponibili termini.

Quindi, ad esempio, la normale sequenza di fibonacci ha una N di 2 (prende le due voci precedenti) e una X e Y di 0 e 1, oppure 1 e 1, a seconda di chi chiedi.

Il tuo compito:

Devi scrivere un programma o una funzione che controlli se un intero immesso (A) fa parte della sequenza speciale N-bonacci generata dai successivi tre numeri interi (usando il secondo input come N e il terzo e il quarto come X e Y) . Assicurati di gestire il caso speciale di N = 1.

Ingresso:

Quattro numeri interi non negativi, A, N, X e Y.

Produzione:

Un valore di verità / falsità che indica se A fa parte della sequenza N-bonacci generata dagli input N, X e Y.

Casi test:

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.  

punteggio:

Questo è , quindi vince il punteggio più basso in byte.


1
N==1è un caso così strano.
Magic Octopus Urn,

Sì, ma i casi strani sono ciò che rende divertente :)
Gryphon,

Se vuoi davvero risposte per gestire il caso N=1, potresti volerlo chiamare nella domanda, dal momento che molte risposte (comprese tutte le risposte attuali, penso) avranno una condizione di fallimento che presuppone una serie strettamente crescente. Inoltre, può Xed Yessere negativo? Ciò probabilmente invaliderà anche tutte le risposte esistenti.
apsillers,

1
Penso che tutte le risposte esistenti non riescano a gestire il caso non crescente in cui sia X che Y sono zero. È necessario gestire anche quel caso?
apsillers,

1
Penso che dovresti aggiungere i casi veritieri 8,1,8,9e 9,1,8,9assicurarti che la N=1gestione dei casi rilevi il Xvalore non ripetuto e il Yvalore. (Se si desidera gestire i 0,0casi, è necessario aggiungere anche quello.)
apsillers

Risposte:


5

Gelatina , 12 byte

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

Un programma completo presa [X,Y], N, A.

Provalo online!

Come?

ḣ⁴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?

Eccellente. Sembra funzionare per me, comunque. +1
Gryphon,

Per vedere invece la sequenza N-bonacci invertita fino a un valore maggiore o uguale ad A basta rimuovere il ⁵edalla fine; molto più facile dirlo funzionerà allora (notando che l'ordine dei primi due termini non ha alcuna conseguenza).
Jonathan Allan,

Ho provato un sacco di casi di test, quindi a meno che qualcuno non ne trovi uno che fallisca, va bene con me.
Gryphon,

5

05AB1E , 18 byte

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

Provalo online!


usi: [X,Y], N, A


Mi sento come se alcune funzionalità non intenzionali fossero state rese più difficili di quanto fosse necessario.

Non c'è maggiore o uguale a, mai notato prima.

E non ha funzionato, e ha richiesto a ], per +1 byte #]³.



3

Perl 6 , 47 byte

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

Provalo

Allargato:

->
  \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 byte

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

Accetta input come A,N,[Y,X]. Uscite tramite codice di uscita.

Provalo online!


1

R , 69 60 byte

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

Provalo online!

Restituisce una funzione anonima, prendendo a,ne un vettore l=c(y,x). Costruisce la sequenza N-bonacci all'indietro (ovvero, l'indice più piccolo è ulteriormente nella sequenza), poiché while(l<a)controlla solo il primo elemento di l.


1

Lisp comune, 164 byte

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

Questa funzione ritorna NILper false, non-NIL per true (secondo la definizione di booleano generalizzato di 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))))))))

Ti occupi di casi speciali per N=1rilevare A, ad esempio, entrambi 1e / o 2quando X=1 Y=2? Le mie capacità di lettura del Lisp non sono eccezionali, ma sembra che potresti confrontare solo Auno dei due valori iniziali.
apsillers,

@apsillers, quando N = 1 confronto A solo con X e non con Y. dovrei confrontarlo con entrambi restituendo true se è uguale a uno di essi? Forse la sequenza non è ben definita per questo caso?
Renzo,

Ok, ora vedo che la domanda è stata cambiata, ho aggiornato la mia risposta.
Renzo,

0

k, 29 byte

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

Provalo online! 1è verità, 0è falsità. L'input è [A;N;X,Y].


L'ho eseguito su tutti gli esempi che ho visto. 1 è verità, 0 è falsità.
zgrep,

@Gryphon Ho spostato l'input sul piè di pagina anziché sul corpo, ma non sono sicuro di cosa vuoi che cambi. Entrambi sono ed erano la stessa funzione.
zgrep,

Oh, vedo ora. Pensavo non avessi ricevuto alcun input, ma lo stavi prendendo nel codice. Adesso ha molto più senso. Non conosco k, quindi ho pensato che avresti interpretato male la domanda, poiché tutto ciò che avrebbe fatto sarebbe stato l'output 1 0 1 1
Gryphon,

0

PHP> = 7.1, 103 byte

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

Casi test


0

Mathematica, 94 byte

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


formato di input

[A, N, X, Y]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.