帮助!我不小心把我的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 )。以上所有示例都是有效的,因为有一个连续输出不需要用户清除计算器并记住一个数字)。/之后只有一个整数,因为输入(例如21/(7*3) )也不会传递第一个假设。* (有效:6*(7),无效:6(7))。非例
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。6(7)=6*(7))。3.4、2.75、7.8)的输入,并且输出包括. (因为在本例中,备用计算器上必须有一个.键)。这是密码-高尔夫,最短的字节代码(包括奖金)获胜!
这里有一个Stack代码片段,用于生成一个常规的领导板和一个按语言分列的获奖者概览。
为了确保您的答案显示出来,请使用下面的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 bytesvar 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>发布于 2019-02-17 04:50:55
有资格在适当但不合适的语言下获得lirtosiast的TI基本赏金。
有资格获得所有3项奖金,712 - 15% = 605.2。这里和那里都有一些打高尔夫球的机会,但是我想先把它弄出来,因为一些潜在的高尔夫球员是不平凡的。请注意,TI-BASIC是一种标记化语言,下面是该程序的文本表示。因此,程序不是1182字节,因为这个程序不是在UTF-8下编码的.注意,~等价于一元否定,而->等价于STO>运算符。输出是一个字符串,可从Ans或Str1检索。
下面的程序是几个程序员思考和编程的结果,分散在几个星期的过程中。
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)这是我用来测试和开发这个程序的等价的,手写的JavaScript代码.
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);我将提供一个更深入的解释,一旦我确定我完成了高尔夫,但在此期间,这可能有助于提供一个粗略的理解代码。
https://codegolf.stackexchange.com/questions/61751
复制相似问题