Вызов
Задача состоит в том, чтобы написать программу, которая принимает коэффициенты любого полиномиального уравнения n-степени в качестве входных данных и возвращает интегральные значения x, для которых выполняется уравнение. Коэффициенты будут предоставлены в качестве входных данных в порядке убывания или увеличения мощности. Вы можете считать все коэффициенты целыми числами .
Вход и выход
Входными данными будут коэффициенты уравнения в порядке убывания или увеличения мощности. Степень уравнения, т. Е. Максимальная мощность x, всегда на 1 меньше, чем общее количество элементов на входе.
Например:
[1,2,3,4,5] -> represents x^4 + 2x^3 + 3x^2 + 4x + 5 = 0 (degree = 4, as there are 5 elements)
[4,0,0,3] -> represents 4x^3 + 3 = 0 (degree = 3, as there are 3+1 = 4 elements)
Ваши выходные данные должны быть только различными целочисленными значениями x, которые удовлетворяют данному уравнению. Все входные коэффициенты являются целыми числами, и входной многочлен не будет нулевым многочленом . Если для данного уравнения нет решения, то результат не определен.
Если уравнение имеет повторяющиеся корни, отобразите этот конкретный корень только один раз. Вы можете вывести значения в любом порядке. Также предположим, что ввод будет содержать как минимум 2 числа.
Примеры
[1,5,6] -> (-3,-2)
[10,-42,8] -> (4)
[1,-2,0] -> (0,2)
[1, 1, -39, -121, -10, 168] -> (-4, -3, -2, 1, 7)
[1, 0, -13, 0, 36] -> (-3, -2, 2, 3)
[1,-5] -> (5)
[1,2,3] -> -
Обратите внимание, что уравнение во втором примере также имеет корень 0,2, но он не отображается, поскольку 0,2 не является целым числом.
счет
Это код-гольф , поэтому выигрывает самый короткий код (в байтах)!
Ответы:
MATL ,
1312 байтПопробуйте онлайн!
При этом используется тот факт, что для целочисленных коэффициентов абсолютное значение любого корня строго меньше суммы абсолютных значений коэффициентов.
объяснение
Рассмотрим ввод
[1 5 6]
в качестве примера.источник
X>t_w&:GyZQ~)
, но все же 13 байтШелуха ,
109 байт-1 байт благодаря Zgarb
Попробуйте онлайн!
объяснение
источник
ṁṡ
вместо,oṡ►a
если вы дедуплицируете позже.Haskell , 54 байта
Попробуйте онлайн!
Грубая сила и синтетическое разделение.
Разрушенный с UniHaskell и
-XUnicodeSyntax
Альтернативный раствор, 44 байта
Благодарю Ними.
Удачи в онлайн-тестировании , так как он проверяет все числа в
Int
диапазоне.источник
i
над[minBound..]
и уронить всюt
вещь. Звонитеf
с явнымиInt
списками, напримерf [1::Int,5,6]
. Конечно, это не заканчивается в разумные сроки.Bounded
типы останавливаются наmaxBound
, напримерprint [minBound::Bool ..]
.Python 2 + numpy,
959391103939182 байта-2 байта благодаря ovs
спасибо Луису Мендо за верхнюю / нижнюю границы корней
-10 байтов благодаря Mr. Xcoder
Попробуйте онлайн!
источник
numpy.polyval
экономит немало байтовWolfram Language (Mathematica) ,
5047422527 байтПопробуйте онлайн!
Обновление: с использованием факта Луиса Мендо, отыгравшего еще 3 байта
Получая небрежность с границами, мы можем уменьшить это еще на 5 байт на @ Не предложение дерева:
После публикации этого сообщения OP прокомментировал разрешение «нативных полиномов», так что вот 25-байтовое решение, которое принимает полином как входные данные. Это работает, потому что по умолчанию Mathematica делит полиномы на целые числа, и любые рациональные корни отображаются в такой форме,
m*x+b
что не соответствует шаблону.Как указал @alephalpha, это не удастся для случая, когда ноль является корнем, поэтому для исправления мы можем использовать
Optional
символ:
Это прекрасно разбирает Mathematica 11.0.1, но не работает и требует дополнительного набора скобок
b_:0
в версии 11.2. Это занимает до 27 байтов, плюс еще два после версии 11.0.1. Похоже, что "исправить" был введен здесьПопробуйте онлайн!
источник
#.#
вместоTr@Abs@#
: это хуже, но меньше байтов.Wolfram Language (Mathematica) ,
332631 байтИсправлена ошибка, отмеченная Келли Лоудер в комментариях.
Попробуйте онлайн!
Предыдущие неверные решения:
Я только что заметил, что для целочисленного решения вывод не определен вместо пустого списка; что позволяет удалить несколько байтов.
Попробуйте онлайн!
Теперь, если целочисленного решения не существует, функция возвращает
x
.Ранее:
Попробуйте онлайн!
источник
Union
это исправить.Solve
: список переменных может быть опущен.R ,
6159 байтОтдельное спасибо @mathmandan за то, что он указал на мой (неправильный) подход, можно сохранить и сыграть в гольф!
Попробуйте онлайн!
Принимает ввод как список коэффициентов в порядке возрастания , т.е.
c(-1,0,1)
представляет-1+0x+1x^2
.Используя рациональную корневую теорему, следующий подход почти работает, для 47 байтов:
Попробуйте онлайн!
-p:p
генерирует симметричный диапазон (с предупреждением) , используя только первый элементp
,a_0
. По теореме о рациональном корне все рациональные корниP
должны иметь форму, вp/q
которойp
делитсяa_0
иq
делитсяa_n
(плюс или минус). Следовательно, использование толькоa_0
достаточно для|a_0|>0
, как и для любогоq
,|p/q|<=a_0
. Однако когдаa_0==0
, как и тогда любое целое число делится0
, и, таким образом, это не удается.Тем не менее, Матмандан указывает, что на самом деле, в этом случае, это означает, что есть постоянный фактор,
x^k
который может быть учтен, и, предполагаяk
максимальный, мы видим, чтоЗатем мы применяем теорему Рационального Корня к
Q(x)
, и, какa_k
гарантируется, будет ненулевым по максимальностиk
,a_k
обеспечивает аккуратную оценку для целочисленных корнейQ
, а корниP
являются корнямиQ
наряду с нулем, поэтому мы будем иметь все целые корниP
путем применения этого метода.Это эквивалентно нахождению первого ненулевого коэффициента многочлена,
t=p[!!p][1]
и использованию его вместо наивногоp[1]
в качестве границ. Более того, поскольку диапазон-t:t
всегда содержит ноль, применениеP
этого диапазона все равно даст нам ноль в качестве корня, если это действительно так.ungolfed:
источник
max
абсолютные значения вместоsum
; это не изменило бы количество байтов, но это должно улучшить производительность.) В любом случае, да, жаль, что более короткая версия не работаетa_0==0
. Есть ли какой-то короткий путь в R для поиска первого (с возрастанием мощностей) ненулевого коэффициента и его использования вместо этого? Это будет соответствовать факторизации как можно большего числа x (сначала, конечно, вы должны будете также не забывать выводить данные0
, что, вероятно, будет стоить несколько байтов.)max
был бы более эффективным, но ко второму пункту, поскольку мне не нужно беспокоиться о выводе,0
поскольку он генерируется диапазоном-t:t
(гдеt
первый ненулевой коэффициент), он экономит 2 байта!Желе , 8 байт
Попробуйте онлайн!или как тестовый набор!
Как?
Исходя из ответа Луиса . Альтернатива .
источник
Ær+.Ḟ
?[1,2,3]
.[10,-42,8]
, не так ли?Октава ,
5949 байтПопробуйте онлайн!
Это порт моего R ответа . Единственное отличие состоит в том, что я должен явно использовать
sign(t)
иend
генерировать диапазон, и что он долженpolyval
вычислять полином.Принимает ввод как вектор строки коэффициентов в порядке убывания.
источник
Пари / ГП , 31 байт
Факторы полинома, и выбирает факторы, производные которых 1.
Попробуйте онлайн!
источник
C (gcc) ,
127126123 байтаl+~j++
вl-++j
.Попробуйте онлайн!
объяснение
C (gcc) , 517 байтов
Попробуйте онлайн!
источник
l+~j++
можно сыграть в гольфl-++j
Java 8,
141140 байтВдохновлен ответом @Rod 's Python 2 (его версия на 82 байта) .
Веселый вызов! Я, конечно, многому научился, исследуя полиномы и видя, как это сделали некоторые другие здесь.
Объяснение:
Попробуйте онлайн.
источник
Октава с символическим пакетом, 63 байта
Попробуйте онлайн!
источник
05AB1E , 8 байтов
Попробуйте онлайн!
источник
JavaScript (ES6), 97 байт
Принимает коэффициенты в порядке убывания мощности и выводит результаты в порядке убывания.
источник
Чисто ,
11091 байтПопробуйте онлайн!
источник
Python 2 , 89 байт
Попробуйте онлайн!
источник