¿Soy un número especial de N-bonacci?

11

La secuencia N-bonacci, originalmente inventada por @DJMcMayhem en esta pregunta , es una secuencia generada al comenzar con los enteros 0 y 1, y luego agregar los números N anteriores para generar el siguiente número. La secuencia especial de N-bonacci es una secuencia de N-bonacci que comienza con un par de números distintos de 0 y 1, que se denominarán X e Y. Si N es mayor que el número de términos que ya están en la secuencia, simplemente agregue todos los disponibles condiciones.

Entonces, por ejemplo, la secuencia normal de Fibonacci tiene un N de 2 (toma los dos elementos anteriores) y una X e Y de 0 y 1, o 1 y 1, dependiendo de a quién le pregunte.

Tu tarea:

Debe escribir un programa o función que verifique si un entero ingresado (A) es parte de la secuencia especial de N-bonacci generada por los siguientes tres enteros (utilizando la segunda entrada como N, y el tercero y cuarto como X e Y) . Asegúrese de manejar el caso especial de N = 1.

Entrada:

Cuatro enteros no negativos, A, N, X e Y.

Salida:

Un valor verdadero / falso que indica si A es parte de la secuencia N-bonacci generada por las entradas N, X e Y.

Casos de prueba:

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.  

Puntuación:

Este es el , por lo que gana la puntuación más baja en bytes.

Grifo
fuente
1
N==1Es un caso tan extraño.
Magic Octopus Urn
Sí, pero casos extraños son lo que hace que esto sea divertido :)
Gryphon
Si realmente desea respuestas para manejar el caso N=1, es posible que desee mencionarlo en la pregunta, ya que muchas respuestas (incluidas todas las respuestas actuales, creo) tendrán una condición de falla que supone una serie estrictamente creciente. Además, ¿puede Xy Yser negativo? Eso probablemente también invalidará todas las respuestas existentes.
apsillers
1
Creo que todas las respuestas existentes no logran manejar el caso no creciente donde X e Y son cero. ¿Es necesario manejar ese caso también?
apsillers
1
Creo que debe agregar los casos verdaderos 8,1,8,9y 9,1,8,9asegurarse de que el N=1manejo de casos detecte el Xvalor no repetido y el Yvalor. (Si desea manejar 0,0casos, debe agregar eso también.)
apsillers

Respuestas:

5

Jalea , 12 bytes

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

Una toma de programa completo [X,Y], N, A.

Pruébalo en línea!

¿Cómo?

ḣ⁴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
fuente
Excelente. Parece funcionar para mí, de todos modos. +1
Gryphon
Para ver en su lugar la secuencia de N-bonacci invertida hasta un valor mayor o igual a A, simplemente elimine el ⁵edel final; mucho más fácil decir que funcionará entonces (observando que el orden de los dos primeros términos no tiene ninguna consecuencia).
Jonathan Allan
Probé un montón de casos de prueba, así que a menos que alguien encuentre uno, falla, es bueno para mí.
Gryphon
5

05AB1E , 18 bytes

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

Pruébalo en línea!


Usos: [X,Y], N, A


Siento que alguna funcionalidad no deseada hizo que fuera más difícil de lo necesario.

No hay mayor que o igual a, nunca antes lo había notado.

Y no funcionó, y requirió a ], para +1 bytes #]³.

Urna de pulpo mágico
fuente
4

Python 2 , 59 56 bytes

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

Pruébalo en línea!

Toma entrada como A,N,[X,Y]

ovs
fuente
Aquí hay un contenedor para todos los casos de prueba si te gusta.
Leaky Nun
Aquí hay 2 bytes de golf.
Leaky Nun
3

Perl 6 , 47 bytes

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

Pruébalo

Expandido:

->
  \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
fuente
2

Python 2, 50 bytes

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

Toma entrada como A,N,[Y,X]. Salidas a través del código de salida.

Pruébalo en línea!

Lynn
fuente
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}

Pruébalo en línea!

Devuelve una función anónima, tomando a,ny un vector l=c(y,x). Construye la secuencia de N-bonacci hacia atrás (es decir, un índice más pequeño está más adelante en la secuencia), ya que while(l<a)solo verifica el primer elemento de l.

Giuseppe
fuente
1

Lisp común, 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))))))))

Esta función devuelve NILfalso, no NIL para verdadero (según la definición de booleano generalizado de 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
fuente
¿Maneja casos especiales para N=1detectar una Ade, por ejemplo, ambas 1y / o 2cuándo X=1 Y=2? Mis habilidades de lectura Lisp no son excelentes, pero parece que solo se puede comparar Acon uno de los dos valores iniciales.
apsillers
@apsillers, cuando N = 1 comparo A solo con X y no con Y. ¿Debería compararlo con ambos devolviendo verdadero si es igual a uno de ellos? ¿Quizás la secuencia no está bien definida para este caso?
Renzo
Ok, ahora veo que la pregunta ha cambiado, he actualizado mi respuesta.
Renzo
0

k, 29 bytes

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

Pruébalo en línea! 1es verdad, 0es falsey. Entrada es [A;N;X,Y].

zgrep
fuente
Lo ejecuté en todos los ejemplos que vi. 1 es verdadero, 0 es falsey.
zgrep
@Gryphon Moví la entrada al pie de página en lugar del cuerpo, pero no estoy seguro de qué quieres que cambie. Es a la vez y fue la misma función.
zgrep
Oh, ya veo ahora. Pensé que no tomabas ninguna entrada, pero la tomabas en el código. Tiene mucho más sentido ahora. No sé k, así que supuse que interpretaría mal la pregunta, ya que todo lo que haría sería enviar 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);

Casos de prueba

Jörg Hülsermann
fuente
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~#)&


formato de entrada

[A, N, X, Y]

J42161217
fuente