Introducción
Llega un punto en la infancia cuando crees que has dominado la suma y la multiplicación, luego aparece alguien y te informa que:
a * b + c = (a * b) + c! = a * (b + c),
y que no fue un proceso tan simple o lineal como se le enseñó anteriormente. Aprendes que existe algo llamado orden de operaciones . Esta es una forma muy importante de mantener cierto nivel de consistencia y expresión, sin que los paréntesis se interpongan en el camino de todo.
Argumento genérico
Un día, te despiertas con el sonido del pánico en las calles. Un grupo extremista bajo el nombre de " The 2560 " (abreviatura de "Organización contra el orden de las operaciones", con un torpe giro hexadecimal) ha utilizado sus métodos malvados para tomar el control de todas las armas nucleares en el mundo. Están reteniendo a todo el planeta como rehenes, y tienen una simple demanda: invertir el orden aceptado de operaciones o enfrentar la erradicación (los paréntesis deben mantener su prioridad). El nuevo sistema se llama PSADME (paréntesis, resta / suma, división / multiplicación, exponentes), y las expresiones evalúan de derecha a izquierda:
a - b - c = a - (b - c) = a + c - b
Pasan los días y la transición está en progreso. Mientras que los matemáticos y físicos están ocupados reescribiendo sus ecuaciones, los informáticos se enfrentan a la tarea de cambiar la forma en que las computadoras interpretan las expresiones matemáticas. Perteneces a un grupo secreto de programación rebelde que tiene como objetivo causar tanto tormento a los nuevos señores mundiales, y, por casualidad, The 2560 te selecciona al azar y te encargará de producir el programa de cálculo de referencia.
Tu misión
Escriba un programa (o función) que tome una expresión matemática (numérica) como entrada, calcule la expresión usando PSADME como el orden de las operaciones y genere el resultado. Las expresiones deben evaluar de derecha a izquierda, por lo que
Para simplificar, todos los números proporcionados serán enteros, y los cálculos producirán resultados enteros.
Reglas y puntaje
- El programa debe aceptar entradas de hasta 128 caracteres de longitud; si su idioma / plataforma tiene una longitud máxima de entrada más baja, esa es una excusa aceptable.
- Las lagunas estándar están prohibidas.
- El código ganador se elegirá el 18 de noviembre (4 semanas a partir de esta fecha de publicación).
- Siéntase libre de publicar un código que no se consideraría digno de golf. Esto se trata de diversión. Si tiene una forma interesante de hacerlo pero no puede jugarlo usted mismo (o por la naturaleza de su método), puede publicarlo de todos modos.
Como de costumbre, el código ganador es el que tiene el menor número de bytes, con algunos bonos de valor de entretenimiento:
- -5 para evitar el uso de los caracteres en la expresión proporcionada: + , - , ( , ) , ^ , * , /
- -5 para realizar los cálculos toma más de 5 minutos (pero no más de 10 minutos) para calcular en una computadora estándar, sin que el método sea obvio (usando el reloj o bucles innecesarios); El objetivo es convencer a los nuevos señores de que no estás tratando de interrumpir sus cálculos de fatalidad.
- - (5 + N) para un mensaje ofensivo directo (de longitud N, sin incluir espacios en blanco iniciales / finales) sobre los miembros de The 2560 que se escribirán a la vista dentro de su código, con alguna explicación ridícula de por qué debe ser allí. Si se elimina, el código no debe funcionar correctamente. Sí, puntos gratis por valor de entretenimiento.
Ejemplos y explicaciones.
[program] 2 - 2 - 2
2
2 - (2 - 2) = 2
[program] (2 + 2 * 3 + 3) / 3 + 3
4
(4 * 6) / (3 + 3) = 4
[program] 3 + 2 + 1 ^ 3
216
(3 + 2 + 1) ^ 3 = 216
[program] -5^2
25
(-5) ^ 2 = 25
[program] 32 / 8 * 3 - 1
2
32 / (8 * (3 - 1)) = 32/16 = 2
1 - 3 + 4 = 1 - 7
? De derecha a izquierda lo sugeriría, pero eso pone la suma por encima de la resta, al contrario de PSADME, ¿no?P(SA)(DM)E
.Respuestas:
Haskell, 134 bytes
Redefiniendo los operadores matemáticos con nuevas fijaciones y prioridades. Ahora:
fuente
perl -e'$_="import qualified Prelude as Pl 6^r 8+r 8-r 7*r 7/";s/(. \d(.))/\ninfix\1\n(\2)=(P.\2)/g;s~\./~.div~;print'>a.hs;ghci a.hs
Desafortunadamente, un error tipográfico hizo que el código generado careciera de espacio entre el dígito y el símbolo, pero aún funciona bien. Esto significa que su código puede perder 5 bytes y supera mi 'mejora'.sed
para generar y evaluar el código de shell. Probablemente una buena meta pregunta.GNU sed -r con extensión exec, 398
No es especialmente corto, pero hace el trabajo.
sed está bien para analizar la precedencia pero no hace aritmética. Entonces usamos la extensión GNU sed exec para
s
comando para externalizar la aritmética necesaria al shell.Por ahora asume todos los operadores, con la excepción de
^
tener exactamente un espacio delante y detrás.Prueba de salida:
fuente
JavaScript (ES6) 287
300Editar error corregido (solo un error tipográfico, 6 debería haber sido 4) - Se agregó una explicación completa al final del fragmento
Editar 2 Encontramos alguna mejora trabajando en otro desafío
Otra portada del mismo analizador con solo una mínima diferencia. (comparar con esto )
fuente