Introducción
¡Ayuda! Accidentalmente dejé caer mi calculadora TI-84 por la ventana (no pregunte cómo) y se rompió. Mañana tengo un examen de matemáticas y la única calculadora que puedo encontrar es una con estos botones:
7 8 9 +
4 5 6 -
1 2 3 *
0 = /
Mi examen de matemáticas es un examen de revisión para evaluar expresiones. Necesito un programa para tomar una expresión como 1+(5*4)/7
y convertirla a las teclas necesarias para resolverla en mi calculadora de repuesto. (Y en caso de que te lo estés preguntando, esto realmente me pasó a mí).
Reto
Dada una cadena de entrada no vacía que contiene solamente el caracteres 0-9
, (
, )
, +
, -
, *
, y /
, de salida de las pulsaciones de teclas en una cadena separada por espacios (por ejemplo. 1 + 3 / 3 =
). Siempre debe haber un signo igual al final de la salida. Las lagunas estándar no están permitidas.
Ejemplos:
- Entrada:
1+(5*4)/7
Salida:5 * 4 / 7 + 1 =
- Entrada:
6*(2/3)
Salida:2 / 3 * 6 =
- Entrada:
(7-3)/2
Salida:7 - 3 / 2 =
Para facilitar este desafío:
- Puede suponer que la entrada tiene una serie de pulsaciones de teclas vinculadas que no requieren borrar la calculadora (
1-(7*3)
no es válida ya que requeriría que encuentre7 * 3
, luego borre la calculadora para hacerlo1 - 21
. Todos los ejemplos anteriores son válidos ya que hay uno , salida continua que no requiere que el usuario borre la calculadora y recuerde un número). - Puede suponer que solo habrá un número entero después de a
/
, ya que tener una entrada tal como21/(7*3)
tampoco pasaría la primera suposición. - Puede suponer que siempre habrá un
*
paréntesis entre un entero y un paréntesis izquierdo (Válido:, No6*(7)
válido:)6(7)
. - Puede suponer que la entrada siempre produce una salida entera.
- Puede suponer que la entrada solo tiene tres niveles de paréntesis.
No ejemplos
2-(14/2)
como tendrías que hacer14 / 2
, entonces claro , entonces2 - 7
.36/(2*3)
como tendrías que hacer2 * 3
, entonces claro , entonces36 / 6
.1024*4/(1*2+2)
como tendrías que hacer1*2+2
, entonces claro , entonces1024 * 4 / 4
.
Bonos
- -5% si su programa puede reconocer la multiplicación de paréntesis (lo sabe
6(7)=6*(7)
). - -5% si el programa puede manejar la entrada con números decimales (
3.4
,2.75
,7.8
) y la salida incluye.
(ya que debe haber una.
clave en mi calculadora de repuesto en este caso). - -5% si su programa puede manejar niveles ilimitados de paréntesis.
Este es el código de golf , ¡el código más corto en bytes (incluidos los bonos) gana!
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
## [><>](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)
eso no sucederá, también dice que el inicio?
de sesión6?(7)
siempre será a*
.Respuestas:
Python 3.
337327 - 10% = 295 bytesAdmite coma flotante y niveles ilimitados de paréntesis, por lo que califica para un bono de -10%.
fuente
sys.argv[1]
porinput()
obras en ideone (y es shoter - pista pista)input()
porque esto es Python 3! Python 2'sraw_input()
===
Python 3'sinput()
!TI-BASIC, 605.2 bytes
Elegible para la recompensa TI-BASIC de lirtosiast en Adaptación pero idiomas inadecuados .
Califica para los 3 bonos,
712 - 15% = 605.2
. Hay algunas oportunidades de golf aquí y allá, pero quería sacar esto primero, ya que algunos de los posibles campos de golf no son triviales. Tenga en cuenta que TI-BASIC es un lenguaje tokenizado, y lo siguiente es una representación textual de ese programa. Por lo tanto, el programa no tiene 1182 bytes, ya que este programa no está codificado bajo UTF-8. Tenga en cuenta que~
es equivalente a la negación unaria y->
alSTO>
operador. La salida es una cadena, recuperable deAns
oStr1
.El siguiente programa es el resultado de unas pocas horas de programador pensando y programando, distribuidas en el transcurso de unas pocas semanas.
Explicación general
Aquí está la clave con la que trabajé mientras desarrollaba el programa:
Y aquí está el código JavaScript escrito a mano equivalente que usé para probar y desarrollar este programa.
Proporcionaré una explicación más profunda una vez que esté seguro de que he terminado de jugar al golf, pero mientras tanto, esto podría ayudar a proporcionar una comprensión superficial del código.
fuente
Input "",Str1 0->dim(L1 0->dim(L2 1->I DelVar S
puede serPrompt Str1:SetUpEditor :1->I
, y puede usar toString (. También tiene algunostoString
ya que yo no tengo un CE. Examinaré la emulación para asegurar la validez del programa.Javascript (ES6), 535-80 (15% de bonificación) = 455 bytes
No es una solución mínima, estoy seguro, pero es bastante completa, permitiendo los tres bonos. Algunas instancias requieren múltiples pulsaciones de la tecla igual, pero no requieren borrar el contenido de la calculadora. (ej. 3,5,6 y 7 en violín)
Enlace a JSFiddle con algunas pruebas: https://jsfiddle.net/2v8rkysp/3/
Aquí hay un código desplegado, semifuscado con algunos comentarios para una buena medida.
fuente