Введение
Помогите! Я случайно уронил свой калькулятор 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)
, также не будет соответствовать первому предположению. - Вы можете предположить, что
*
между целым и левым круглыми скобками всегда будет (Valid:,6*(7)
Invalid:)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%, если ваша программа может обрабатывать неограниченное количество скобок.
Это код-гольф , выигрывает самый короткий код в байтах (включая бонусы)!
Leaderboards
Вот фрагмент стека, чтобы генерировать как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## 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>
6(7)
не будет, это также говорит о том , что знак?
в6?(7)
всегда будет*
.Ответы:
Python 3.
337327 - 10% = 295 байтПоддерживает с плавающей точкой и неограниченное количество скобок, поэтому имеет право на бонус -10%.
источник
sys.argv[1]
сinput()
работами в ideone (и shoter - намек намек)input()
что это Python 3! Python 2'sraw_input()
===
Python 3'sinput()
!TI-BASIC, 605,2 байта
Имеет право на получение вознаграждения TI-BASIC от lirtosiast в разделе « Подходящие, но неподходящие языки» .
Квалифицируется на все 3 бонуса
712 - 15% = 605.2
. Здесь и там есть кое-какие возможности для игры в гольф, но сначала я хотел это выяснить, поскольку некоторые из потенциальных гольфов нетривиальны. Обратите внимание, что TI-BASIC - это токенизированный язык, а ниже приведено текстовое представление этой программы. Таким образом, программа не имеет 1182 байта, так как эта программа не кодируется в UTF-8. Обратите внимание , что~
эквивалентно унарное отрицание и->
кSTO>
оператору. Выход - строка, которую можно получить изAns
илиStr1
.Приведенная ниже программа является результатом нескольких часов размышлений и программирования программиста, распределенных в течение нескольких недель.
Общее объяснение
Вот ключ, с которым я работал при разработке программы:
А вот эквивалентный рукописный код JavaScript, который я использовал для тестирования и разработки этой программы.
Я дам более подробное объяснение, как только буду уверен, что закончил играть в гольф, но пока что это может помочь обеспечить быстрое понимание кода.
источник
Input "",Str1 0->dim(L1 0->dim(L2 1->I DelVar S
может бытьPrompt Str1:SetUpEditor :1->I
, и вы можете использовать toString (. Также есть несколько лишнихtoString
как у меня самого нет СЕ. Я посмотрю на эмуляцию, чтобы убедиться в правильности программы.Javascript (ES6), 535 - 80 (бонус 15%) = 455 байт
Я уверен, что это не минимальное решение, а довольно полное решение, учитывающее все три бонуса. В некоторых случаях требуется многократное нажатие клавиши равенства, но не требуется очистка содержимого калькулятора. (напр. 3,5,6 и 7 в скрипке)
Ссылка на JSFiddle с некоторыми тестами: https://jsfiddle.net/2v8rkysp/3/
Вот некоторый развернутый, полу-необсуждаемый код с несколькими комментариями для хорошей меры.
источник