Это вызов, но с лучшей спецификацией.
спекуляция
Ваша программа возьмет линейное уравнение, содержащее одну переменную, x
и выведет значение x
.
Ввод / Разбор
- Входные данные будут содержать только числа, операторы, скобки (
()
)x
и=
знак (это означает отсутствие пробелов). - Круглая скобка всегда будет сбалансированной.
- Всегда будет хотя бы 1
x
.x
Может предшествовать число. - Все уравнения точно будут иметь один результат.
Число может быть определено, выполнив следующие действия. Номер может быть определен с помощью регулярного выражения: -?(\d+(\.\d+)?|\.\d+)
.
Если вы не говорите регулярное выражение: цифра определяется как 0-9
- Может иметь
-
в начале, что означает отрицательный - Тогда могут быть некоторые цифры. Если они не состоят из цифр, будет десятичная точка
- Если существует десятичная точка, за ней будет следовать хотя бы одна цифра
Наибольшее число / значение будет определяться возможностями вашего языка.
Оператор является любой из: +-*/
они всегда будут появляться между числами, и или скобка
это означает (5)(5)
недопустимый ввод для простоты.
Круглая скобка всегда будет содержать правильное выражение (допустимая комбинация чисел и / или операторов) внутри них. «Сбалансированная» скобка определяется как каждая (
будет иметь связанный закрытие)
оценка
- Порядок операций должен соблюдаться, и приоритеты (от наивысшего к низшему):
- Круглая скобка (наиболее глубоко вложенная в первую очередь)
- Умножение и деление
- Сложение и вычитание
- Если встречаются два оператора с одинаковым приоритетом, предпочтительнее идти налево -> направо
Выход
Вы должны вывести результат каким-то образом. Если вы не выводите только результат числа, уточните в своем ответе, как выводится результат. Ваш выходной формат должен быть согласованным. Вывод может быть десятичным, но он всегда будет рациональным, точность ограничена точностью вашего языка. Только если ваш язык не поддерживает арифметику с плавающей запятой, вам не нужно ее поддерживать.
правила
- Разрешены встроенные средства, упрощающие эту задачу, но вы должны четко добавить
[uses built-in]
в заголовок ответа. Это освобождает ваш ответ от победы - «Встроенные тривиализирующие эту задачу» - это любое из:
- Нечто, принимающее уравнение и выводящее значение для переменной
- Что-то, что полностью упростит уравнение
- Использование
eval
или связанная функция для выполнения значительного количества анализа. Использованиеeval
и связанные с ними функции запрещены, если они используются (с минимальной модификацией входных данных) для решения линейных уравнений. - Если вы сомневаетесь, просто спросите в комментарии.
- Встроенные модули, которые разбирают уравнения, разрешены
Примеры
3+4=x
7
4+x=5
1
3+3*3=x
12
3x-4=7+2x
11
3--1=x
4
3*(2+4x)=7x-4
-2
1.2+2.3x=5.8
2
10=4x
2.5
НЕВЕРНЫЕ Входы:
(5)(4)=x no operator between (5) and (4)
5(x+3)=2 no operator 5 and (...)
x=y the only variable is x
4=3 there is no x
x+3=x-7 no solution
x=x infinite solutions
+5=x + is not an unary operator. -5=x would be valid though
1/(x-3)=5 Nonlinear
3/x Nonlinear
источник
eval
считается ли JavaScript тривиальным вызовом? Кроме того, формыnew Function(...)
подсчета?Ответы:
JavaScript ES6, 246 байт
Еще можно поиграть в гольф, но, по крайней мере, это решение!
Назовите функцию,
n=>{n=n.split("=")...
чтобы использовать ее.Hyper-ungolfed:
Это использует сводный подход. (Я не уверен, что это то, что называется алгоритмом, просто придуманное мной имя.) Сначала он собирает, какое направление искать с нуля (т. Е. В каком направлении будут пересекаться склоны двух сторон уравнений) и ищет значение. Как только он находит точку минимальной разницы, он идет к этой точке и уменьшает приращение поиска. В конечном итоге это дает точное решение, которое нам нужно.
источник
JavaScript (Node.js) ,
10693 байтаПопробуйте онлайн!
-13 байт благодаря @tsh
Ungolfed:
Explaination:
Это решение работает по методу Ньютона для поиска корней. Код вычитает правую часть уравнения с левой стороны, так что , когда
f(x)=0
,x
будет равно значению Решаю для. Поэтому, когда мы найдем корень этой новой функции, это будет нашим желаемымx
значением. Затем он находит производнуюf'(x)
, находя наклон между двумя точками на функции. Затем эти значения просто вставляется в метод Ньютона , который гласит , для приближения корняx
,x=x-(f(x)/f'(x))
(в коде, мы используем 0 в качестве начальногоx
значения). Так как это находит корни, оно находит нашуx
ценность. А поскольку уравнение гарантированно будет линейным, аппроксимация будет точной.источник
Mathcad, [использует встроенный]
Mathcad имеет два встроенных метода решения таких уравнений:
Символический решатель вполне доволен y = x и возвращает решение x = y.
Для тех, кто не знаком с Mathcad, изображение ниже взято непосредственно из книги WYSIWYGish Mathcad 15. Изменение любого выражения, в котором они написаны, заставит Mathcad пересмотреть свой ответ и соответствующим образом обновить отображение.
источник
Аксиома, 214 байт [использует встроенный]
Для некоторой ошибки будет возвращено% i, для других типов ошибок функция остановлена из системы, что-то еще, так как 1-2 кажется не языковым ... test:
источник