Cứu giúp! Máy tính của tôi bị hỏng! (Biến biểu thức số nguyên thành tổ hợp phím máy tính)


30

Giới thiệu

Cứu giúp! Tôi vô tình làm rơi máy tính TI-84 ra khỏi cửa sổ (không hỏi làm thế nào) và nó bị hỏng. Tôi có một bài kiểm tra toán vào ngày mai và máy tính duy nhất tôi có thể tìm thấy là một máy có các nút này:

7 8 9 +
4 5 6 -
1 2 3 *
0   = /

Bài kiểm tra toán của tôi là một bài kiểm tra đánh giá về đánh giá biểu thức. Tôi cần một chương trình để thực hiện một biểu thức như 1+(5*4)/7và chuyển đổi nó thành tổ hợp phím cần thiết để giải quyết nó trên máy tính dự phòng của tôi. (Và trong trường hợp bạn đang tự hỏi, điều này thực sự đã xảy ra với tôi).

Thử thách

Cho một chuỗi đầu vào không có sản phẩm nào có chứa chỉ các nhân vật 0-9, (, ), +, -, *, và /, sản lượng các tổ hợp phím trong một chuỗi không gian tách ra (ví dụ. 1 + 3 / 3 =). Luôn phải có một dấu bằng ở cuối đầu ra. Sơ hở tiêu chuẩn không được phép.

Ví dụ:

  • Đầu vào : 1+(5*4)/7, Đầu ra:5 * 4 / 7 + 1 =
  • Đầu vào : 6*(2/3), Đầu ra:2 / 3 * 6 =
  • Đầu vào : (7-3)/2, Đầu ra:7 - 3 / 2 =

Để làm cho thử thách này dễ dàng hơn:

  • Bạn có thể giả sử rằng đầu vào có một loạt các tổ hợp phím được liên kết với nó mà không yêu cầu xóa máy tính ( 1-(7*3)không hợp lệ vì nó sẽ yêu cầu bạn tìm 7 * 3, sau đó xóa máy tính để làm 1 - 21. Tất cả các ví dụ trên đều hợp lệ vì có một , đầu ra liên tục không yêu cầu người dùng xóa máy tính và ghi nhớ một số).
  • Bạn có thể giả định rằng sẽ chỉ có một số nguyên duy nhất sau một /, vì có một đầu vào như 21/(7*3)sẽ không vượt qua giả định đầu tiên.
  • Bạn có thể giả sử rằng sẽ luôn có một *số nguyên và dấu ngoặc trái (Hợp lệ : 6*(7), Không hợp lệ 6(7):).
  • Bạn có thể giả sử đầu vào luôn tạo ra đầu ra số nguyên.
  • Bạn có thể giả sử đầu vào chỉ có ba cấp độ dấu ngoặc đơn.

Không ví dụ

  • 2-(14/2)như bạn sẽ phải làm 14 / 2, sau đó rõ ràng , sau đó 2 - 7.
  • 36/(2*3)như bạn sẽ phải làm 2 * 3, sau đó rõ ràng , sau đó 36 / 6.
  • 1024*4/(1*2+2)như bạn sẽ phải làm 1*2+2, sau đó rõ ràng , sau đó 1024 * 4 / 4.

Tiền thưởng

  • -5% nếu chương trình của bạn có thể nhận ra dấu ngoặc đơn (nó biết điều đó 6(7)=6*(7)).
  • -5% nếu chương trình của bạn có thể xử lý đầu vào với số thập phân ( 3.4, 2.75, 7.8) và đầu ra bao gồm .(như phải có một .phím trên máy tính rảnh rỗi của tôi trong trường hợp này).
  • -5% nếu chương trình của bạn có thể xử lý các mức ngoặc đơn không giới hạn.

Đây là , mã ngắn nhất tính bằng byte (bao gồm cả tiền thưởng) sẽ thắng!

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

## Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=61751,OVERRIDE_USER=141697;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


Bạn được phép chạy các chương trình nhưng không thể sử dụng chúng để chạy phương trình thực tế? 0.o
Hạ cấp

6
@ Vɪʜᴀɴ Bạn sẽ phải hỏi giáo viên toán của tôi về điều đó, tôi cũng không hiểu điều đó.
GamrCorps

Chúng ta có cần phải xử lý thứ tự của các hoạt động?
lirtosiast

1
Chúng ta có thể có một số trường hợp thử nghiệm dài hơn, phức tạp hơn với mười hoạt động hay không?
lirtosiast

1
Có một lỗi đánh máy. Trong văn bản nói rằng 6(7)sẽ không xảy ra, nó cũng nói rằng các dấu hiệu ?trong 6?(7)sẽ luôn luôn là một *.
wizzwizz4

Câu trả lời:


11

Python 3. 337 327 - 10% = 295 byte

Hỗ trợ dấu ngoặc đơn và mức không giới hạn của dấu ngoặc đơn, do đó đủ điều kiện nhận thưởng -10%.

import re
def v(s):
 if s[:1]=='(':l,s=e(s[1:]);return l,s[1:]
 m=re.match(r"\d+\.?\d*|\.\d+",s)
 if m:return[m.group()],s[m.end():]
def b(s,f,*O):
 l,s=f(s)
 while s[:1]in O:
  o=s[0]
  r,s=f(s[1:])
  if len(r)>1:l,r=r,l
  l+=[o]+r
 return l,s
m=lambda s:b(s,v,'*','/')
e=lambda s:b(s,m,'+','-')
print(' '.join(e(input())[0]))


5
@sysreq Điều này không hoạt động, bạn chỉ cần sử dụng các đối số dòng lệnh. Thay thế sys.argv[1]bằng input()các tác phẩm trong ideone (và là shoter - gợi ý gợi ý)
GamrCorps

Có hướng dẫn nào đó làm cho mọi thứ rõ ràng như đầu vào được cho là được đọc, không được thông qua như một đối số không? (Btw @GamrCorps, ý bạn là raw_input (), sẽ chỉ tiết kiệm cho tôi 4 ký tự: "sys,".) Vì không cạo được vài ký tự cuối cùng, tôi thực sự chỉ muốn đưa bóng lăn và xem các giải pháp của người khác, đặc biệt là nếu họ làm một cái gì đó thú vị hơn là đệ quy-hậu duệ.
mjmt

Có thể lấy đầu vào @mjmt theo bất kỳ phương thức nào: đối số dòng lệnh, đầu vào (), v.v.
GamrCorps

1
@mjmt GamrCorps có nghĩa là input()vì đây là Python 3! Python 2's raw_input() ===Python 3's input()!
wizzwizz4

8

TI-BASIC, 605,2 byte

Đủ điều kiện nhận tiền thưởng TI-BASIC của lirtosiast theo Ngôn ngữ phù hợp nhưng không phù hợp .

Đủ điều kiện cho cả 3 phần thưởng , 712 - 15% = 605.2. Có một số cơ hội chơi gôn ở đây và đó, nhưng tôi muốn có được điều này trước tiên, vì một số golf tiềm năng là không tầm thường. Xin lưu ý rằng TI-BASIC là ngôn ngữ được mã hóa và bên dưới là phần trình bày bằng văn bản của chương trình đó. Do đó, chương trình không phải là 1182 byte, vì chương trình này không được mã hóa theo UTF-8. Lưu ý rằng ~tương đương với phủ định unary và ->cho STO>người vận hành. Đầu ra là một chuỗi, có thể truy xuất từ Anshoặc Str1.

Chương trình dưới đây là kết quả của một vài giờ lập trình suy nghĩ và lập trình, trải đều trong vài tuần.

Input "",Str1
0->dim(L1
0->dim(L2
1->I
DelVar S
While I<length(Str1
DelVar T
".->Str3
1->C
While C and I<length(Str1
sub(Str1,I,1->Str2
inString("0123456789.",Str2->C
If C:Then
I+1->I
1->T
Str3+Str2->Str3
End
End
If T=0:Str3+Str2->Str3
sub(Str3,2,length(Str3)-1->Str3
If T=1:Then
expr(Str3->L2(1+dim(L2
End
inString("*+/-",Str3->M
If M:Then
I+1->I
2->T
1->C
While C
dim(L1->C
If C:Then
2fPart(L1(dim(L1))/2)>2fPart(M/2->C
If C:Then
~L1(dim(L1->L2(1+dim(L2
dim(L1)-1->dim(L1
End
End
End
M->L1(1+dim(L1
End
If Str3="(":Then
If S=1:Then
sub(Str1,1,I-1)+"*"+sub(Str1,I,length(Str1)-I+1)->Str1
Else
I+1->I
0->L1(dim(L1)+1
End
End
If Str3=")":Then
I+1->I
While L1(dim(L1
~L1(dim(L1->L2(1+dim(L2
dim(L1)-1->dim(L1
End
dim(L1)-1->dim(L1
End
T->S
End
augment(L2,-seq(L1(X),X,dim(L1),1,-1)->L2
0->dim(L1
1->C
{0,1->L3
For(I,1,dim(L2
L2(I->M
If M>=0:Then
M->L1(dim(L1)+1
Else
If C:Then
L1(dim(L1)-1
Goto S
Lbl A
Ans->Str1
L1(dim(L1->L1(dim(L1)-1
dim(L1)-1->dim(L1
0->C
End
Str1+" "+sub("*+/-",-M,1)+" ->Str1
L1(dim(L1
Goto S
Lbl B
Str1+Ans->Str1
dim(L1)-1->dim(L1
End
End
Goto F
Lbl S
L3Ans->L4
LinReg(ax+b) L3,L4,Y1
Equ►String(Y1,Str2
sub(Str2,1,length(Str2)-3
If C:Goto A
Goto B
Lbl F
Str1

Giải thích chung

Đây là chìa khóa tôi đã làm việc trong khi phát triển chương trình:

Str1        The input string.
Str2        Counter variable (e.g. current character)
Str3        The current token being built.
L1          The operator stack
L2          The output queue
L3          Temporary list
L4          Temporary list
I           Iterator index
T           Type of token (enum)
S           Type of previous token (enum)
M           Temporary variable
C           Conditional variable


Token Types (T)
0           Undefined
1           Number
2           Operator
3           Open Parenthesis

Operator Elements
0           left parenthesis ("(")
1           multiplication ("*")
2           addition ("+")
3           division ("/")
4           subtraction ("-")
5           right parenthesis (")")

Precedence Rule: Remainder(prec, levelno)
0 - add, sub
1 - mul, div
(levelno = 2)

Và đây là mã JavaScript viết tay tương đương mà tôi đã sử dụng để kiểm tra và phát triển chương trình này.

let Str1, Str2, Str3, L1, L2, I, S, T, M, C;

let error = (type, ...args) => {
    let message = "ERR:" + type + " (" + args.join("; ") + ")";
    throw new Error(message);
};

let isInteger = (n) => n == Math.floor(n);

let inString = (haystack, needle, start=1) => {
    if(start < 1 || !isInteger(start)) {
        error("DOMAIN", haystacak, needle, start);
    }
    let index = haystack.indexOf(needle, start - 1);
    return index + 1;
};

let sub = (string, start, length) => {
    if(start < 1 || length < 1 || !isInteger(start) || !isInteger(length)) {
        error("DOMAIN", string, start, length);
    }
    if(start + length > string.length + 1) {
        error("INVALID DIM", string, start, length);
    }
    return string.substr(start - 1, length);
}

let fPart = (value) => value - Math.floor(value);

// Input "", Str1
Str1 = process.argv[2];
// 0->dim(L1
L1 = [];
// 0->dim(L2
L2 = [];
// 1->I
I = 1;
// DelVar S
S = 0;
// While I<=length(Str1
while(I <= Str1.length) {
    // DelVar T
    T = 0;
    // Disp "Starting",I
    console.log("Starting, I =", I);

    // " read token
    // ".->Str3
    Str3 = ".";
    // 1->C
    C = 1;
    // While C and I<=length(Str1
    while(C && I <= Str1.length) {
        // sub(Str1,I,1->Str2
        Str2 = sub(Str1, I, 1);
        // inString("0123456789",Str2->C
        C = inString("0123456789", Str2);
        // If C:Then
        if(C) {
            // I+1->I
            I++;
            // 1->T
            T = 1;
            // Str3+Str2->Str3
            Str3 += Str2;
        }
    }
    // If T=0:
    if(T == 0) {
        // console.log("Huh?T=0?", Str3, Str2);
        // Str3+Str2->Str3
        Str3 += Str2;
    }

    // " remove placeholder character
    // sub(Str3,2,length(Str3)-1->Str3
    Str3 = sub(Str3, 2, Str3.length - 1);

    // " number
    // If T=1:Then
    if(T == 1) {
        // expr(Str3->L2(1+dim(L2
        L2[L2.length] = eval(Str3);
    }

    // Disp "Str3",Str3
    console.log("post processing, Str3 = \"" + Str3 + "\"");

    // inString("*+/-",Str3->M
    M = inString("*+/-", Str3);
    // " operator
    // If M:Then
    if(M) {
        // I+1->I
        I++;
        // 2->T
        T = 2;
        // Disp "op",M,dim(L1
        console.log("op", M, L1.length);
        // " parse previous operators
        // 1->C
        C = 1;
        // While C
        while(C) {
            // dim(L1->C
            C = L1.length;
            // If C:Then
            if(C) {
                // 2fPart(L1(dim(L1))/2)>2fPart(M/2->C
                C = 2 * fPart(L1[L1.length - 1] / 2) > 2 * fPart(M / 2);
                // If C:Then
                if(C) {
                    // ~L1(dim(L1->L2(1+dim(L2
                    L2[L2.length] = -L1[L1.length - 1];
                    // dim(L1)-1->dim(L1
                    L1.length--;
                }
            }
        }
        // " push current operator
        // M->L1(1+dim(L1
        L1[L1.length] = M;
    }
    // If Str3="(":Then
    if(Str3 == "(") {
        // 3->T
        T = 3;
        // If S=1:Then
        if(S == 1) {
            // sub(Str1,1,I-1)+"*"+sub(Str1,I,length(Str1)-I+1)->Str1
            Str1 = sub(Str1, 1, I - 1) + "*" + sub(Str1, I, Str1.length - I + 1);
        }
        // Else
        else {
            // I+1->I
            I++;
            // 0->L1(dim(L1)+1
            L1[L1.length] = 0;
        }
        // End
    }
    // If Str3=")":Then
    if(Str3 == ")") {
        // I+1->I
        I++;
        // While L1(dim(L1
        while(L1[L1.length - 1]) {
            // ~L1(dim(L1->L2(1+dim(L2
            L2[L2.length] = -L1[L1.length - 1];
            // dim(L1)-1->dim(L1
            L1.length--;
        }
        // End
        // dim(L1)-1->dim(L1
        L1.length--;
    }
    // Disp "Ending",I
    console.log("Ending", I);
    // T->S
    S = T;
    // Pause
    console.log("-".repeat(40));
}

// augment(L2,-seq(L1(X),X,dim(L1),1,-1)->L2
L2 = L2.concat(L1.map(e => -e).reverse());

// Disp L1, L2
console.log("L1", L1);
console.log("..", "[ " + L1.map(e=>"*+/-"[e-1]).join`, ` + " ]");
console.log("L2", L2);
console.log("..", "[ " + L2.map(e=>e<0?"*+/-"[~e]:e).join`, ` + " ]");

// post-processing
let res = "";
// 0->dim(L1
L1.length = 0;
// 1->C
C = 1;
// For(I,1,dim(L2
for(I = 1; I <= L2.length; I++) {
    // L2(I->M
    M = L2[I - 1];
    // If M>=0:Then
    if(M >= 0) {
        // M->L1(dim(L1)+1
        L1[L1.length] = M;
    }
    // Else
    else {
        // If C:Then
        if(C) {
            // L1(dim(L1)-1
            // Goto ST
            // Lbl A0
            // Ans->Str1
            res += L1[L1.length - 2];
            // L1(dim(L1->L1(dim(L1)-1
            L1[L1.length - 2] = L1[L1.length - 1];
            // dim(L1)-1->dim(L1
            L1.length--;
            // 0->C
            C = 0;
        }
        // End
        // Str1+" "+sub("*+/-",-M,1)+" ->Str1
        res += " " + "*+/-"[-M - 1] + " ";
        // L1(dim(L1
        // Goto ST
        // Lbl A1
        // Str1+Ans->Str1
        res += L1[L1.length - 1];
        // dim(L1)-1->dim(L1
        L1.length--;
    }
}
// Goto EF
// Lbl ST
// L3Ans->L4
// LinReg(ax+b) L3,L4,Y1
// Equ►String(Y1,Str2
// sub(Str2,1,length(Str2)-3
// If C:Goto A0
// Goto A1
// Lbl EF
// Str1
console.log(res);

Tôi sẽ cung cấp một lời giải thích sâu hơn một khi tôi chắc chắn rằng tôi đã chơi golf, nhưng trong lúc này, điều này có thể giúp cung cấp một sự hiểu biết khó hiểu về mã.


Bạn có thể giả sử máy tính TI-84 + CE mới, vì vậy Input "",Str1 0->dim(L1 0->dim(L2 1->I DelVar Scó thể Prompt Str1:SetUpEditor :1->I, và bạn có thể sử dụng toString (. Ngoài ra còn có một số parens không cần thiết.
lirtosiast

@lirtosiast Điểm hay về máy tính mới, tôi không muốn đưa vào toStringvì bản thân tôi không có CE. Tôi sẽ xem xét thi đua để đảm bảo tính hợp lệ của chương trình.
Conor O'Brien

7

Javascript (ES6), 535 - 80 (15% tiền thưởng) = 455 byte

f=z=>{a=[],i=0;c=n=>{while(n[M='match'](/\(/)){n=n[R='replace'](/\(([^()]+)\)/g,(q,p)=>{m=++i;a[m]=c(p);return'['+m+']'})}n=n[R](/(\](?=\[|[\d])|[\d](?=\[))/g,'$1*');n=n[R](/\[?[\d\.]+\]?[*/]\[?[\d\.]+\]?/g,q=>{a[++i]=q;return'['+i+']'});n=n[R](/([\d.]+)\+(\[[\d]+\])/g,'$2+$1');while(n[M](/\[/)){n=n[R](/(\[?[\d\.]+\]?)\*(\[?[\d\.]+\]?)/g,(q,p,r)=>{t=a[r[R](/[\[\]]/g,'')];return r[M](/\[/)?(t&&t[M](/\+|\-/)?(r+'*'+p):q):q});n=n[R](/\[(\d+)\]/g,(q,p)=>{return a[p]+(a[p][M](/\+|-/)?'=':'')})}return n};return c(z)[R](/./g,'$& ')+'='}

Tôi không chắc là một giải pháp tối thiểu, nhưng khá đầy đủ, cho phép cả ba phần thưởng. Một số trường hợp yêu cầu nhiều lần nhấn phím bằng, nhưng không yêu cầu xóa nội dung máy tính. (ví dụ 3,5,6 & 7 trong fiddle)

Liên kết với JSFiddle với một số thử nghiệm: https://jsfiddle.net/2v8rkysp/3/

Đây là một số mã chưa được mở, chưa được kiểm duyệt với một vài bình luận cho biện pháp tốt.

function f(z) {
var a=[],i=0;
function c(n) {
    //// Tokenize parentheses groups recursively
    while (n.match(/\(/)) {
    n = n.replace(/\(([^()]+)\)/g, function(q,p) {
      m = ++i;
      a[m]=c(p);
      return '['+m+']';
    });
    }

    //// Allow implied multiplication with parentheses
    n = n.replace(/(\](?=\[|[\d])|[\d](?=\[))/g, '$1*');

    //// Tokenize mult/division
    n = n.replace(/\[?[\d\.]+\]?[*\/]\[?[\d\.]+\]?/g, function(q) {
      a[++i]=q;
      return '['+i+']';
    });

    //// Move addition tokens to the front
    n = n.replace(/([\d.]+)\+(\[[\d]+\])/g,'$2+$1');

    //// Detokenize
    while (n.match(/\[/)) {
        //// If a token includes addition or subtraction,
        ////   move it to the front of other tokens 
        n = n.replace(/(\[?[\d\.]+\]?)\*(\[?[\d\.]+\]?)/g,function(q,p,r) {
          t=a[r.replace(/[\[\]]/g,'')];
          return r.match(/\[/)?(t&&t.match(/\+|\-/)?(r+'*'+p):q):q;
        });
        //// If a token includes addition or subtraction,
        ////   add the equals keypress
        n = n.replace(/\[(\d+)\]/g, function(q,p) {
           return a[p]+(a[p].match(/\+|-/)?'=':'');
        });
    }
    return n;
}
//// Add spaces and final equals keypress
return c(z).replace(/./g, '$& ')+'=';
}
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.