解线性方程


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

输入无效

(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 您的程序将采用包含单个变量的线性方程式……
Luis Mendo

另外,JavaScript是否可以eval算是平凡的挑战?还有,new Function(...)计数形式吗?
科纳·奥布莱恩

@CᴏɴᴏʀO'Bʀɪᴇɴ取决于您的用途。但是,假设您使用的是JavaScript,我肯定不会看到它将如何
平息

Answers:


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语法而不是Function new剃掉很多东西
2016年

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)=0x将等于我们要求解的值。因此,当我们找到这个新函数的根时,它将是我们想要的x值。然后,f'(x)通过找到函数上两点之间的斜率来找到导数。然后,这些值被简单地插入到牛顿方法,其根的近似状态xx=x-(f(x)/f'(x))(在代码中,我们使用0作为初始x值)。既然找到根源,那就找到我们的x价值。并且由于该方程被保证是线性的,因此近似将是精确的。



1

Mathcad,[使用内置]

在此处输入图片说明

Mathcad具有两种内置的求解此类方程的方法:

  • 符号求解器(使用关键字solve)
  • 求解块(在数字和符号模式下均有效)。Solve Block以关键字Given开头,后跟一组定义感兴趣条件的表达式,然后以其中一个求解关键字关闭,例如Find(找到确切的解)或MinErr(最小化目标和目标之间的误差)。任何解决方案)。

符号求解器对y = x非常满意,并返回解决方案x = y。

对于不熟悉Mathcad的人,下图直接取自WYSIWYGish Mathcad 15工作簿。更改书写在其中的任何表达式都会使Mathcad重新评估其答案并相应地更新显示。


出于好奇,为什么要投票?我可以理解,它的简单性可能是其根本原因,但从本质上看,它与TI Basic解决方案没有什么不同,TI Basic解决方案在调用内置求解器之前仅添加了少量输入处理,但是没有被否决。
斯图尔特·布鲁夫

1
该程序的实际字节数是多少?
Jo King

投票否决的原因可能是您的解决方案不重要-请参阅“什么是简单的解决方案?” 在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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.