태그 보관물: parsing

parsing

선형 방정식 풀기 다음 단계에 따라 정의 할

이 도전 은 더 나은 사양입니다.

투기

프로그램은 단일 변수를 포함하는 선형 방정식을 취하고 x의 값을 출력합니다 x.

입력 / 파싱

  • 입력에는 숫자, 연산자, 괄호 ( ()) x=기호 만 포함됩니다 ( 공백 없음).
  • 괄호는 항상 균형을 유지합니다.
  • 항상 1 이상이 있어야 x합니다. x앞에 숫자가 올 수 있습니다.
  • 모든 방정식은 정확히 하나의 결과를 갖습니다.

수는 다음 단계에 따라 정의 할 수 있습니다. 정규식으로 숫자를 정의 할 수 있습니다 : -?(\d+(\.\d+)?|\.\d+).


정규식을 사용하지 않으면 숫자는 다음과 같이 정의됩니다. 0-9

  1. -시작 부분에 음수를 나타낼 수 있습니다.
  2. 그런 다음 숫자 가있을 있습니다. 숫자가 없으면 소수점이 있습니다.
  3. 소수점이 있으면 하나 이상의 숫자가 뒤에옵니다.

가장 큰 숫자 / 값은 언어 능력에 의해 정의됩니다.


운영자 : 중입니다 +-*/, 그들은 항상 숫자 사이에 표시되며, 또는 괄호

이는 (5)(5)단순성을 위해 올바른 입력이 아님을 의미 합니다.


괄호 안에는 항상 유효한 표현식 (숫자 및 / 또는 연산자의 유효한 조합)이 포함됩니다. “균형”괄호는 모든 (관련 마감이있을 때 정의됩니다.)

평가

  • 작업 순서를 따라야하며 우선 순위는 다음과 같습니다 (최고에서 최하로).
    • 괄호 (가장 깊은 중첩 우선)
    • 곱셈과 나눗셈
    • 덧셈과 뺄셈
  • 우선 순위가 같은 두 연산자가 발생하면 왼쪽-> 오른쪽으로 이동하는 것이 좋습니다

산출

어떤 방식 으로든 결과를 출력해야합니다. 숫자 결과 만 출력하지 않으면 출력에서 ​​출력 방법을 명확하게 설명하십시오. 출력 형식은 일관성이 있어야합니다. 출력은 10 진수 일 수 있지만 항상 합리적이며 정밀도는 언어의 정밀도로 제한됩니다. 언어가 부동 소수점 산술을 지원하지 않는 경우 에만 지원할 필요가 없습니다.

규칙

  • 이 작업을 사소한 내장 작업은 허용 되지만[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


답변

자바 스크립트 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("=")...사용할 함수의 이름을 지정하십시오 .

하이퍼 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
    };
}

이것은 피벗 접근법을 사용합니다. (이것이 알고리즘이 무엇인지, 확실하게 내가 발명 한 이름인지 확실하지 않습니다.) 먼저 검색 할 방향을 0에서 검색합니다 (즉, 방정식의 양면 기울기가 교차하는 방식). 값을 찾습니다. 차이가 최소 인 지점을 찾으면 해당 지점으로 이동하여 검색 증분을 줄입니다. 이것은 결국 우리가 필요로하는 솔루션의 정확한 결과를 낳습니다.


답변

자바 스크립트 (Node.js) , 106 93 바이트

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

온라인으로 사용해보십시오!

@tsh 덕분에 -13 바이트

언 골프 드 :

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가치를 찾습니다 . 그리고 방정식은 선형으로 보장되므로 근사값은 정확합니다.


답변

Mathcad, [내장 사용]

Mathcad에는 이러한 방정식을 해결하는 두 가지 기본 제공 방법이 있습니다.

  • 기호 솔버 (키워드 해결 사용)
  • 블록 해결 (숫자 및 기호 모드 모두에서 작동). Solve Block은 주어진 키워드로 시작하여 관심 조건을 정의하는 일련의 표현식을 따르고 찾기 (정확한 솔루션을 찾는) 또는 MinErr (목표와 모든 솔루션).

기호 솔버는 y = x에 매우 만족하며 솔루션 x = y를 반환합니다.

Mathcad에 익숙하지 않은 사용자를 위해 아래 이미지는 WYSIWYGish Mathcad 15 통합 문서에서 직접 가져온 것입니다. 작성된 표현을 변경하면 Mathcad가 답을 재평가하고 그에 따라 디스플레이를 업데이트합니다.


답변

공리, 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)

답변