introduction
Aidez-moi! J'ai accidentellement laissé tomber ma calculatrice TI-84 par ma fenêtre (ne me demandez pas comment) et elle s'est cassée. J'ai un test de mathématiques demain et la seule calculatrice que je peux trouver est celle avec ces boutons:
7 8 9 +
4 5 6 -
1 2 3 *
0 = /
Mon test de mathématiques est un test de révision sur l'évaluation des expressions. J'ai besoin d'un programme pour prendre une expression telle que 1+(5*4)/7
et la convertir en touches nécessaires pour la résoudre sur ma calculatrice de rechange. (Et au cas où vous vous poseriez la question, cela m'est réellement arrivé).
Défi
Étant donné une chaîne d'entrée non vide contenant uniquement les caractères 0-9
, (
, )
, +
, -
, *
, et /
, la sortie des séquences de touches dans une chaîne de caractères séparés par des espaces (par exemple , . 1 + 3 / 3 =
). Il doit toujours y avoir un signe égal à la fin de la sortie. Les échappatoires standard ne sont pas autorisées.
Exemples:
- Entrée:,
1+(5*4)/7
Sortie:5 * 4 / 7 + 1 =
- Entrée:,
6*(2/3)
Sortie:2 / 3 * 6 =
- Entrée:,
(7-3)/2
Sortie:7 - 3 / 2 =
Pour faciliter ce défi:
- Vous pouvez supposer que l'entrée a une série de touches qui ne nécessite pas d'effacer la calculatrice (
1-(7*3)
n'est pas valide car il vous faudrait trouver7 * 3
, puis effacer la calculatrice à faire1 - 21
. Tous les exemples ci-dessus sont valides car il y en a un , sortie continue qui ne nécessite pas que l'utilisateur efface la calculatrice et mémorise un nombre). - Vous pouvez supposer qu'il n'y aura qu'un seul entier après a
/
, car avoir une entrée telle que21/(7*3)
ne passerait pas non plus la première hypothèse. - Vous pouvez supposer qu'il y aura toujours un
*
entre un entier et une parenthèse gauche (valide6*(7)
:, invalide:)6(7)
. - Vous pouvez supposer que l'entrée produit toujours une sortie entière.
- Vous pouvez supposer que l'entrée n'a que trois niveaux de parenthèses.
Non-exemples
2-(14/2)
comme il faudrait le faire14 / 2
, alors clair , alors2 - 7
.36/(2*3)
comme il faudrait le faire2 * 3
, alors clair , alors36 / 6
.1024*4/(1*2+2)
comme il faudrait le faire1*2+2
, alors clair , alors1024 * 4 / 4
.
Bonus
- -5% si votre programme peut reconnaître la multiplication des parenthèses (il le sait
6(7)=6*(7)
). - -5% si votre programme peut gérer les entrées avec des nombres décimaux (
3.4
,2.75
,7.8
) et la sortie comprend.
(comme il doit y avoir une.
clé sur ma calculatrice de rechange dans ce cas). - -5% si votre programme peut gérer des niveaux illimités de parenthèses.
C'est le code-golf , le code le plus court en octets (y compris les bonus) gagne!
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
## [><>](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>
6(7)
cela ne se produira, il dit aussi que le signe ?
en 6?(7)
sera toujours *
.