이 도전 은 더 나은 사양입니다.
투기
프로그램은 단일 변수를 포함하는 선형 방정식을 취하고 x
의 값을 출력합니다 x
.
입력 / 파싱
- 입력에는 숫자, 연산자, 괄호 (
()
)x
및=
기호 만 포함됩니다 ( 공백 없음). - 괄호는 항상 균형을 유지합니다.
- 항상 1 이상이 있어야
x
합니다.x
앞에 숫자가 올 수 있습니다. - 모든 방정식은 정확히 하나의 결과를 갖습니다.
수는 다음 단계에 따라 정의 할 수 있습니다. 정규식으로 숫자를 정의 할 수 있습니다 : -?(\d+(\.\d+)?|\.\d+)
.
정규식을 사용하지 않으면 숫자는 다음과 같이 정의됩니다. 0-9
-
시작 부분에 음수를 나타낼 수 있습니다.- 그런 다음 숫자 가있을 수 있습니다. 숫자가 없으면 소수점이 있습니다.
- 소수점이 있으면 하나 이상의 숫자가 뒤에옵니다.
가장 큰 숫자 / 값은 언어 능력에 의해 정의됩니다.
운영자 : 중입니다 +-*/
, 그들은 항상 숫자 사이에 표시되며, 또는 괄호
이는 (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)