線形方程式を解く


12

この課題は、より良い仕様です。

スペック

プログラムは、単一の変数を含む線形方程式を取り、xの値を出力しますx

入力/解析

  • 入力には、数字、演算子、括弧(())、、xおよび=記号のみが含まれます(これは空白がないことを意味します)。
  • 括弧は常にバランスが取れています。
  • 常に少なくとも1つありxます。のx前に数字を付けることができます。
  • すべての方程式の結果は1つになります。

番号は、以下の手順で定義することができます。数値は、正規表現で定義できます-?(\d+(\.\d+)?|\.\d+)


正規表現を話さない場合:数字は次のように定義されます 0-9

  1. それがあるかもしれません -冒頭に負の意味
  2. そして、そこにいくつかの桁です。それらが数字でない場合、小数点があります
  3. 小数点が存在する場合、少なくとも1桁がそれに続きます

最大の数値/値は、言語の機能によって定義されます。


オペレータは、のいずれかであります:+-*/、彼らは常に数字、または括弧の間に表示されます

これは(5)(5)、簡単にするために有効な入力ではないことを意味します。


カッコ内には、常に有効な式(数字や演算子の有効な組み合わせ)が含まれます。「バランスのとれた」括弧は、すべて(に関連する終了があるため定義されます)

評価

  • 操作の順序に従う必要があり、優先順位は(最高から最低)です。
    • 括弧(最も深くネストされた最初)
    • 乗算と除算
    • 加算と減算
  • 同じ優先順位の2つの演算子が発生した場合は、左->右に進むことをお勧めします

出力

結果を何らかの方法で出力する必要があります。数値の結果だけを出力しない場合は、出力の出力方法を回答で明確にします。出力形式は一貫している必要があります。出力は小数でもかまいませんが、常に合理的であり、精度は言語の精度に制限されます。ご使用の言語が浮動小数点演算をサポートしていない場合にのみ、サポートする必要はありません。

ルール

  • このタスクを単純化するビルトインは許可されます、明確に追加する必要あります[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

答えはどれくらい正確でなければなりませんか?
-flawr

@MrPublic プログラムは、単一の変数を含む線形方程式を取ります...
ルイスメンドー

また、JavaScript evalは課題を単純化するものと見なされますか?また、new Function(...)カウントの形式でしょうか?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴは、使用目的に依存します。しかし、あなたにはJavaScript Iを使用していると仮定すると、それはそう確か挑戦を矮小化する方法が表示されない
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("=")...使用する関数に名前を付けます。

ハイパーゴルフ:

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

これは、ピボットアプローチを使用します。(これがアルゴリズムと呼ばれるものかどうかはわかりませんが、私が発明した名前です。)最初にゼロから検索する方向(つまり、方程式の両側の勾配が交差する方法)を収集します。値を探します。最小の差のポイントが見つかると、そのポイントに進み、検索の増分を減らします。これにより、最終的に私たちが必要とする正確なソリューションが得られます。


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))

オンラインでお試しください!

@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)=0x我々は解決された値に等しくなります。したがって、この新しい関数のルートが見つかると、それが目的のx値になります。次にf'(x)、関数の2点間の勾配を見つけることにより、導関数を見つけます。次いで、値は、単にルートの近似に述べニュートン法に挿入されxx=x-(f(x)/f'(x))(コードでは、我々は最初に0を使用してx値)。これはルートを見つけるので、私たちのx価値を見つけます。また、方程式は線形であることが保証されているため、近似は正確になります。



1

Mathcad、[組み込みを使用]

ここに画像の説明を入力してください

Mathcadには、このような方程式を解く2つの組み込み方法があります。

  • シンボリックソルバー(キーワードsolveを使用)
  • Solve Block(数値モードと記号モードの両方で機能します)。SolveブロックはキーワードGivenで始まり、関心のある条件を定義する一連の式に続き、Find(正確な解を見つける)またはMinErr(ターゲットとターゲット間のエラーを最小化する)任意のソリューション)。

シンボリックソルバーはy = xに非常に満足しており、解x = yを返します。

Mathcadに不慣れな方のために、以下の画像はWYSIWYGish Mathcad 15ワークブックから直接取得したものです。記述されている式を変更すると、Mathcadがその答えを再評価し、それに応じて表示を更新します。


怠idleな好奇心から、なぜダウン票ですか?私はそれのシンプルさがその根本にあるかもしれないと理解することができますが、本質的には、組み込みソルバーを呼び出す前に少量の入力処理を追加するだけのTI Basicソリューションと変わらないように見えますが、降格されませんでした。
スチュアートブラフ

1
このプログラムの実際のバイト数は?
ジョーキング

あなたの解決策が些細なものであるため、ダウンボートが発生する可能性が高い- 「些細な解決策とは」を参照してくださいメタ。

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.