Допустимый член из квадратичной последовательности?


10

Вам дано четыре номера. Первые три - a , b и c соответственно для последовательности:

Tn=an2+bn+c

Вы можете ввести эти четыре числа любым способом. Выходные данные должны быть одним из двух различных выходных данных, упомянутых в вашем ответе, один означает, что четвертое число является термином в последовательности (приведенное выше уравнение имеет по крайней мере одно решение для n которое является целым числом, когда a , b , c и Tn заменяют данные значения), другое означает обратное.

Это код гольфа, поэтому выигрывает самый короткий ответ в байтах. Ваша программа должна работать для любого ввода a,b,c,Tn где числа отрицательные или положительные (или 0), десятичные или целые. Чтобы избежать проблем, но сохранить некоторую сложность, нецелые всегда будут заканчиваться на .5 . Стандартные петли не разрешены.

Контрольные примеры

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

Ответы:


4

Желе ,  11  10 байт

_/Ær1Ẹ?%1Ạ

Монадическая ссылка, которая принимает список списков * [[c, b, a], [T_n]]и выдает 0, T_nявляется ли верное решение или 1нет.

* по общему признанию, взяв немного свободы с "Вы можете взять эти четыре числа любым способом".

Попробуйте онлайн! Или посмотрите тестовый набор .

Как?

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

Если бы мы могли дать непонятные результаты, то _/Ær1Ẹ?ḞƑƇтакже работали бы для 10 (это дает, 1когда все значения являются решениями, иначе список отдельных решений и, следовательно, всегда пустой список, когда нет решений - это также соответствовало бы стандартному определению Truthy vs Falsey). )


2
Этот ввод совершенно нормально.
Артемида до сих пор не доверяет

6

JavaScript (ES7), 70 байт

Возвращает логическое значение.

(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

Попробуйте онлайн!

Как?

d=Tnct

a0

Уравнение действительно является квадратичным:

Tn=an2+bn+can2+bnd=0

a=2a

Δ=b2+2ad

и корни:

n0=bΔan1=b+Δa

Δ

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

Случайa=0,b0

Уравнение является линейным:

Tn=bn+cbn=dn=db

Он допускает целочисленный корень, если .d0(modb)

Случайa=0,b=0

Уравнение больше не зависит от :n

Tn=cd=0


1

05AB1E , 35 байт

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

Порт JavaScript @Arnauld 's answer , так что не забудьте его поддержать!

Принимает ввод в формате .[t,c],a,b

Попробуйте онлайн

Объяснение:

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

ŲСохранит ли несколько байтов? (Вероятно, нет, поскольку позже нам все равно нужно вычислить квадратный корень.)
Арно

@Arnauld К сожалению, не по трем причинам: 1. Ųс отрицательными значениями как-то дает само значение вместо 0.. 2. Ųс десятичными значениями (даже с .0) дает 0вместо того, являются 1ли они квадратом или нет (это ошибка, которую я буду сообщить Аднану). 3. Даже если бы оба сработали и дали -4.0бы результат 0вместо, -4.0а 4.0результат был бы 1вместо 0, это все равно было бы +2 байта, так как нам нужен квадратный корень, а тройной дубликат будет разделен дубликатами: tÐdivs DŲitD; или в настоящее время DÄïŲitDдля устранения двух других упомянутых проблем.
Кевин Круйссен

1
Кроме того, результаты Ųпо отрицательным данным противоречивы .
Арно

@ Arnauld Wth .. это действительно довольно странно. И унаследованная версия даже дает другой, столь же странный результат .. : S Я сообщил об ошибках, включая ваш тестовый TIO, Аднану в чате 05AB1E.
Кевин Круйссен


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.