Giảm thiểu các câu lệnh toán học


18

Các thách thức

Bạn là chủ sở hữu của một dịch vụ tuyệt vời có tên Coyote Beta , trả lời một cách kỳ diệu những câu hỏi toán học mà người dùng của nó gửi cho nó qua internet.

Nhưng hóa ra, băng thông đắt tiền. Bạn có hai lựa chọn, hoặc tạo " Coyote Beta Pro" hoặc tìm cách giải quyết vấn đề này. Mới gần đây, có người hỏi thăm (x + 2). Không thể khách hàng gửi x+2, và người dùng sẽ không thấy sự khác biệt?

Nhiệm vụ

Nhiệm vụ của bạn là "thu nhỏ" các biểu thức toán học. Đưa ra một biểu thức đầu vào, bạn phải loại bỏ khoảng trắng và dấu ngoặc đơn cho đến khi nó đưa ra một biểu diễn tối thiểu của cùng một đầu vào. Các dấu ngoặc đơn xung quanh các hoạt động liên kết không cần phải được bảo tồn.

Các nhà khai thác chỉ đưa ra ở đây là +, -, *, /, và^ (lũy thừa), với associativity toán học tiêu chuẩn và được ưu tiên. Khoảng trắng duy nhất được đưa ra trong đầu vào sẽ là các ký tự khoảng trắng thực tế.

Đầu vào / đầu ra mẫu

Input       | Output
------------|--------------
(2+x) + 3   | 2+x+3
((4+5))*x   | (4+5)*x
z^(x+42)    | z^(x+42)
x - ((y)+2) | x-(y+2)
(z - y) - x | z-y-x
x^(y^2)     | x^y^2
x^2 / z     | x^2/z
- (x + 5)+3 | -(x+5)+3

Chấm điểm

Đầu vào / đầu ra có thể sử dụng bất kỳ phương pháp ưa thích. Chương trình nhỏ nhất tính bằng byte thắng.

Bit chính xác

Lũy thừa là liên kết đúng và cũng tuân theo ưu tiên toán học tiêu chuẩn (là cao nhất). Một chữ số hợp lệ là /[0-9]+/, và một biến số hợp lệ là /[a-z]+/. Một biến số duy nhất đại diện cho một giá trị ngay cả khi độ dài ký tự của nó dài hơn 1.

"Các dấu ngoặc đơn xung quanh các hoạt động kết hợp không cần phải được bảo tồn" là đầu ra phải bao gồm một biểu thức dẫn đến một cây phân tích giống hệt nhau, ngoại trừ các hoạt động kết hợp có thể được sắp xếp lại.


Ý tưởng là tạo ra một câu lệnh tương đương tối thiểu dẫn đến cùng một cây phân tích cú pháp. Điều này là để Coyote Beta có thể hiển thị trực quan khi người dùng thực hiện truy vấn.
TND

Nếu một biến hợp lệ là /[a-z]+/, điều đó có nghĩa là nhân với vị trí kề nhau như abkhông được phép?
Joe Z.

1
Bạn muốn 2+(3+4)được thay đổi 2+3+4, phải không? Điều này không thay đổi cây phân tích.
feersum

2
Tôi có vấn đề với tuyên bố rằng x^(y/2)=x^y/2; lũy thừa có thứ tự ưu tiên cao hơn, ergo x^y/2=(x^y)/2,.
Conor O'Brien

1
Ôi trời, tôi định nộp Prompt X:expr(X)TI-BASIC nhưng bạn không thể đơn giản hóa :(
DankMeme

Câu trả lời:


1

C #, 523 519 504 byte

Kiểm tra các ý kiến ​​trong mã để xem làm thế nào nó hoạt động!


Chơi gôn

using System;using System.Collections.Generic;namespace n{class p{static void Main(string[]a){foreach(String s in a){String r=s.Replace(" ","");List<int>l=new List<int>();for(int i=0;i<r.Length;i++){if(r[i]=='('){l.Add(i);continue;}if(r[i]==')'){switch(r[Math.Max(l[l.Count-1]-1,0)]){case'+':case'(':switch(r[Math.Min(i+1,r.Length-1)]){case'+':case'-':case')':r=r.Remove(Math.Max(l[l.Count-1],0),1);r=r.Remove(Math.Min(i,r.Length)-1,1);i-=2;break;}break;}l.RemoveAt(l.Count-1);}}Console.WriteLine(r);}}}}

Ung dung

using System;
using System.Collections.Generic;

namespace n {
    class p {
        static void Main( string[] a ) {
            // Loop every String given for the program
            foreach (String s in a) {
                // Get rid of the spaces
                String r = s.Replace( " ", "" );

                // A little helper that will have the indexes of the '('
                List<int> l = new List<int>();

                // Begin the optimizatio process
                for (int i = 0; i < r.Length; i++) {
                    // If char is an '(', add the index to the helper list and continue
                    if (r[ i ] == '(') {
                        l.Add( i );
                        continue;
                    }

                    // If the char is an ')', validate the group
                    if (r[ i ] == ')') {
                        // If the char before the last '(' is an '+' or '(' ...
                        switch (r[ Math.Max( l[ l.Count - 1 ] - 1, 0 ) ]) {
                            case '+':
                            case '(':
                                // ... and the char after the ')' we're checking now is an '+', '-' or ')' ...
                                switch (r[ Math.Min( i + 1, r.Length - 1 ) ]) {
                                    case '+':
                                    case '-':
                                    case ')':
                                        // Remove the '()' since they're most likely desnecessary.
                                        r = r.Remove( Math.Max( l[ l.Count - 1 ], 0 ), 1 );
                                        r = r.Remove( Math.Min( i, r.Length ) - 1, 1 );

                                        // Go two steps back in the loop since we removed 2 chars from the String,
                                        //   otherwise we would miss some invalid inputs
                                        i -= 2;
                                        break;
                                }

                                break;
                        }

                        // Remove the last inserted index of '(' from the list,
                        //   since we matched an ')' for it.
                        l.RemoveAt( l.Count - 1 );
                    }
                }

                // Print the result
                Console.WriteLine( r );
            }
        }
    }
}

Ghi chú bên

  1. Đã sửa một số lỗi chính tả và đổi tên một số vars.
  2. Lồng một công tắc để thoát khỏi một biến không cần thiết. Ngoài ra, đã sửa một lỗi sẽ khiến một số giải pháp không hợp lệ, được báo cáo bởi Anders Kaseorg .

Tái bút: Nếu bạn có một mẹo hoặc tìm thấy một lỗi, vui lòng cho tôi biết trong các nhận xét và tôi sẽ cố gắng sửa nó (Sau đó tôi sẽ thêm một lưu ý về sửa lỗi với tên của bạn;))


Câu trả lời tốt đẹp! : D câu trả lời đáng kể ở đây thường được nhận tốt hơn nếu bạn bao gồm một lời giải thích: P
mèo

Tôi có thể làm điều đó dưới dạng nhận xét mã?
auhmaan

Chắc chắn, bất cứ điều gì hoạt động c:
con mèo

Sau đó, tôi sẽ làm điều đó! Tôi cũng sẽ cố gắng thêm một bản tóm tắt ở đâu đó.
auhmaan

Chào mừng bạn đến với Câu đố lập trình và Code Golf, nhân tiện! (mặc dù đó không phải là câu trả lời đầu tiên của bạn)
mèo

0

C ++, 284 byte

Chơi gôn

#include<iostream>
#include<algorithm>
int main(){std::string e;std::getline(std::cin,e);e.erase(std::remove_if(e.begin(),e.end(),isspace),e.end());for(int x=0;x<e.length();x++){if(e[x]=='('&&e[x+1]=='('){e.erase(x,1);}if(e[x]==')'&&e[x+1]==')'){e.erase(x,1);}}std::cout<<e;return 0;}

Ung dung

#include<iostream>
#include<algorithm>

int main()
{
    std::string e;
    std::getline(std::cin, e);
    e.erase(std::remove_if(e.begin(), e.end(), isspace), e.end());
    for(int x = 0; x < e.length(); x++) {
        if (e[x] == '(' && e[x+1] == '('){
            e.erase(x, 1);
        }
        if (e[x] == ')' && e[x+1] == ')'){
            e.erase(x, 1);
        }
    }
    std::cout<<e;
    return 0;
}

Điều này không có logic ưu tiên và thất bại nhiều trường hợp thử nghiệm nhất định.
Anders Kaseorg
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.