Suis-je un numéro N-bonacci spécial?

11

La séquence N-bonacci, inventée à l'origine par @DJMcMayhem dans cette question , est une séquence générée en commençant par les nombres entiers 0 et 1, puis en ajoutant les nombres N précédents pour générer le nombre suivant. La séquence N-bonacci spéciale est une séquence N-bonacci commençant par une paire de nombres autres que 0 et 1, qui seront nommés X et Y. Si N est supérieur au nombre de termes déjà dans la séquence, ajoutez simplement tous les disponibles termes.

Ainsi, par exemple, la séquence normale de fibonacci a un N de 2 (prend les deux éléments précédents), et un X et Y de 0 et 1, ou 1 et 1, selon qui vous demandez.

Ta tâche:

Vous devez écrire un programme ou une fonction qui vérifie si un entier entré (A) fait partie de la séquence N-bonacci spéciale générée par les trois prochains entiers (en utilisant la deuxième entrée comme N et les troisième et quatrième comme X et Y) . Assurez-vous de gérer le cas spécial de N = 1.

Contribution:

Quatre entiers non négatifs, A, N, X et Y.

Production:

Une valeur de vérité / fausse qui indique si A fait partie de la séquence N-bonacci générée par les entrées N, X et Y.

Cas de 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.  

Notation:

Il s'agit de , donc le score le plus bas en octets l'emporte.

Gryphon
la source
1
N==1est un cas si étrange.
Magic Octopus Urn
Oui, mais des cas étranges sont ce qui rend cela amusant :)
Gryphon
Si vous voulez en effet des réponses pour gérer le cas N=1, vous voudrez peut-être l'appeler dans la question, car de nombreuses réponses (y compris toutes les réponses actuelles, je pense) auront une condition d'échec qui suppose une série strictement croissante. En outre, peut- Xil Yêtre négatif? Cela invalidera probablement également toutes les réponses existantes.
apsillers
1
Je pense que toutes les réponses existantes ne parviennent pas à gérer le cas non croissant où X et Y sont nuls. Est-il également nécessaire de gérer ce cas?
apsillers
1
Je pense que vous devriez ajouter les cas véridiques 8,1,8,9et 9,1,8,9vous assurer que la N=1gestion des cas détecte la Xvaleur non répétée ainsi que la Yvaleur. (Si vous souhaitez gérer les 0,0cas, vous devez également l'ajouter.)
apsillers

Réponses:

5

Gelée , 12 octets

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

Un programme complet prenant [X,Y], N, A.

Essayez-le en ligne!

Comment?

ḣ⁴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
la source
Excellent. Semble fonctionner pour moi, de toute façon. +1
Gryphon
Pour voir à la place la séquence N-bonacci inversée jusqu'à une valeur supérieure ou égale à A, il suffit de retirer le ⁵ede la fin; beaucoup plus facile à dire que cela fonctionnera alors (en notant que l'ordre des deux premiers termes est sans conséquence).
Jonathan Allan
J'ai essayé un tas de cas de test, donc à moins que quelqu'un en trouve un, il échoue, c'est bon pour moi.
Gryphon
5

05AB1E , 18 octets

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

Essayez-le en ligne!


Les usages: [X,Y], N, A


J'ai l'impression que certaines fonctionnalités involontaires ont rendu cela plus difficile que nécessaire.

Il n'y a pas de supérieur ou égal à, je n'avais jamais remarqué cela auparavant.

Et n'a pas fonctionné, et a nécessité un ], pour +1 octets #]³.

Urne de poulpe magique
la source
4

Python 2 , 59 56 octets

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

Essayez-le en ligne!

Prend l'entrée comme A,N,[X,Y]

ovs
la source
Voici un wrapper pour tous les cas de test si vous l'aimez.
Leaky Nun
Voici 2 octets joués au golf.
Leaky Nun
3

Perl 6 , 47 octets

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

Essaye-le

Étendu:

->
  \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
la source
2

Python 2, 50 octets

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

Prend l'entrée comme A,N,[Y,X]. Sorties via code de sortie.

Essayez-le en ligne!

Lynn
la source
1

R , 69 60 octets

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

Essayez-le en ligne!

Renvoie une fonction anonyme, prenant a,net un vecteur l=c(y,x). Construit la séquence N-bonacci à l'envers (c'est-à-dire while(l<a)qu'un index plus petit est plus loin dans la séquence), car ne vérifie que le premier élément de l.

Giuseppe
la source
1

Lisp commun, 164 octets

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

Cette fonction renvoie NILpour faux, non NIL pour vrai (selon la définition du booléen généralisé 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
la source
Avez-vous un traitement de cas spécial pour N=1détecter A, par exemple, les deux 1et / ou 2quand X=1 Y=2? Mes compétences en lecture Lisp ne sont pas excellentes, mais il semble que vous ne puissiez vous comparer Aqu'à l'une des deux valeurs initiales.
apsillers
@apsillers, lorsque N = 1, je compare A uniquement avec X et non avec Y. dois-je le comparer avec les deux renvoyant vrai s'il est égal à l'un d'eux? Peut-être que la séquence n'est pas bien définie pour ce cas?
Renzo
Ok, maintenant je vois que la question a été changée, j'ai mis à jour ma réponse.
Renzo
0

k, 29 octets

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

Essayez-le en ligne! 1est véridique, 0est falsey. L'entrée est [A;N;X,Y].

zgrep
la source
Je l'ai exécuté sur tous les exemples que j'ai vus. 1 est véridique, 0 est falsey.
zgrep
@Gryphon J'ai déplacé l'entrée vers le pied de page au lieu du corps, mais je ne suis pas certain de ce que vous voulez que je change. C'est à la fois et était la même fonction.
zgrep
Oh, je vois maintenant. Je pensais que vous ne preniez aucune entrée, mais vous la preniez dans le code. Cela a beaucoup plus de sens maintenant. Je ne sais pas k, alors j'ai supposé que vous aviez mal interprété la question, car tout ce qu'elle ferait était de sortir 1 0 1 1
Gryphon
0

PHP> = 7.1, 103 octets

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

Cas de test

Jörg Hülsermann
la source
0

Mathematica, 94 octets

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


format d'entrée

[A, N, X, Y]

J42161217
la source