Розв’яжіть лінійне рівняння


12

Цей виклик, але з кращими характеристиками.

Спец

Ваша програма візьме лінійне рівняння, що містить одну змінну xі виведе значення x.

Введення / розбір

  • Вхід буде містити лише числа, оператори, дужки ( ()) x, та =знак (це означає, що пробілу немає).
  • Парентез завжди буде врівноваженим.
  • Завжди буде як мінімум 1 x. Ану xможе передувати число.
  • Усі рівняння точно матимуть один результат.

Число може бути визначено, виконавши такі дії. Номер може бути визначений з допомогою регулярного виразу: -?(\d+(\.\d+)?|\.\d+).


Якщо ви не розмовляєте з регулярними виразами: цифра визначається як 0-9

  1. Це може бути -на початку, що означає негатив
  2. Тоді можуть бути деякі цифри. Якщо вони не будуть жодними цифрами, буде десяткова крапка
  3. Якщо існує десяткова крапка, за нею буде принаймні одна цифра

Найбільше число / значення буде визначено можливостями вашої мови.


Оператор є будь-який з: +-*/вони завжди будуть з'являтися між числами, і чи дужка

це означає, що (5)(5)це не є дійсним для простоти.


Парентез завжди міститиме дійсне вираження (дійсна комбінація чисел та / або операторів) всередині них. "Збалансована" дужка визначається, оскільки кожна (матиме пов'язане з цим закриття)

Оцінка

  • Порядок операцій слід дотримуватися, а пріоритети (найвищі до найнижчих):
    • Парентез (найбільш глибоко вкладений перший)
    • Множення та ділення
    • Додавання і віднімання
  • Якщо трапляються два оператори з однаковим пріоритетом, вам слід віддати перевагу вліво -> праворуч

Вихідні дані

Ви повинні певним чином вивести результат. Якщо ви не виведете результат лише з числа, уточніть у своїй відповіді, як виводиться результат. Ваш вихідний формат повинен відповідати. Вихід може бути десятковою, але це завжди буде раціонально, точність обмежена точністю вашої мови. Тільки якщо ваша мова не підтримує арифметику з плаваючою комою, вам не потрібно її підтримувати.

Правила

  • Вбудовані тривіалізації цього завдання дозволені, але ви повинні чітко додати [uses built-in]чітко до заголовка відповіді. Це звільняє вашу відповідь від виграшу
  • "Вбудовані модулі, які реалізують це завдання", це будь-яке з:
    • Щось, що приймає рівняння і виводить значення для a / змінної
    • Щось, що повністю спростить рівняння
    • Використання 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

INVALID Введення:

(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

8
Ви говорите, що вбудовані файли дискваліфікують ваше подання, але уточнюйте це, щоб посилатися лише на операції, які виконують розв'язання рівнянь та аналіз рівнянь тощо. Я думаю, було б зрозуміліше використовувати інший термін, оскільки я вважаю, що будь-яка названа операція є вбудованою.
xnor

Наскільки точними повинні бути відповіді?
flawr

@MrPublic Ваша програма візьме лінійне рівняння, що містить єдину змінну ...
Луїс Мендо

Також, чи вважає JavaScript evalвиправданням проблему? Також, чи були б форми new Function(...)рахунку?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ залежить від того, для чого ви його використовуєте. Але якщо припустити, що ви використовуєте JavaScript, я не бачу, як це переконає проблему настільки впевнено
Downgoat

Відповіді:


3

JavaScript ES6, 246 байт

Ще потрібно зробити щось з гольфу, але принаймні це рішення!

C=a=>new Function("x","return "+a.replace(/(\d)x/g,"$1*x"));n=>{n=n.split("=");t=Math.abs,r=C(n[0]),c=C(n[1]),a=0,i=r(a)-c(a);a++;v=r(a)-c(a);o=t(i)<t(v)?-1:1;for(u=1/0;r(a)!==c(a);)a+=o,e=t(r(a)-c(a)),e>u&&(u=1/0,o/=10),u=Math.min(e,u);return a}

Назвіть функцію n=>{n=n.split("=")...для її використання.

Гіпергонограми:

function solveLinear(equation){
    equation = equation.split("=");
    var abs = Math.abs;
    var LHS = convertToFunction(equation[0]), RHS = convertToFunction(equation[1]);
    var pivot = 0;
    var dir;
    var dir1 = LHS(pivot) - RHS(pivot);
    pivot++;
    var dir2 = LHS(pivot) - RHS(pivot);
    if(abs(dir1)<abs(dir2)) dir = -1;
    else dir = 1;
    var dif, minDif = Infinity;
    while(LHS(pivot) !== RHS(pivot)){
        pivot += dir;
        dif = abs(LHS(pivot) - RHS(pivot));
        if(dif > minDif){
            minDif = Infinity;
            dir /= 10;
        }
        minDif = Math.min(dif, minDif);
        console.log(pivot,dir,dif,minDif);
    }
    return {
        x: pivot,
        LHS: LHS,
        RHS: RHS
    };
}

Для цього використовується стрижневий підхід. (Я не впевнений, що так називається алгоритм, просто ім'я, яке я вигадав.) Спочатку він збирає, в якому напрямку шукати з нуля (тобто, в який спосіб будуть перетинатися нахили двох сторін рівнянь) і шукає значення. Як тільки він знаходить точку мінімальної різниці, він переходить до цієї точки і зменшує приріст пошуку. Це в кінцевому підсумку дає максимально точне рішення, яке нам потрібно.


Я думаю, ви могли б добре поголитись, використовуючи синтаксис eval + ES6 замість Функції new
Вен,

2

JavaScript (Node.js) , 106 93 байт

a=>eval(`f=x=>${a[R='replace'](/(\d)x/g,"$1*x")[R]("=","-(")[R](/-/g,"+-")})`)(0)/(f(0)-f(1))

Спробуйте в Інтернеті!

-13 байт завдяки @tsh

Безголівки:

var h=a=>{
  a=a.replace(/(\d)x/g,"$1*x").replace("=","-(").replace("--","- -"); //get into an eval-able form
  var f=x=>eval(a+")");
  var df=(f(1)-f(0))/(1-0) //derivative or slope of the function
  var x=0;
  return x-(f(x)/df); //newton's method
}

Пояснення:

Це рішення працює за методом Ньютона для пошуку коренів. Код віднімає праву частину рівняння з лівої сторони так, що коли f(x)=0, xбуде дорівнює значенню, для якого ми розв’язуємо. Тому, коли ми знайдемо корінь цієї нової функції, це буде наше бажане xзначення. Тоді вона знаходить похідну f'(x), знаходячи нахил між двома точками функції. Потім ці значення просто вставляється в метод Ньютона , який говорить , для наближення кореня x, x=x-(f(x)/f'(x))(в коді, ми використовуємо 0 в якості початкового xзначення). Оскільки це знаходить коріння, воно знаходить нашу xцінність. А оскільки рівняння гарантовано лінійне, наближення буде точним.



1

Mathcad, [використовує вбудований]

введіть тут опис зображення

Mathcad має два вбудовані методи розв’язання таких рівнянь:

  • Символічний вирішувач (використовує рішення ключового слова)
  • Розв’язати блок (який працює як в числовому, так і символічному режимах). Блок вирішення починається з ключового слова "Дано", супроводжується набором виразів, що визначають умови, що цікавлять, і закривається одним із вирішальних ключових слів, таким як Find (який знаходить точне рішення) або MinErr (що мінімізує помилку між ціллю та будь-яке рішення).

Символічний вирішувач цілком задоволений y = x і повертає рішення x = y.

Для тих, хто не знає Mathcad, зображення нижче взято безпосередньо з робочої книги WYSIWYGish Mathcad 15. Зміна будь-якого з виразів, де вони записані, призведе до того, що Mathcad переоцінить свою відповідь і відповідно оновить дисплей.


Чому з простою цікавістю, навіщо спустошення? Я можу зрозуміти, що його простота може лежати в корені цього, але, по суті, вона нічим не відрізняється від рішення TI Basic, що лише додає невелику кількість обробки входу перед тим, як викликати вбудований розв'язувач, і все ж це не було прийнято до уваги
Стюарт Брюфф

1
Який фактичний кількість байтів у цій програмі?
Джо Кінг

Погіршення голосів, ймовірно, тому що ваше рішення є тривіальним - див. "Що таке тривіальне рішення?" на мета.

0

Аксіома, 214 байт [використовує вбудований]

q(t:EQ POLY FLOAT):Any==(a:=[variables(lhs t),variables(rhs t)];a.1~=[x]and a.1~=[]=>%i;a.2~=[x]and a.2~=[]=>%i;a.1=[]and a.2=[]=>%i;a.1=[x]and degree(lhs t,x)>1=>%i;a.2=[x]and degree(rhs t,x)>1=>%i;rhs solve(t).1)

Для деяких помилок поверне% i, для інших типів помилок функція зупинена від системи, щось інше, як 1--2, здається, не в мові ... тест:

(72) -> q(x+3=9)
   (72)  6.0
                                  Type: Complex Fraction Polynomial Float
(73) -> q(3+4=x)
   (73)  7.0
                                  Type: Complex Fraction Polynomial Float
(74) -> q(4+x=5)
   (74)  1.0
                                  Type: Complex Fraction Polynomial Float
(75) -> q(3+3*3=x)
   (75)  12.0
                                  Type: Complex Fraction Polynomial Float
(76) -> q(3*x-4=7+2*x)
   (76)  11.0
                                  Type: Complex Fraction Polynomial Float
(77) -> q(3--1=x)
  Line   1: q(3--1=x)
           .AB
  Error  A: Missing mate.
  Error  B: syntax error at top level
  Error  B: Possibly missing a )
   3 error(s) parsing
(77) -> q(3*(2+4*x)=7*x-4)
   (77)  - 2.0
                                  Type: Complex Fraction Polynomial Float
(78) -> q(1.2+2.3*x=5.8)
   (78)  2.0
                                  Type: Complex Fraction Polynomial Float
(79) -> q(10=4*x)
   (79)  2.5
                                  Type: Complex Fraction Polynomial Float
(80) -> q((5)(4)=x)
   Cannot find a definition or applicable library operation named 5
      with argument type(s)
                           PositiveInteger

  Perhaps you should use "@" to indicate the required return type,
  or "$" to specify which version of the function you need.
(80) -> q(5(x+3)=2 )
   (80)  %i
                                                    Type: Complex Integer
(81) -> q(x=y)
   (81)  %i
                                                    Type: Complex Integer
(82) -> q(4=3)
   (82)  %i
                                                    Type: Complex Integer
(83) -> q(x+3=x-7)
   >> Error detected within library code:
   inconsistent equation
protected-symbol-warn called with (NIL)
(83) -> q(x=x)
   >> Error detected within library code:
   equation is always satisfied
protected-symbol-warn called with (NIL)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.