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>
la source
6(7)
cela ne se produira, il dit aussi que le signe?
en6?(7)
sera toujours*
.Réponses:
Python 3.
337327 - 10% = 295 octetsPrend en charge les niveaux à virgule flottante et illimités de parenthèses, donc qualifie pour le bonus -10%
la source
sys.argv[1]
par desinput()
œuvres dans ideone (et est shooter - hint hint)input()
que c'est Python 3! Python 2'sraw_input()
===
Python 3'sinput()
!TI-BASIC, 605,2 octets
Admissible à la prime TI-BASIC de lirtosiast sous les langues adaptées mais inappropriées .
Admissible à tous les 3 bonus,
712 - 15% = 605.2
. Il y a des opportunités de golf ici et là, mais je voulais d'abord en parler, car certains golfs potentiels ne sont pas triviaux. Veuillez noter que TI-BASIC est un langage à jetons, et ce qui suit est une représentation textuelle de ce programme. Ainsi, le programme n'est pas de 1182 octets, car ce programme n'est pas codé sous UTF-8. Notez que cela~
équivaut à la négation unaire et->
à l'STO>
opérateur. La sortie est une chaîne, récupérable à partir deAns
ouStr1
.Le programme ci-dessous est le résultat de quelques heures de programmation et de réflexion programmées, réparties sur quelques semaines.
Explication générale
Voici la clé avec laquelle j'ai travaillé pendant le développement du programme:
Et voici le code JavaScript manuscrit équivalent que j'ai utilisé pour tester et développer ce programme.
Je fournirai une explication plus approfondie une fois que je serai sûr d'avoir fini de jouer au golf, mais en attendant, cela pourrait aider à fournir une compréhension rapide du code.
la source
Input "",Str1 0->dim(L1 0->dim(L2 1->I DelVar S
peut être le casPrompt Str1:SetUpEditor :1->I
, et vous pouvez utiliser toString (.toString
car je n'ai pas de CE moi-même. J'examinerai l'émulation pour garantir la validité du programme.Javascript (ES6), 535 - 80 (bonus de 15%) = 455 octets
Pas une solution minimale, j'en suis sûr, mais assez complète, permettant les trois bonus. Certaines instances nécessitent plusieurs pressions sur la touche égale, mais ne nécessitent pas l'effacement du contenu de la calculatrice. (ex. 3,5,6 & 7 au violon)
Lien vers JSFiddle avec quelques tests: https://jsfiddle.net/2v8rkysp/3/
Voici du code déplié, semi-dégagé avec quelques commentaires pour faire bonne mesure.
la source