评估多项式表达式字符串


18

创建一个函数,该函数采用多项式方程式,的值x并返回运算结果。

示例:给定4x^2+2x-5x=3输出37。这是由于4(3)^2+2(3)-5

  • 假设所有多项式均有效
  • 多项式格式将始终为coefficient(variable)^exponent => 4x^2
    • 当指数是 1这将是coefficient(variable) => 4x
    • 当系数是1这将是(variable)^exponent => x^2
  • 多项式只是一个变量
  • 禁止使用外部库
  • 系数和变量输入可以是正数和负数。

测试用例

  • ("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]
路易斯·门多

1
@Arnauld是...
Luis

4
与已将“评估”功能实现的语言相比,什么是“外部库”?公平性如何?
奥利维尔·格雷戈尔

1
抱歉,昨天以来我没有使用电脑。我已根据您给我的建议更新了挑战。请查看一下,如果一切正常,请重新打开它。
路易斯·费利佩·德·耶稣·穆诺兹

Answers:


12

JavaScript(ES7),48个字节

根据@RickHitchcock的建议

期望X为大写。以currying语法接受输入(p)(X)

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

在线尝试!


JavaScript(ES7),49个字节

@DeadPossum相同的方法。以currying语法接受输入(p)(x)

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

在线尝试!


1
我认为您可以使用replace以下方法节省几个字节: p=>x=>eval(p.replace(/[x^]/g,a=>a>f?'*x':'**'))
Rick Hitchcock

@RickHitchcock我不能使用引用,f除非它包含在字节数中,但要以要保存的2个字节为代价。我喜欢这种方法。可能存在一种通过某种方式修改字节来保存一两个字节的方法。
Arnauld

2
@RickHitchcock如果可以采用X大写形式,则可以这样做a<{}?'*X':'**',保存一个字节。因此,我对OP的问题。
Arnauld

1
不能x单独处理
l4m2

1
@ l4m2挑战规则已更新。:/它曾经是1xx
Arnauld


8

Python 3中53个 50 48字节

编辑:-5字节感谢丹尼斯!

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

在线尝试!

用于translate避免链接replace呼叫;Python 3的版本translate不如其前身的版本笨拙。


"*(%d)"%x可以成为"*(x)"
丹尼斯

谢谢,我还没有发现x属于我的eval范围!我会更新。
etene

1
实际上,由于x不再是字符串表示形式,因此也"*x"可以正常工作。
丹尼斯

更好!再次感谢。
etene

5

R,44个字节

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

在线尝试!

用R相当简单。用替换nxn*x然后evalparsed字符串。x之所以使用,是因为这是我们命名第二个参数的方式。

eval函数甚至可以用正确格式化第一个参数更直接使用,和其他正式参数(yz,等)可以很容易地补充道:

R,20个字节(非竞争)

function(f,x)eval(f)

在线尝试!


4

Japt 2.0,13个字节

OvUd^'*²'x"*V

试试吧

说明:

OvUd^'*²'x"*V
              U = Implicit first input
              V = Implicit second input

Ov            Eval:
  Ud            In U, replace:
    ^             "^" with:
     '*²            "**"
        'x        "x" with:
          "*V       "*V"


3

JavaScript(Node.js)113108字节

_=>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(49字节)迄今为止最好的JS解决方案,并且使用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=不使用的字节。(但这不能解决问题。)
Arnauld

@ Arnauld:谢谢。不知道为什么这样做,会看到问题所在
穆罕默德·萨尔曼

好吧,问题在于您的正则表达式1x^-2在上分裂-
Arnauld

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

“…¢(“是string print(,因为:

  • 开始和结束压缩的字符串
  • …¢等于0426,因为它看起来在指数info.txt文件中,其中有索引4,和¢具有指数26。
  • 0426然后,在字典文件中使用此索引,其中第427行(索引426)是它获取的单词,print在这种情况下为。
  • (没有在info.txt文件中的索引,所以它被解释为是。




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

不知道是否可能有一个引发异常的curring lambda函数。如果是,则可以保存1个字节,更改(s,n)->n->s->-1个字节感谢@OlivierGrégoire向我展示了如何执行此操作。

在线尝试。

说明:

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评估ScriptEngineManager多年来未在Java JDK中进行更新,因此它不支持ES7+..
Kevin Cruijssen

男人,java很烂,没有评价为什么?好吧,为什么不更新呢?
穆罕默德·萨勒曼

@MuhammadSalman我不知道。您必须问Java的创建者这个问题。;)
Kevin Cruijssen

2

TI-Basic,6个字节

Prompt X:expr(Ans

将表达式用作参数,并在运行时输入X。或者8个字节,不包含expr

Prompt X,u:u

在这里,两个参数都是在运行时输入的。


2

八度47 38 37字节

通过将第二个输入作为字符串而不是数字来节省大量字节。

@(x,c)eval(strrep(x,'x',['*(',c,41]))

在线尝试!

说明:

相当简单:将替换x(c),其中c是第二个输入,然后求值。因为在八度音阶中,必须使用parethese -8^2 == -64




1

红宝石43 41字节

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

在线尝试!

@ Mr.Xcoder节省了两个字节


由于没有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))

然后,在公式输入A1x在值B1,输入=EC1返回预期的结果。


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.