Giải phương trình tuyến tính


12

Thử thách này nhưng với một thông số tốt hơn.

Thông số kỹ thuật

Chương trình của bạn sẽ có một phương trình tuyến tính chứa một biến duy nhất xvà xuất giá trị của x.

Nhập / phân tích cú pháp

  • Đầu vào sẽ chỉ chứa số, toán tử, dấu ngoặc đơn ( ()) x=dấu (điều này có nghĩa là không có khoảng trắng).
  • Dấu ngoặc sẽ luôn được cân bằng.
  • Sẽ luôn có ít nhất 1 x. An xcó thể được đi trước bởi một số.
  • Tất cả các phương trình chính xác sẽ có một kết quả.

Một số có thể được xác định bằng cách làm theo các bước sau. Một số có thể được xác định bởi regex : -?(\d+(\.\d+)?|\.\d+).


Nếu bạn không nói regex: Một chữ số được định nghĩa là 0-9

  1. Nó có thể có một -ở đầu của nó biểu thị tiêu cực
  2. Sau đó có thể có một số chữ số. Nếu chúng không có bất kỳ chữ số nào thì sẽ có dấu thập phân
  3. Nếu một dấu thập phân tồn tại, ít nhất một chữ số sẽ theo sau nó

Số / giá trị lớn nhất sẽ được xác định bởi khả năng ngôn ngữ của bạn.


Một toán tử là bất kỳ : +-*/, chúng sẽ luôn xuất hiện giữa các số và hoặc dấu ngoặc đơn

điều này có nghĩa (5)(5)không phải là một đầu vào hợp lệ vì đơn giản.


Dấu ngoặc đơn sẽ luôn chứa một biểu thức hợp lệ (một tổ hợp số và / hoặc toán tử hợp lệ) bên trong chúng. Dấu ngoặc đơn "Cân bằng" được định nghĩa vì mọi (sẽ có kết thúc đóng)

Đánh giá

  • Thứ tự của các hoạt động nên được tuân theo và các ưu tiên là (cao nhất đến thấp nhất):
    • Dấu ngoặc đơn (được lồng sâu nhất trước)
    • Nhân & chia
    • Phép cộng và phép trừ
  • Nếu hai toán tử có cùng mức ưu tiên xảy ra, bạn nên đi sang trái -> phải

Đầu ra

Bạn nên xuất kết quả theo một cách nào đó. Nếu bạn không xuất kết quả chỉ là số, hãy làm rõ trong câu trả lời của bạn về cách xuất ra. Định dạng đầu ra của bạn phải nhất quán. Đầu ra có thể là số thập phân, nhưng nó sẽ luôn hợp lý, độ chính xác bị giới hạn ở độ chính xác của ngôn ngữ của bạn. Chỉ khi ngôn ngữ của bạn không hỗ trợ số học dấu phẩy động, bạn không cần hỗ trợ ngôn ngữ đó.

Quy tắc

  • Việc xây dựng tầm thường hóa nhiệm vụ này được cho phép nhưng , bạn phải thêm [uses built-in]rõ ràng vào tiêu đề của câu trả lời. Điều này miễn cho câu trả lời của bạn từ chiến thắng
  • Một "tích hợp tầm thường hóa nhiệm vụ này" là bất kỳ:
    • Một cái gì đó có trong một phương trình và đưa ra giá trị cho a / biến
    • Một cái gì đó sẽ hoàn toàn đơn giản hóa một phương trình
    • Sử dụng evalhoặc một chức năng liên quan để thực hiện một số lượng đáng kể phân tích cú pháp. Việc sử dụng evalvà các hàm liên quan không được phép nếu chúng được sử dụng để (với sự điều chỉnh tối thiểu cho đầu vào) giải phương trình tuyến tính.
    • Nếu bạn nghi ngờ, chỉ cần hỏi trong một nhận xét.
  • Được xây dựng mà phân tích phương trình được phép

Ví dụ

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

Đầu vào 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
Bạn nói rằng các phần dựng sẵn không đủ điều kiện để gửi của bạn, nhưng làm rõ điều này để chỉ đề cập đến các hoạt động giải phương trình và phân tích cú pháp và tương tự. Tôi nghĩ rằng sẽ rõ ràng hơn khi sử dụng một thuật ngữ khác, vì tôi nghĩ về bất kỳ hoạt động được đặt tên nào là tích hợp.
xnor

Làm thế nào chính xác để trả lời phải được?
flawr

@MrPublic Chương trình của bạn sẽ có một phương trình tuyến tính chứa một biến duy nhất ...
Luis Mendo

Ngoài ra, JavaScript có evalđược coi là tầm thường hóa thách thức không? Ngoài ra, sẽ hình thức new Function(...)đếm?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ phụ thuộc vào những gì bạn sử dụng nó cho. Nhưng giả sử bạn đang sử dụng JavaScript Tôi không thấy thế nào nó sẽ tầm thường hóa thách thức như vậy chắc chắn
Downgoat

Câu trả lời:


3

JavaScript ES6, 246 byte

Vẫn còn một số việc phải chơi golf, nhưng ít nhất đó là một giải pháp!

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}

Đặt tên cho hàm n=>{n=n.split("=")...để sử dụng nó.

Siêu nhân:

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
    };
}

Điều này sử dụng một cách tiếp cận trục. (Tôi không chắc đây có phải là thuật toán được gọi không, chỉ là một tên tôi đã phát minh ra.) Trước tiên, nó tập hợp hướng tìm kiếm từ 0 (nghĩa là đường dốc của hai cạnh của phương trình sẽ giao nhau) và tìm kiếm giá trị Khi nó tìm thấy một điểm khác biệt tối thiểu, nó sẽ đi đến điểm đó và giảm mức tăng tìm kiếm. Điều này cuối cùng mang lại chính xác như một giải pháp chúng ta cần.


Tôi nghĩ rằng bạn có thể cạo một chút tốt bằng cách sử dụng cú pháp eval + ES6 thay vì Chức năng mới
Ven

2

JavaScript (Node.js) , 106 93 byte

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

Hãy thử trực tuyến!

-13 byte nhờ @tsh

Ung dung:

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
}

Giải thích:

Giải pháp này hoạt động theo phương pháp của Newton để tìm rễ. Mã này trừ đi phía bên phải của phương trình từ phía bên trái, sao cho khi nào f(x)=0, xsẽ bằng giá trị mà chúng ta đang giải quyết. Do đó, khi chúng tôi tìm thấy gốc của hàm mới này, nó sẽ là xgiá trị mong muốn của chúng tôi . Sau đó, nó tìm đạo hàm f'(x)bằng cách tìm độ dốc giữa hai điểm trên hàm. Sau đó, các giá trị được chèn đơn giản vào phương thức của Newton, trong đó nêu rõ giá trị gần đúng của gốc x, x=x-(f(x)/f'(x))(trong mã, chúng tôi sử dụng 0 làm xgiá trị ban đầu ). Vì điều này tìm thấy gốc rễ, nó tìm thấy xgiá trị của chúng tôi . Và vì phương trình được đảm bảo là tuyến tính, nên phép tính gần đúng sẽ chính xác.



1

Mathcad, [sử dụng tích hợp]

nhập mô tả hình ảnh ở đây

Mathcad có hai phương pháp tích hợp để giải các phương trình đó:

  • Trình giải tượng trưng (sử dụng giải từ khóa)
  • Solve Block (hoạt động ở cả chế độ số và ký hiệu). Khối giải quyết bắt đầu bằng từ khóa Đã cho, theo sau một tập hợp các biểu thức xác định các điều kiện quan tâm và được đóng bởi một trong các từ khóa giải, chẳng hạn như Tìm (tìm một giải pháp chính xác) hoặc MinErr (giúp giảm thiểu lỗi giữa mục tiêu và bất kỳ giải pháp).

Người giải biểu tượng khá hài lòng với y = x và trả về giải pháp x = y.

Đối với những người không quen thuộc với Mathcad, hình ảnh dưới đây được lấy trực tiếp từ sách bài tập WYSIWYGish Mathcad 15. Thay đổi bất kỳ biểu thức nào được viết sẽ khiến Mathcad đánh giá lại câu trả lời của nó và cập nhật màn hình cho phù hợp.


Vì tò mò nhàn rỗi, tại sao các downvote? Tôi có thể hiểu rằng sự đơn giản của nó có thể là gốc rễ của nó, nhưng về bản chất nó không khác gì giải pháp TI Basic, chỉ thêm một lượng nhỏ xử lý đầu vào trước khi gọi bộ giải tích hợp không bị hạ thấp.
Stuart Bruff

1
Số byte thực tế của chương trình này là gì?
Jo King

Các downvote có khả năng vì giải pháp của bạn là tầm thường - xem 'Giải pháp tầm thường là gì?' trên meta.

0

Tiên đề, 214 byte [sử dụng tích hợp]

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 với một số lỗi sẽ trả về% i, đối với loại lỗi khác, chức năng bị dừng khỏi hệ thống, một cái gì đó khác như 1--2 dường như không có ngôn ngữ ... kiểm tra:

(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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.