Termo válido da sequência quadrática?


10

Você recebe quatro números. Os três primeiros são a , b , e c , respectivamente, para a sequência:

Tn=an2+bn+c

Você pode receber esses quatro números de qualquer maneira. A saída deve ser uma das duas saídas distintas mencionadas na sua resposta, uma significa que o quarto número é um termo na sequência (a equação acima tem pelo menos uma solução para n que é um número inteiro quando a , b , c e Tn são substituídos pelos valores fornecidos), o outro significa o oposto.

Isso é código de golfe, então a resposta mais curta em bytes vence. Seu programa deve funcionar para qualquer entrada de a,b,c,Tn que os números sejam negativos ou positivos (ou 0), decimais ou números inteiros. Para evitar problemas, mas manter alguma complexidade, os não inteiros sempre terminam em .5 . Furos de loop padrão não permitidos.

Casos de teste

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

Respostas:


4

Geléia ,  11  10 bytes

_/Ær1Ẹ?%1Ạ

Um link monádico que aceita uma lista de listas * [[c, b, a], [T_n]]e gera 0se T_né uma solução válida ou 1não.

* admitidamente tendo um pouco de liberdade com "Você pode receber esses quatro números de qualquer maneira".

Experimente online! Ou veja uma suíte de testes .

Como?

_/Æ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 pudéssemos produzir resultados não distintos, _/Ær1Ẹ?ḞƑƇtambém funcionaria para 10 (produz 1quando todos os valores são soluções, caso contrário, uma lista de soluções distintas e, portanto, sempre uma lista vazia quando não há soluções - isso também atenderia à definição padrão de Truthy vs Falsey )


2
Essa entrada está perfeitamente bem.
Artemis ainda não confia em

6

JavaScript (ES7), 70 bytes

Retorna um valor 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

Experimente online!

Como?

d=Tnct

a0

A equação é realmente quadrática:

Tn=an2+bn+can2+bnd=0

a=2a

Δ=b2+2ad

e as raízes são:

n0=bΔan1=b+Δa

Δ

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

a=0,b0

A equação é linear:

Tn=bn+cbn=dn=db

d0(modb)

a=0,b=0

n

Tn=cd=0


1

05AB1E , 35 bytes

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

Porta da resposta JavaScript de @Arnauld , certifique-se de vomitá-lo!

[t,c],a,b

Experimente online

Explicação:

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

Iria Ųsalvar alguns bytes? (Provavelmente não, uma vez que mais tarde necessidade de calcular a raiz quadrada de qualquer maneira.)
Arnauld

@ Arnauld Infelizmente, não por três razões: 1. Ųcom valores negativos de alguma forma fornece o valor em vez de 0.. 2. Ųcom valores decimais (mesmo com .0) dá em 0vez de 1serem quadrados ou não (este é um bug que eu irei relatório a Adnan). 3. Mesmo que ambos funcionassem e -4.0resultassem em 0vez de -4.0e 4.0resultariam em 1vez de 0, ainda seriam +2 bytes, já que precisamos da raiz quadrada e do triplicado seriam duplicatas separadas: tÐdivs DŲitD; ou atualmente DÄïŲitDpara corrigir os outros dois problemas mencionados.
Kevin Cruijssen 04/04/19

11
Além disso, os resultados de Ųentradas negativas são inconsistentes .
Arnauld

@ Arnauld Wth .. isso é realmente muito estranho. E a versão legada ainda dá um resultado diferente, igualmente esquisito .. : S Eu relatei os bugs, incluindo seu teste de TIO para Adnan no bate-papo 05AB1E.
Kevin Cruijssen


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.