แก้สมการเชิงเส้น


12

ความท้าทายนี้แต่ด้วยสเป็คที่ดีกว่า

สเป็ค

โปรแกรมของคุณจะใช้สมการเชิงเส้นที่มีตัวแปรเดียวและเอาท์พุทค่าของxx

อินพุต / แยกวิเคราะห์

  • ข้อมูลที่ป้อนจะมีเฉพาะตัวเลขตัวดำเนินการวงเล็บ ( ()) xและ=เครื่องหมาย (ซึ่งหมายความว่าไม่มีช่องว่าง)
  • วงเล็บจะมีความสมดุลเสมอ
  • จะต้องมีอย่างน้อย 1 xเสมอ xอาจจะนำหน้าด้วยตัวเลข
  • สมการทั้งหมดจะมีผลลัพธ์เดียว

จำนวนสามารถกำหนดได้โดยทำตามขั้นตอนเหล่านี้ จำนวนสามารถกำหนดได้โดย regex -?(\d+(\.\d+)?|\.\d+)นี้:


หากคุณไม่ได้พูด regex: ตัวเลขถูกกำหนดเป็น 0-9

  1. มันอาจจะมี-จุดเริ่มต้นของมันหมายถึงเชิงลบ
  2. จากนั้นอาจมีตัวเลขบางตัว หากไม่ใช่ตัวเลขใด ๆ จะมีจุดทศนิยม
  3. หากจุดทศนิยมมีอยู่อย่างน้อยหนึ่งหลักจะตามมา

จำนวน / มูลค่าที่ใหญ่ที่สุดจะถูกกำหนดโดยความสามารถของภาษาของคุณ


ประกอบการใด ๆ ของ: +-*/พวกเขามักจะปรากฏระหว่างตัวเลขและหรือวงเล็บ

วิธี(5)(5)นี้ไม่ได้เป็นอินพุตที่ถูกต้องเพื่อประโยชน์ของความเรียบง่าย


วงเล็บจะมีนิพจน์ที่ถูกต้องเสมอ (การรวมตัวเลขและ / หรือโอเปอเรเตอร์ที่ถูกต้อง) ไว้ภายใน เครื่องหมายวงเล็บแบบ "สมดุล" ถูกกำหนดเนื่องจากทุกคน(จะมีการปิดที่เกี่ยวข้อง)

การประเมินผล

  • ควรปฏิบัติตามลำดับของการดำเนินการและลำดับความสำคัญคือ (สูงสุดไปต่ำสุด):
    • วงเล็บ (ซ้อนกันลึกสุดก่อน)
    • การคูณและการหาร
    • การบวกและการลบ
  • หากโอเปอเรเตอร์สองรายการที่มีลำดับความสำคัญเท่ากันเกิดขึ้นคุณควรเลือกซ้าย -> ขวา

เอาท์พุต

คุณควรส่งออกผลลัพธ์ในบางวิธี หากคุณไม่ได้ผลลัพธ์เพียงผลลัพธ์จำนวนชี้แจงในคำตอบของคุณวิธีการส่งออกเป็น รูปแบบผลลัพธ์ของคุณควรสอดคล้องกัน ผลลัพธ์อาจเป็นทศนิยม แต่จะมีเหตุผลเสมอความแม่นยำนั้น จำกัด อยู่ที่ความแม่นยำของภาษาของคุณ เฉพาะในกรณีที่ภาษาของคุณไม่รองรับเลขทศนิยมคุณไม่จำเป็นต้องสนับสนุน

กฎระเบียบ

  • บิวด์อิน trivializing งานนี้ได้รับอนุญาตแต่คุณต้องเพิ่ม[uses built-in]อย่างชัดเจนในส่วนหัวของคำตอบ นี่เป็นการยกเว้นคำตอบของคุณจากการชนะ
  • "Built-in trivializing ภารกิจนี้" เป็นหนึ่งใน:
    • สิ่งที่ใช้ในสมการและส่งออกค่าสำหรับตัวแปร /
    • สิ่งที่จะทำให้สมการง่ายขึ้นอย่างสมบูรณ์
    • การใช้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

8
คุณบอกว่าบิวด์อินตัดสิทธิ์การส่งของคุณ แต่ให้ความกระจ่างในเรื่องนี้เพื่ออ้างถึงการดำเนินการที่แก้สมการและการแยกวิเคราะห์และสิ่งที่คล้ายกัน ฉันคิดว่ามันจะชัดเจนกว่าที่จะใช้คำที่แตกต่างเนื่องจากฉันคิดว่าการดำเนินการใด ๆ ที่มีชื่อเป็นตัวในตัว
xnor

คำตอบต้องแม่นยำแค่ไหน?
ข้อบกพร่อง

@MrPublic โปรแกรมของคุณจะใช้สมการเชิงเส้นที่มีตัวแปรเดียว ...
หลุยส์ Mendo

นอกจากนี้ 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("=")...จะใช้

Hyper-ungolfed:

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 แทน Function new
Ven

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

Ungolfed:

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)โดยการค้นหาความชันระหว่างสองจุดบนฟังก์ชัน จากนั้นค่าจะถูกแทรกลงในวิธีการของนิวตันซึ่งระบุถึงการประมาณของรูxx=x-(f(x)/f'(x))(ในรหัสเราใช้ 0 เป็นxค่าเริ่มต้น) ตั้งแต่นี้พบรากมันพบxค่าของเรา และเนื่องจากสมการนี้รับประกันว่าเป็นเส้นตรงการประมาณจะถูกต้อง



1

Mathcad [ใช้ในตัว]

ป้อนคำอธิบายรูปภาพที่นี่

Mathcad มีวิธีการแก้สมการสองแบบในตัว:

  • Symbolic solver (ใช้คำสำคัญแก้ปัญหา)
  • Solve Block (ใช้งานได้ทั้งในโหมดตัวเลขและสัญลักษณ์) บล็อกการแก้ไขเริ่มต้นด้วยคำสำคัญที่กำหนดตามชุดของนิพจน์ที่กำหนดเงื่อนไขที่น่าสนใจและปิดโดยหนึ่งในคำหลักที่แก้ปัญหาเช่นค้นหา (ซึ่งพบวิธีการแก้ปัญหาที่แน่นอน) หรือ MinErr (ซึ่งช่วยลดข้อผิดพลาดระหว่างเป้าหมายและ ทางออกใด ๆ )

สัญลักษณ์แก้ปัญหาค่อนข้างมีความสุขกับ y = x และส่งคืนโซลูชัน x = y

สำหรับผู้ที่ไม่คุ้นเคยกับ Mathcad ภาพด้านล่างนี้นำมาโดยตรงจากสมุดงาน WYSIWYGish Mathcad 15 การเปลี่ยนการแสดงออกใด ๆ ที่พวกเขาเขียนจะทำให้ Mathcad ประเมินคำตอบของมันใหม่และปรับปรุงการแสดงผลตามนั้น


ออกมาจากความอยากรู้ไม่ได้ใช้งานทำไม downvotes? ฉันสามารถเข้าใจได้ว่าความเรียบง่ายของมันอาจอยู่ที่รากของมัน แต่ในสาระสำคัญไม่แตกต่างจากโซลูชัน TI Basic ซึ่งเพิ่มการประมวลผลอินพุตจำนวนเล็กน้อยเพียงเล็กน้อยก่อนที่จะเรียกตัวแก้ปัญหาในตัว ไม่ได้ลงคะแนน
Stuart Bruff

1
จำนวนไบต์ที่แท้จริงของโปรแกรมนี้คืออะไร
Jo King

Downvotes อาจเป็นเพราะโซลูชันของคุณไม่สำคัญ - ดูที่'โซลูชันเล็ก ๆ น้อย ๆ คืออะไร' ใน meta

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.