多項式表現文字列を評価する


18

多項式、値を取りx、演算結果を返す関数を作成します。

例:given 4x^2+2x-5およびx=3output 37。これはの結果です4(3)^2+2(3)-5

  • すべての多項式が有効であると仮定します
  • 多項式形式は常に次の場合coefficient(variable)^exponent => 4x^2を除きます。
    • 指数がある場合は1、それは次のようになりますcoefficient(variable) => 4x
    • 係数がある場合には1、それは次のようになります(variable)^exponent => x^2
  • 多項式は1つの変数のみです
  • 外部ライブラリの使用は禁止されています
  • 係数と変数の入力には、正の数と負の数を指定できます。

テストケース

  • ("3x^3-5x^2+2x-10", 5) => 250
  • ("10x^4-5x^3-10x^2+3x+50", 3) => 644
  • ("10x+20", 10) => 120
  • ("-20x^2+20x-50", -8) => -1490
  • ("9", 5) => 9
  • ("8x^2+5", 0) => 5

更新

  • 多項式形式は常に次の場合coefficient(variable)^exponent => 4x^2を除きます。
    • 指数がある場合は1、それは次のようになりますcoefficient(variable) => 4x
    • 係数がある場合には1、それは次のようになります(variable)^exponent => x^2
  • 負の指数の規則を削除しました。私の間違い。有効な多項式に負の指数が含まれていません
  • 指数は0ちょうどだろうcoefficient
  • のテストケースを追加 input 0

これはであるため、バイト単位の最短回答が勝ちです。


3
入力形式はどの程度柔軟ですか?3x^3-5x^2+2x-10入力する代わりに3*x^3-5*x^2+2*x-10?または[3 -5 2 -10]. [3 2 1 0]
ルイスメンドー


4
「外部ライブラリ」とは何ですか。また、「eval」がすでに機能として実装されている言語と比較して、どのように公平ですか?
オリビエグレゴワール

1
謝罪昨日からPCを使用していません。あなたからの提案でチャレンジを更新しました。それを見て、すべてが大丈夫ならそれを再び開いてください。
ルイスフェリペデジェススムニョス

回答:


12

JavaScript(ES7)、48バイト

@RickHitchcockからの提案に基づく

X大文字で期待します。カリー化構文の入力を受け取ります(p)(X)

p=>X=>eval(p.replace(/[X^]/g,c=>c<{}?'*X':'**'))

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


JavaScript(ES7)、49バイト

@DeadPossumと同じアプローチ。カリー化構文の入力を受け取ります(p)(x)

p=>x=>eval(p.split`x`.join`*x`.split`^`.join`**`)

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


1
私はあなたがカップルが利用してバイトを保存することができると思うreplacep=>x=>eval(p.replace(/[x^]/g,a=>a>f?'*x':'**'))
リック・ヒッチコック

@RickHitchcock fバイトカウントに含まれていない限り、保存されるはずの2バイトを犠牲にしてへの参照を使用できません。しかし、私はこの方法が好きです。何らかの方法でバイトを1〜2個保存する方法があります。
アーナルド

2
@RickHitchcock X大文字を取得できればa<{}?'*X':'**'、バイトを保存して実行できます。したがって、OPへの私の質問。
アーナウルド

1
x単独で処理でき
ません

1
@ l4m2チャレンジルールが更新されました。:/のために使用されてい1xましたx
アーナウルド


8

Pythonの353の 50 48バイト

編集:デニスのおかげで-5バイト!

lambda p,x:eval(p.translate({94:"**",120:"*x"}))

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

呼び出しのtranslate連鎖を避けるために使用されreplaceます。Python 3のバージョンはtranslate、その前バージョンよりも扱いにくいです。


"*(%d)"%xになることができ"*(x)"ます。
デニス

ありがとう、私はx自分のeval範囲内であると考えられたイベントはなかった!更新します。
エテン

1
実際、x文字列表現ではなくなったため、"*x"同様に機能します。
デニス

さらに良い!再度、感謝します。
エテン

5

R、44バイト

function(f,x)eval(parse(t=gsub("x","*x",f)))

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

Rでかなり簡単です。文字列で置き換えnxn*xからevalparsed文字列を置き換えます。xこれは、2番目の引数に名前を付ける方法です。

eval関数はさえ適切にフォーマットされた最初の引数とより直接的に使用することができ、かつ他の仮引数は(yzなど)を簡単に追加することができます。

R、20バイト(非競合)

function(f,x)eval(f)

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




3

JavaScriptの(Node.jsの)113の 108バイト

_=>x=>_.match(/-?(?:[x\d]+|\^?)+/g).reduce((a,b)=>b.split`x`[0]*(~b.indexOf`x`?x**(b.split`^`[1]||1):1)+a,0)

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

@Arnauldに感謝


@Arnauldによるこれまでの最高のJSソリューション(49バイト)が既に投稿されており、それを使用しているevalので、代わりにRegexを使用して、reduceを使用することにしました。

彼に比べてかなり長い。

説明 :

A =>                            // lambda function accepting argument 1 
    x =>                        // argument number 2 (currying syntax used)
        A.match(                // this matches all instance of what comes next 
                                // and converts to array
       /[-]?(?:[x\d]+|\^?)+/g)  // regexp for -ve sign , variable number and ^ sign 
            .reduce((a, b) =>   // reduce the array to single (take 2 params a,b)
                b.split `x`     // split b at instances of `x` 
                        [0]     // and select the first instance 
                * (b.indexOf`x` // multiply that by value of index of x in b 
                    > 0 ?       // if it is greater than 0 then 
                x **            // multiplication will be with x raised to power
               (l = b.split `^` // set variable split b at every `x` 
                   [1]||1       // choose first index otherwise set to one
                )               // this is what x is raised to the power 
                : 1)            // in the case x is not present multiply by 1
                + a,            //  add value of `a` to that value 
        0)                      // in case no reduce is possible set value to 0


現在、これは最後のテストケースで失敗します(0.25でなければなりません)。あなたは使用していくつかのバイトを保存することができます-のではなく[-]~b.indexOf`x` 代わりにb.indexOf`x`>0と削除l=に使用されていません。(ただし、これでバグは修正されません。)
アーナウルド

@アーナウルド:ありがとう。それがなぜそうなるのかわからない、何の問題が表示されます
ムハンマドサルマン

問題は、正規表現がで分割1x^-2されること-です。
アーナルド

3

05AB1E16 19 バイト

„*(I')J'xs:'^„**:.E

マイナス入力のバグ修正として+3バイトx

.Eバッチコードとして実行)は、この@Adnanの最新のコミットでPythonとして実行にeval置き換えられましたが、このバージョンはまだTIO上にありません。@ Mr.Xcoderは、ローカル(最新バージョン)05AB1Eでテストして、機能することを確認しました。式文字列をどのように変換したかを確認するには、このバージョンを参照してください。
.E

説明:

„*I')J'xs:    # Replace all "x" with "*(n)" (where `n` is the input-integer)
              #  i.e. 5 and 3x^3-5x^2+2x-10 → 3*(5)^3-5*(5)^2-2*(5)-10
'^„**:        # Replace all "^" with "**"
              #  i.e. 3*(5)^3-5*(5)^2-2*(5)-10 → 3*(5)**3-5*(5)**2-2*(5)-10
.E            # Evaluate as Python-eval
              #  i.e. 3*(5)**3-5*(5)**2-2*(5)-10 → 250

TIOの現在のバージョンで動作する代替の25 28バイトプログラム:

„*(I')J'xs:'^„**:“…¢(“s')J.e

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

説明:

„*(I')J'xs:'^„**:    # Same as explained above
“…¢(“                # Literal string "print("
     s               # Swap both
      ')             # Literal character ")"
        J            # Join everything together
                     #  i.e. 3*(5)**3-5*(5)**2-2*(5)-10 → print(3*(5)**3-5*(5)**2-2*(5)-10)
.e                   # Run as Python code
                     #  i.e. print(3*(5)**3-5*(5)**2-2*(5)-10) → 250

“…¢(“は文字列print(です:

  • 圧縮された文字列を開始および終了します
  • …¢0426info.txtファイル内のインデックスを調べインデックス4、¢インデックス26 を持っているためです。
  • このインデックス0426は、辞書ファイルで使用されますで。行427(インデックス426)は、printこの場合はフェッチする単語です。
  • (それがあるとして解釈されるように、INFO.TXTファイルのインデックスを持っていません。

2

JavaScript(Node.js)、143バイト

私はより良い答えがあることを知っていますが、evalを使用せずにそれをやりたかったです

(_,x)=>_.match(/[+-]?(?:[a-z0-9.]+|\^-?)+/gi).reduce((a,b)=>~~(b.split('x')[0])*(b.indexOf('x')>0?Math.pow(x,(l=(b.split('^')[1]))?l:1):1)+a,0)

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


あなたの正規表現はそれを必要と[a-z0-9.]しませんか?表示できる唯一の文字はxです。なんで.?非整数の係数や指数を処理する必要はありません。
ピーター



2

ジャワ8、150の 149 148バイト

n->s->new javax.script.ScriptEngineManager().getEngineByName("JS").eval(s.replace("x","*"+n).replaceAll((s="(\\-?\\d+)")+"\\^"+s,"Math.pow($1,$2)"))

例外をスローするラムダ関数をカリー化できるかどうかはわかりません。そうである場合、1バイトをに変更(s,n)->して保存できますn->s->@OlivierGrégoireのおかげで-1バイトこれを行う方法を示してくれたます。

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

説明:

n->s->     // Method with integer and String parameters and Object return-type
  new javax.script.ScriptEngineManager().getEngineByName("JS")
            //  Use a JavaScript engine
   .eval(s  //  And eval the input
      .replace("x","*"+n)
            //   After all 'x' has been replaced with '*n'
            //   (where `n` is the input-integer)
      .replaceAll((s="(\\-?\\d+)")+"\\^"+s,"Math.pow($1,$2)"))
            //   And all `A^B` have have been replaced with `Math.pow(A,B)`
            //   (where both `A` and `B` are integers)

残念ながら、JavaScript evalはをサポートしていないため**、代わりに変換するには長い置換を使用する必要がありMath.powます。


JavaScriptは**(ES7 +)をサポートしていますが、なぜこれがサポートされないのですか?
ムハンマドサルマン

また、Javaにはevalはありません。それは正しくありませんか?
ムハンマドサルマン

@MuhammadSalmanいいえ、Javaにはありませんeval。そして、私が使用できるこの組み込みJavaScript-eval ScriptEngineManagerは何年もJava JDKで更新されていないため、ES7+..をサポートしていません。
ケビンCruijssen

男、ジャバは吸う、なぜ評価はありませんか?なぜ更新されていないのですか?
ムハンマドサルマン

@MuhammadSalman私は知らない.. Javaの作成者にその質問をする必要があります。;)
ケビンクルーイッセン

2

TI-Basic、6バイト

Prompt X:expr(Ans

式は引数として使用され、実行時にXが入力されます。代わりに8バイトexpr

Prompt X,u:u

ここでは、両方の引数が実行時に入力されます。





1

ルビー43 41バイト

->p,x{eval p.gsub('^','**').gsub'x','*x'}

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

@ Mr.Xcoderのおかげで2バイト節約


Rubyの回答はまだないので、追加しました。Nvm別のアプローチを使用したものがありました

説明 :

->p,x{                    # lambda function that takes two arguments p and x
    eval(                 # eval 
        p.gsub(           # replace all instance of 
            '^' , '**'    # `^` with `**` (use for raised to power of)
        )                 # end gsub
        .gsub(            # start another replace all
            'x' , '*x'    # replace all instances of `x` with `*x`
        )                 # end the replace function
    )                     # end eval function
}                         # end lambda function


1

Excel、36 + 2バイト、非競合

テキストフィールドを数式として評価することは、Excelでは簡単ではありません。=EVALUATE()名前を定義することで呼び出すことができる隠された関数があります。

Excel 2007では、[数式]> [名前の定義]。と呼ばれる名前を定義Eします:

=EVALUATE(SUBSTITUTE(A1,"x","*"&B1))

次に、Formula input in A1xvalue in B1、入力=EするとC1期待される結果が返されます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.