ช่วยด้วย! เครื่องคิดเลขของฉันพัง! (เปลี่ยนนิพจน์จำนวนเต็มเป็นการกดปุ่มเครื่องคิดเลข)


30

บทนำ

ช่วยด้วย! ฉันเผลอทิ้งเครื่องคิดเลข TI-84 ของฉันออกไปนอกหน้าต่าง (ไม่ต้องถามว่าทำอย่างไร) และมันก็พัง ฉันมีการทดสอบทางคณิตศาสตร์ในวันพรุ่งนี้และเครื่องคิดเลขเพียงตัวเดียวที่ฉันพบคือปุ่มที่มี:

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

แบบทดสอบคณิตศาสตร์ของฉันคือแบบทดสอบทบทวนการประเมินผลนิพจน์ ฉันต้องการโปรแกรมเพื่อแสดงออกเช่น1+(5*4)/7และแปลงเป็นการกดแป้นที่จำเป็นในการแก้ปัญหาในเครื่องคิดเลขสำรองของฉัน (และในกรณีที่คุณสงสัยสิ่งนี้เกิดขึ้นกับฉันจริง ๆ )

ท้าทาย

ได้รับสายเข้าไม่ว่างเปล่าที่มีเพียงตัวละคร0-9, (, ), +, -, *และ/การส่งออกการกดแป้นพิมพ์ในสตริงพื้นที่แยกออกจากกัน (เช่น. 1 + 3 / 3 =) จะต้องมีเครื่องหมายเท่ากับเสมอในตอนท้ายของเอาต์พุต ไม่อนุญาตช่องโหว่มาตรฐาน

ตัวอย่าง:

  • อินพุต: 1+(5*4)/7, เอาต์พุต:5 * 4 / 7 + 1 =
  • อินพุต: 6*(2/3), เอาต์พุต:2 / 3 * 6 =
  • อินพุต: (7-3)/2, เอาต์พุต:7 - 3 / 2 =

เพื่อทำให้ความท้าทายนี้ง่ายขึ้น:

  • คุณอาจสันนิษฐานว่าอินพุตมีชุดของการกดแป้นพิมพ์ที่เชื่อมโยงกับมันซึ่งไม่จำเป็นต้องทำการล้างเครื่องคิดเลข ( 1-(7*3)ไม่ถูกต้องเพราะมันจะทำให้คุณต้องค้นหา7 * 3แล้วล้างเครื่องคิดเลขให้ทำ1 - 21ตัวอย่างข้างต้นทั้งหมดใช้ได้เนื่องจากมี เอาท์พุทต่อเนื่องที่ไม่ต้องการให้ผู้ใช้ล้างเครื่องคิดเลขและจำหมายเลข)
  • คุณอาจคิดว่าจะมีจำนวนเต็มเดียวหลังจาก a /เนื่องจากมีอินพุตเช่น21/(7*3)จะไม่ผ่านสมมติฐานแรกเช่นกัน
  • คุณอาจคิดว่าจะมี*วงเล็บระหว่างจำนวนเต็มกับวงเล็บซ้ายเสมอ (ใช้ได้: 6*(7), ไม่ถูกต้อง:6(7) )
  • คุณอาจจะสมมติว่าอินพุตสร้างเอาต์พุตจำนวนเต็มเสมอ
  • คุณอาจสมมติว่าอินพุตมีวงเล็บสามระดับเท่านั้น

Non-ตัวอย่าง

  • 2-(14/2)ในขณะที่คุณจะต้องทำ14 / 2แล้วล้าง2 - 7แล้ว
  • 36/(2*3)ในขณะที่คุณจะต้องทำ2 * 3แล้วล้าง36 / 6แล้ว
  • 1024*4/(1*2+2)ในขณะที่คุณจะต้องทำ1*2+2แล้วล้าง1024 * 4 / 4แล้ว

โบนัส

  • -5%ถ้าโปรแกรมของคุณสามารถจำการคูณวงเล็บได้ (มันรู้อย่างนั้น6(7)=6*(7))
  • -5%ถ้าโปรแกรมของคุณสามารถจัดการกับการป้อนข้อมูลที่มีตัวเลขทศนิยม ( 3.4, 2.75, 7.8) และผลผลิตรวม.(รวมทั้งที่จะต้องมีความ.สำคัญในเครื่องคิดเลขว่างของฉันในกรณีนี้)
  • -5%ถ้าโปรแกรมของคุณสามารถจัดการกับวงเล็บไม่ จำกัด ระดับ

นี่คือ , โค้ดที่สั้นที่สุดในหน่วยไบต์ (รวมถึงโบนัส) ชนะ!

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

## [><>](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>


คุณได้รับอนุญาตให้เรียกใช้โปรแกรม แต่ไม่สามารถใช้เพื่อเรียกใช้สมการจริงหรือ 0.o
Downgoat

6
@ Vɪʜᴀɴคุณจะต้องถามครูคณิตศาสตร์ของฉันเกี่ยวกับเรื่องนั้นฉันก็ไม่เข้าใจเหมือนกัน
GamrCorps

เราจำเป็นต้องจัดการกับคำสั่งของการดำเนินการ?
lirtosiast

1
เราสามารถมีกรณีทดสอบที่ยาวกว่าและซับซ้อนกว่านี้ด้วยการปฏิบัติการสิบหรือมากกว่านั้นได้หรือไม่?
lirtosiast

1
มีการพิมพ์ผิด ในข้อความที่บอกว่า6(7)จะไม่เกิดขึ้นก็ยังกล่าวว่าการเข้าสู่ระบบ?ในจะเป็น6?(7) *
wizzwizz4

คำตอบ:


11

Python 3. 337 327 - 10% = 295 ไบต์

รองรับระดับจุดลอยตัวและวงเล็บไม่ จำกัด ดังนั้นจึงมีสิทธิ์ได้รับโบนัส -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 This does work, you just have to use command line arguments. Replacing sys.argv[1] with input() works in ideone (and is shoter - hint hint)
GamrCorps

Are there guidelines somewhere that make things clear such as input is supposed be read, not passed as an argument? (Btw @GamrCorps you mean raw_input(), which would only save me 4 characters: "sys,".) As for not shaving off the last few characters, I really just wanted to get the ball rolling and see other peoples' solutions, especially if they do something more interesting than recursive-descent.
mjmt

@mjmt input can be taken in any method: command-line args, input(), etc.
GamrCorps

1
@mjmt GamrCorps หมายถึงinput()เพราะนี่คือ Python 3! Python 2raw_input() === Python 3's input()!
wizzwizz4

8

TI-BASIC, 605.2 bytes

Eligible for lirtosiast's TI-BASIC bounty under Fitting but Unsuitable Languages.

มีสิทธิ์ได้รับโบนัสทั้ง 3 712 - 15% = 605.2ตัว มีโอกาสในการเล่นกอล์ฟที่นี่และที่นั่น แต่ฉันต้องการที่จะทำให้มันออกมาก่อน โปรดทราบว่า TI-BASIC เป็นภาษาที่ใช้ทำโทเค็นและด้านล่างเป็นข้อความที่แสดงถึงโปรแกรมนั้น ดังนั้นโปรแกรมไม่ใช่ 1182 ไบต์เนื่องจากโปรแกรมนี้ไม่ได้เข้ารหัสภายใต้ UTF-8 โปรดทราบว่า~เทียบเท่ากับการปฏิเสธเอกและ->กับSTO>ผู้ประกอบการ เอาท์พุทเป็นสตริงเอากลับคืนจากหรือAnsStr1

โปรแกรมด้านล่างนี้เป็นผลมาจากการคิดและการเขียนโปรแกรมชั่วโมงสองสามโปรแกรมแผ่กระจายไปทั่วสองสามสัปดาห์

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

คำอธิบายทั่วไป

นี่คือกุญแจสำคัญที่ฉันทำงานด้วยขณะพัฒนาโปรแกรม:

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)

และนี่คือโค้ดจาวาสคริปต์ที่เทียบเท่ากับที่ฉันใช้ในการทดสอบและพัฒนาโปรแกรมนี้

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

ฉันจะอธิบายเพิ่มเติมในเชิงลึกเมื่อฉันแน่ใจว่าฉันเล่นกอล์ฟเสร็จแล้ว แต่ในระหว่างนี้อาจช่วยให้เข้าใจรหัสคร่าวๆได้


คุณสามารถสันนิษฐานได้ว่าเครื่องคิดเลข TI-84 + CE สดเพื่อให้Input "",Str1 0->dim(L1 0->dim(L2 1->I DelVar SสามารถPrompt Str1:SetUpEditor :1->Iและคุณสามารถใช้ toString (นอกจากนี้ยังมีบาง parens ฟุ่มเฟือย..
lirtosiast

@lirtosiast จุดที่ดีเกี่ยวกับเครื่องคิดเลขที่สดใหม่ฉันไม่ต้องการรวมtoStringเพราะฉันไม่มี CE ด้วยตัวเอง ฉันจะดูการจำลองเพื่อให้แน่ใจว่าโปรแกรมมีผล
Conor O'Brien

7

Javascript (ES6), 535 - 80 (โบนัส 15%) = 455 ไบต์

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,'$& ')+'='}

ไม่ใช่วิธีแก้ปัญหาที่น้อยที่สุด แต่ก็ค่อนข้างสมบูรณ์ซึ่งทำให้ได้โบนัสทั้งสามตัว บางอินสแตนซ์ต้องการการกดปุ่มที่สำคัญหลายครั้ง แต่ไม่ต้องการการล้างเนื้อหาของเครื่องคิดเลข (เช่น 3,5,6 และ 7 เป็นซอ)

เชื่อมโยงไปยัง JSFiddle ด้วยการทดสอบบางอย่าง: https://jsfiddle.net/2v8rkysp/3/

นี่คือโค้ดบางส่วนที่ไม่คลี่คลายออกมาครึ่งวงกลมที่มีความเห็นเล็กน้อยสำหรับการวัดที่ดี

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, '$& ')+'=';
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.