Đánh giá chuỗi biểu thức đa thức


18

Tạo một hàm lấy phương trình đa thức, giá trị xvà trả về kết quả của phép toán.

Ví dụ: đã cho 4x^2+2x-5x=3đầu ra 37. Đây là kết quả của4(3)^2+2(3)-5

  • Giả sử tất cả các đa thức đều hợp lệ
  • Định dạng đa thức sẽ luôn luôn coefficient(variable)^exponent => 4x^2ngoại trừ:
    • Khi số mũ là 1nó sẽcoefficient(variable) => 4x
    • Khi hệ số là 1nó sẽ là(variable)^exponent => x^2
  • Đa thức là một biến duy nhất
  • Sử dụng các thư viện bên ngoài đều bị cấm
  • Hệ số và đầu vào biến có thể là số dương và số âm.

Các trường hợp thử nghiệm

  • ("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

Cập nhật

  • Định dạng đa thức sẽ luôn luôn coefficient(variable)^exponent => 4x^2ngoại trừ:
    • Khi số mũ là 1nó sẽcoefficient(variable) => 4x
    • Khi hệ số là 1nó sẽ là(variable)^exponent => x^2
  • Loại bỏ quy tắc của số mũ âm. Lỗi của tôi. Một đa thức hợp lệ không chứa số mũ âm
  • Một số mũ 0sẽ chỉ làcoefficient
  • Đã thêm trường hợp thử nghiệm cho input 0

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


3
Làm thế nào linh hoạt là định dạng đầu vào? Thay vì 3x^3-5x^2+2x-10chúng ta có thể nhập liệu 3*x^3-5*x^2+2*x-10? Hay là [3 -5 2 -10]. [3 2 1 0]?
Luis Mendo

1
@Arnauld Có ...
Luis felipe De jesus Munoz

4
"Thư viện bên ngoài" là gì và nó công bằng như thế nào, so với các ngôn ngữ đã "eval" đã được triển khai như một tính năng?
Olivier Grégoire

1
Tôi xin lỗi tôi đã không sử dụng máy tính của tôi kể từ hôm qua. Tôi đã cập nhật thử thách với những gợi ý bạn đưa ra cho tôi. Hãy xem nó và mở lại nếu mọi thứ đều ổn.
Luis felipe De jesus Munoz

Câu trả lời:


12

JavaScript (ES7), 48 byte

Dựa trên đề xuất từ ​​@RickHitchcock

Mong đợi Xbằng chữ in hoa. Đưa đầu vào theo cú pháp currying (p)(X).

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

Hãy thử trực tuyến!


JavaScript (ES7), 49 byte

Cách tiếp cận tương tự như @DeadPossum . Đưa đầu vào theo cú pháp currying (p)(x).

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

Hãy thử trực tuyến!


1
Tôi nghĩ bạn có thể tiết kiệm một vài byte bằng cách sử dụng replace: p=>x=>eval(p.replace(/[x^]/g,a=>a>f?'*x':'**'))
Rick Hitchcock

@RickHitchcock Tôi không thể sử dụng một tham chiếu đến ftrừ khi nó được bao gồm trong số byte, với chi phí là 2 byte được cho là sẽ được lưu. Tôi thích phương pháp này, mặc dù. Có thể có một cách để lưu một hoặc hai byte bằng cách cải thiện nó bằng cách nào đó.
Arnauld

2
@RickHitchcock Nếu chúng ta có thể Xviết hoa, thì chúng ta có thể làm a<{}?'*X':'**', tiết kiệm một byte. Do đó câu hỏi của tôi cho OP.
Arnauld

1
Không thể xử lý xmột mình
l4m2

1
@ l4m2 Các quy tắc thách thức đã được cập nhật. : / Nó được sử dụng 1xcho x.
Arnauld


8

Python 3 , 53 50 48 byte

chỉnh sửa : -5 byte nhờ Dennis!

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

Hãy thử trực tuyến!

Được sử dụng translateđể tránh replacecác cuộc gọi xích ; Phiên bản Python 3 translateít lúng túng hơn phiên bản tiền nhiệm.


"*(%d)"%xcó thể trở thành "*(x)".
Dennis

Cảm ơn bạn, tôi đã không tìm ra sự kiện xtrong evalphạm vi của tôi ! Tôi sẽ cập nhật.
etene

1
Trên thực tế, vì xkhông còn là một đại diện chuỗi, cũng "*x"hoạt động.
Dennis

Thậm chí còn tốt hơn ! Cảm ơn một lần nữa.
etene

5

R , 44 byte

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

Hãy thử trực tuyến!

Khá đơn giản với R. Thay thế nxbằng n*xvà sau đó evalparsechuỗi d. xđược sử dụng vì đây là cách chúng ta đặt tên cho đối số thứ hai.

Hàm eval thậm chí có thể được sử dụng trực tiếp hơn với một cuộc tranh luận đầu tiên được định dạng đúng, và lập luận chính thức khác ( y, z, vv) có thể dễ dàng thêm:

R , 20 byte (không cạnh tranh)

function(f,x)eval(f)

Hãy thử trực tuyến!


4

Japt 2.0, 13 byte

OvUd^'*²'x"*V

Thử nó .

Giải trình:

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) , 113 108 byte

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

Hãy thử trực tuyến!

Cảm ơn @Arnauld


Vì giải pháp JS tốt nhất cho đến nay của @Arnauld (49 byte) đã được đăng và nó sử dụng eval , tôi quyết định sử dụng Regex và giảm thay vì đó.

Khá dài so với mặc dù của mình.

Giải trình :

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


Điều này hiện đang thất bại trong trường hợp thử nghiệm cuối cùng (nên là 0,25). Bạn có thể lưu một vài byte bằng cách sử dụng -thay vì [-], ~b.indexOf`x` thay vì b.indexOf`x`>0và loại bỏ l=những thứ không được sử dụng. (Nhưng điều này không khắc phục được lỗi.)
Arnauld

@Arnauld: Cảm ơn. Không biết tại sao nó lại như vậy, sẽ thấy vấn đề gì
Muhammad Salman

Vâng, vấn đề là regex của bạn chia tách 1x^-2trên -.
Arnauld

3

05AB1E , 16 19 byte

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

+3 byte là sửa lỗi cho đầu vào tiêu cực x.

.E( Chạy dưới dạng mã hàng loạt ) đã được thay thế bằng Chạy dưới dạng Pythoneval trong cam kết mới nhất của @Adnan , nhưng phiên bản này chưa có trên TIO. @ Mr.Xcoder đã thử nghiệm nó trên 05AB1E tại địa phương (phiên bản mới nhất) để xác minh nó hoạt động.
Xem phiên bản này mà không cần .Exem cách nó chuyển đổi chuỗi biểu thức.

Giải trình:

„*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

Chương trình thay thế 25 28 byte hoạt động trên phiên bản TIO hiện tại:

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

Hãy thử trực tuyến.

Giải trình:

„*(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

“…¢(“là chuỗi print(, bởi vì:

  • bắt đầu và kết thúc chuỗi nén
  • …¢bằng 0426vì nó nhìn vào các chỉ mục trong tệp info.txt , nơi có chỉ số 4 và ¢có chỉ số 26.
  • Chỉ mục 0426này sau đó được sử dụng trong tệp từ điển , trong đó dòng 427 (chỉ mục 426) là từ mà nó tìm nạp, printtrong trường hợp này.
  • Các (không có một chỉ số trong file info.txt, vì vậy nó được giải thích như vậy.

2

JavaScript (Node.js) , 143 byte

Tôi biết có câu trả lời tốt hơn nhưng tôi muốn làm điều đó mà không sử dụng 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)

Hãy thử trực tuyến!


Regex của bạn không cần phải [a-z0-9.]không? Chữ duy nhất có thể xuất hiện là x. Bất kỳ tại sao .? Bạn không cần phải xử lý các hệ số hoặc số mũ không nguyên.
Peter Cordes



2

Java 8, 150 149 148 byte

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

Không chắc chắn nếu có thể có chức năng lambda cà ri ném Ngoại lệ. Nếu có, 1 byte có thể được lưu thay đổi (s,n)->thành n->s->.-1 byte nhờ @ OlivierGrégoire chỉ cho tôi cách làm điều này.

Hãy thử trực tuyến.

Giải trình:

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)

Thật không may, eval JavaScript không hỗ trợ **, vì vậy tôi phải sử dụng thay thế lâu hơn để chuyển đổi nó thành Math.powthay thế ..


JavaScript không hỗ trợ **(ES7 +), tại sao điều này không hỗ trợ điều đó?
Muhammad Salman

Cũng không có eval trong java. Điều đó không thể đúng?
Muhammad Salman

@MuhammadSalman Không, Java không có eval. Và tôi nghĩ rằng JavaScript-eval dựng sẵn này tôi có thể sử dụng mà ScriptEngineManagerchưa được cập nhật trong JDK Java trong nhiều năm, vì vậy nó không hỗ trợ ES7+..
Kevin Cruijssen

Man, java hút, không có eval tại sao? Được rồi tại sao nó không được cập nhật?
Muhammad Salman

@MuhammadSalman Tôi không biết .. Bạn sẽ phải hỏi những người tạo ra Java câu hỏi đó. ;)
Kevin Cruijssen

2

TI-Basic, 6 byte

Prompt X:expr(Ans

Biểu thức được lấy làm đối số và X được nhập trong thời gian chạy. Hoặc 8 byte không có expr:

Prompt X,u:u

Ở đây cả hai đối số được nhập vào thời gian chạy.


2

Octave , 47 38 37 byte

Đã lưu rất nhiều byte bằng cách lấy đầu vào thứ hai làm chuỗi thay vì số.

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

Hãy thử trực tuyến!

Giải trình:

Khá thẳng về phía trước: Thay thế xbằng (c), đâu clà đầu vào thứ hai và đánh giá. Các parethes là cần thiết bởi vì trong Octave -8^2 == -64.




1

Ruby , 43 41 byte

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

Hãy thử trực tuyến!

Đã lưu hai byte nhờ @ Mr.Xcoder


Vì không có câu trả lời của Ruby nhưng tôi đã thêm một câu trả lời. Nvm có một cách sử dụng một cách tiếp cận khác

Giải trình :

->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 byte, Không cạnh tranh

Đánh giá trường Văn bản dưới dạng công thức không đơn giản trong Excel. Có một =EVALUATE()chức năng ẩn , có thể được gọi bằng cách xác định Tên.

Trong Excel 2007, Công thức> Xác định tên. Xác định tên được gọi E, với Tham chiếu đến:

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

Sau đó, với công thức đầu vào trong A1, xgiá trị trong B1, đi vào =Etrong C1lợi nhuận kỳ vọng kết quả.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.