30
6
Introduction
Help! I accidentally dropped my TI-84 calculator out my window (don't ask how) and it broke. I have a math test tomorrow and the only calculator I can find is one with these buttons:
7 8 9 +
4 5 6 -
1 2 3 *
0 = /
My math test is a review test on evaluating expressions. I need a program to take an expression such as 1+(5*4)/7
and convert it to the keystrokes needed to solve it on my spare calculator. (And in case you were wondering, this actually happened to me).
Challenge
Given a non-empty input string containing only the characters 0-9
, (
, )
, +
, -
, *
, and /
, output the keystrokes in a space-separated string (eg. 1 + 3 / 3 =
). There must always be an equal sign at the end of the output. Standard loopholes are not allowed.
Examples:
- Input:
1+(5*4)/7
, Output:5 * 4 / 7 + 1 =
- Input:
6*(2/3)
, Output:2 / 3 * 6 =
- Input:
(7-3)/2
, Output:7 - 3 / 2 =
To make this challenge easier:
- You may assume that the input has a series of keystrokes linked to it that does not require clearing the calculator (
1-(7*3)
is not valid since it would require you to find7 * 3
, then clear the calculator to do1 - 21
. All the above examples are valid since there is one, continuous output that does not require the user to clear the calculator and remember a number). - You may assume that there will only be a single integer after a
/
, as having an input such as21/(7*3)
would not pass the first assumption either. - You may assume that there will always be a
*
between an integer and a left parentheses (Valid:6*(7)
, Invalid:6(7)
). - You may assume the input always produces integer output.
- You may assume the input only has three levels of parentheses.
Non-examples
2-(14/2)
as you would have to do14 / 2
, then clear, then2 - 7
.36/(2*3)
as you would have to do2 * 3
, then clear, then36 / 6
.1024*4/(1*2+2)
as you would have to do1*2+2
, then clear, then1024 * 4 / 4
.
Bonuses
- -5% if your program can recognize parentheses multiplication (it knows that
6(7)=6*(7)
). - -5% if your program can handle input with decimal numbers (
3.4
,2.75
,7.8
) and the output includes.
(as there must be a.
key on my spare calculator in this case). - -5% if your program can handle unlimited levels of parentheses.
This is code-golf, shortest code in bytes (including the bonuses) wins!
Leaderboards
Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.
To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:
## Language Name, N bytes
where N
is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:
## Ruby, <s>104</s> <s>101</s> 96 bytes
If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:
## Perl, 43 + 2 (-p flag) = 45 bytes
You can also make the language name a link which will then show up in the leaderboard snippet:
## [><>](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>
You're allowed to run programs but can't use them to run the actual equation? 0.o – Downgoat – 2015-10-25T17:16:17.520
6@Vɪʜᴀɴ You're going to have to ask my math teacher on that, I didn't understand it either. – GamrCorps – 2015-10-25T17:17:14.403
Do we need to handle order of operations? – lirtosiast – 2015-10-26T05:14:52.253
@ThomasKwa yes order of operations should be handled – GamrCorps – 2015-10-26T14:43:15.257
Do we need to handle expressions like
3*2+(5)
? The expression can be translated to3 * 2 + 5 =
, but the parentheses were not executed first. – lirtosiast – 2015-10-26T23:52:34.767Yes. According to order of operations
3*2+(5)
does equals3 * 2 + 5
, therefore it is able to be solved without clearing the calculator. – GamrCorps – 2015-10-26T23:53:42.267Do we need to handle
1-(2-3)
(distributing the-
)? – lirtosiast – 2015-10-28T21:43:31.143@ThomasKwa no. You would have to memorize 2-3 then clear then do 1-(-1) – GamrCorps – 2015-10-28T22:50:45.067
If we handle decimals, can we assume that numbers will never start or end with a decimal point (e.g.
.142857
,100.
)? – lirtosiast – 2015-10-29T02:24:13.740@ThomasKwa yes. It wil always be 0.~ or ~.0 – GamrCorps – 2015-10-29T02:54:34.313
1Can we have some longer, more complicated test cases with ten or so operations? – lirtosiast – 2015-10-30T05:58:09.217
@ThomasKwa sure, Ill add some as soon as I havr time. – GamrCorps – 2015-10-30T13:03:46.793
1There is a typo. In the text saying that
6(7)
won't happen, it also says that the sign?
in6?(7)
will always be a*
. – wizzwizz4 – 2016-01-08T16:56:24.320There's no need to memorize and clear on expressions like
1-(7*3)
, the translation would be- 7 * 3 + 1
. For1-(2-3)
it would be- 2 + 3 + 1
. There could be a bonus for handling that. – charlie – 2016-01-12T12:43:41.963