Terme valide de la séquence quadratique?


10

On vous donne quatre chiffres. Les trois premiers sont respectivement a , b et c pour la séquence:

Tn=an2+bn+c

Vous pouvez saisir ces quatre chiffres de n'importe quelle manière. La sortie doit être l'une des deux sorties distinctes mentionnées dans votre réponse, l'une signifie que le quatrième nombre est un terme dans la séquence (l'équation ci-dessus a au moins une solution pour n qui est un entier lorsque a , b , c et Tn sont substituées aux valeurs données), l'autre signifie le contraire.

C'est le golf de code, donc la réponse la plus courte en octets l'emporte. Votre programme devrait fonctionner pour toute entrée de a,b,c,Tn où les nombres sont négatifs ou positifs (ou 0), décimaux ou entiers. Pour éviter les problèmes mais garder une certaine complexité, les non-entiers se termineront toujours par .5 . Boucles standard non autorisées.

Cas de test

a   |b   |c   |T_n |Y/N
------------------------
1   |1   |1   |1   |Y     #n=0
2   |3   |5   |2   |N
0.5 |1   |-2  |-0.5|Y     #n=1
0.5 |1   |-2  |15.5|Y     #n=5
0.5 |1   |-2  |3   |N     
-3.5|2   |-6  |-934|Y     #n=-16
0   |1   |4   |7   |Y     #n=3
0   |3   |-1  |7   |N
0   |0   |0   |1   |N
0   |0   |6   |6   |Y     #n=<anything>
4   |8   |5   |2   |N

Réponses:


4

Gelée ,  11  10 octets

_/Ær1Ẹ?%1Ạ

Un lien monadique qui accepte une liste de listes * [[c, b, a], [T_n]]et donne 0si T_nest une solution valide ou 1non.

* en admettant un peu de liberté avec "Vous pouvez prendre la saisie de ces quatre nombres de n'importe quelle manière".

Essayez-le en ligne! Ou consultez une suite de tests .

Comment?

_/Ær1Ẹ?%1Ạ - Link: list of lists of integers, [[c, b, a], [T_n]]
 /         - reduce by:
_          -   subtraction                    [c-T_n, b, a]
      ?    - if...
     Ẹ     - ...condition: any?
  Ær       - ...then: roots of polynomial     i.e. roots of a²x+bx+(c-T_n)=0
    1      - ...else: literal 1
       %1  - modulo 1 (vectorises)            i.e. for each: keep any fractional part
           -                                       note: (a+bi)%1 yields nan which is truthy
         Ạ - all?                             i.e. all had fractional parts?
           -                                       note: all([]) yields 1

Si nous pouvions produire des résultats non distincts, _/Ær1Ẹ?ḞƑƇcela fonctionnerait également pour 10 (cela donne 1lorsque toutes les valeurs sont des solutions, sinon une liste des solutions distinctes et donc toujours une liste vide quand aucune solution - cela répondrait également à la définition standard Truthy vs Falsey )


2
Cette entrée est parfaitement bien.
Artemis ne fait toujours pas confiance au SE

6

JavaScript (ES7), 70 octets

Renvoie une valeur booléenne.

(a,b,c,t)=>(t-=c,(a*=2)?(x=(b*b+2*a*t)**.5-b)%a&&(x+b+b)%a:b?t%b:t)==0

Essayez-le en ligne!

Comment?

d=Tnct

a0

L'équation est vraiment quadratique:

Tn=an2+bn+can2+bnd=0

a=2a

Δ=b2+2ad

et les racines sont:

n0=bΔan1=b+Δa

Δ

bΔ0(moda) or b+Δ0(moda)

Casa=0,b0

L'équation est linéaire:

Tn=bn+cbn=dn=db

Il admet une racine entière si .d0(modb)

Casa=0,b=0

L'équation ne dépend plus de :n

Tn=cd=0


1

05AB1E , 35 octets

Æ©²Āi²4P³n+tÐdi(‚³-IJ·Ä%P}뮳Āi³%]_

Port de la réponse JavaScript de @Arnauld , alors assurez-vous de voter pour lui!

Prend l'entrée au format .[t,c],a,b

Essayez-le en ligne

Explication:

Æ                         # Reduce the (implicit) input-list by subtraction (`t-c`)
 ©                        # Store this value in the register (without popping)
  ²Āi                     # If the second input `a` is not 0:
     ²4P                  #  Calculate `(t-c)*a*4`
        ³n+               #  Add the third input `b` squared to it: `(t-c)*a*4+b*b`
           t              #  Take the square-root of that
                          #  (NOTE: 05AB1E and JS behave differently for square-roots of
                          #   negative integers; JS produces NaN, whereas 05AB1E leaves the
                          #   integer unchanged, which is why we have the `di...}` here)
            Ð             #  Triplicate this square
             di           #  If the square is non-negative (>= 0):
               (‚         #   Pair it with its negative
                 ³-       #   Subtract the third input `b` from each
                   Ä      #   Take the absolute value of both
                    ²·Ä%  #   Modulo the absolute value of `a` doubled
                          #   (NOTE: 05AB1E and JS behave differently for negative modulos,
                          #    which is why we have the two `Ä` here)
                        P #   Then multiply both by taking the product
              }           #  And close the inner if-statement
    ë                     # Else (`a` is 0):
     ®                    #  Push the `t-c` from the register
      ³Āi                 #  If the third input `b` is not 0:
         ³%               #   Take modulo `b`
    ]                     # Close both if-else statements
     _                    # And check if the result is 0
                          # (which is output implicitly)

Voulez-vous Ųéconomiser quelques octets? (Probablement pas, car nous devons de toute façon calculer la racine carrée de toute façon.)
Arnauld

@Arnauld Malheureusement pas pour trois raisons: 1. Ųavec des valeurs négatives donne en quelque sorte la valeur elle-même au lieu de 0.. 2. Ųavec des valeurs décimales (même avec .0) donne 0au lieu de 1savoir si elles sont un carré ou non (c'est un bug que je vais rapport à Adnan). 3. Même si les deux auraient fonctionné et -4.0auraient abouti à la 0place de -4.0et 4.0résulteraient à la 1place de 0, ce serait toujours +2 octets car nous avons besoin de la racine carrée et le triplicata serait des doublons séparés: tÐdivs DŲitD; ou actuellement DÄïŲitDpour résoudre les deux autres problèmes mentionnés.
Kevin Cruijssen

1
En outre, les résultats des Ųentrées négatives sont incohérents .
Arnauld

@Arnauld Wth .. c'est en effet assez bizarre. Et la version héritée donne même un résultat différent, tout aussi étrange .. : S J'ai signalé les bugs, y compris votre test TIO à Adnan dans le chat 05AB1E.
Kevin Cruijssen


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.