Termine valido dalla sequenza quadratica?


10

Ti vengono dati quattro numeri. I primi tre sono rispettivamente un' , B e c per la sequenza:

Tn=un'n2+Bn+c

Puoi inserire questi quattro numeri in qualsiasi modo. L'output dovrebbe essere uno dei due output distinti menzionati nella tua risposta, uno significa che il quarto numero è un termine nella sequenza (l'equazione sopra ha almeno una soluzione per n che è un numero intero quando un' , B , c e Tn vengono sostituiti con i valori indicati), l'altro significa l'opposto.

Questo è il golf del codice, quindi vince la risposta più breve in byte. Il tuo programma dovrebbe funzionare per qualsiasi input di un',B,c,Tn dove i numeri sono negativi o positivi (o 0), decimali o interi. Per evitare problemi ma mantenere una certa complessità, i numeri non interi finiranno sempre con .5 . Anelli standard non consentiti.

Casi 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

Risposte:


4

Gelatina ,  11  10 byte

_/Ær1Ẹ?%1Ạ

Un collegamento monadico che accetta un elenco di elenchi * [[c, b, a], [T_n]]e produce 0se T_nè una soluzione valida o in 1caso contrario.

* ammettendo di prendersi un po 'di libertà con "Puoi prendere input di questi quattro numeri in qualsiasi modo".

Provalo online! O vedi una suite di test .

Come?

_/Æ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

Se potessimo ottenere risultati non distinti, allora _/Ær1Ẹ?ḞƑƇfunzionerebbe anche per 10 (produce 1quando tutti i valori sono soluzioni, altrimenti un elenco di soluzioni distinte e quindi sempre un elenco vuoto quando nessuna soluzione - ciò soddisferebbe anche la definizione standard di Truthy vs Falsey )


2
Quell'input è perfettamente perfetto.
Artemis non si fida ancora del

6

JavaScript (ES7), 70 byte

Restituisce un valore booleano.

(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

Provalo online!

Come?

Per motivi di chiarezza, definiamo d=Tn-c . (La stessa variabile t viene riutilizzata per memorizzare questo risultato nel codice JS.)

Caso un'0

L'equazione è davvero quadratica:

Tn=un'n2+Bn+cun'n2+Bn-d=0

Con un''=2un' , la discriminante è:

Δ=B2+2un''d

e le radici sono:

n0=-B-Δun''n1=-B+Δun''

Δ

-B-Δ0(modun'') o -B+Δ0(modun'')

un'=0,B0

L'equazione è lineare:

Tn=Bn+cBn=dn=dB

d0(modB)

un'=0,B=0

n

Tn=cd=0


1

05AB1E , 35 byte

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

Porta della risposta JavaScript di @Arnauld , quindi assicurati di votarlo!

[t,c],un',B

Provalo online

Spiegazione:

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

Salverebbe Ųalcuni byte? (Probabilmente non da quando in seguito dovremo comunque calcolare la radice quadrata.)
Arnauld

@Arnauld Purtroppo non per tre motivi: 1. Ųcon valori negativi in ​​qualche modo dà il valore stesso invece di 0.. 2. Ųcon valori decimali (anche con .0) dà 0invece 1che siano quadrati o meno (questo è un bug che riferire ad Adnan). 3. Anche se entrambi avessero funzionato e -4.0si traducessero in 0invece di -4.0e 4.0risultassero 1invece di 0, sarebbero comunque +2 byte poiché abbiamo bisogno della radice quadrata e del triplicato sarebbero duplicati separati: tÐdivs DŲitD; o attualmente DÄïŲitDper risolvere gli altri due problemi citati.
Kevin Cruijssen,

1
Inoltre, i risultati degli Ųinput negativi sono incoerenti .
Arnauld

@Arnauld Wth .. è davvero piuttosto strano. E la versione legacy dà anche un risultato diverso, altrettanto strano ... : S Ho segnalato i bug, incluso il tuo test TIO su Adnan nella chat 05AB1E.
Kevin Cruijssen,


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.