Recientemente he estado escribiendo un nuevo lenguaje , para evitar la necesidad de manejar el orden de las operaciones , simplemente paréntesis cada expresión correctamente para evitar esto por completo.
Debido a que los paréntesis se encuentran en los códigos de caracteres 40-41, su código deberá ser lo más breve posible.
Ejemplos
1+2*3
(1+(2*3))
2*(3+4)
(2*(3+4))
2*3/4+3
(((2*3)/4)+3)
342*32/8
((342*32)/8)
Reglas
Las únicas operaciones que necesitará manejar son: *
(multiplicación), /
(división), +
(suma) y -
(resta).
- El orden de las operaciones es:
- Paréntesis
- Multiplicación, División
- Adición, resta
- Debes preferir ir de izquierda a derecha
- Los números de entrada siempre serán enteros positivos (ver bonificaciones)
Bonos
-20% si manejas la negación:
3+-5
(3+(-5))
-5% si permite que se coloquen espacios dentro de la entrada:
3 + 4
(3+4)
-10% si puede manejar decimales en la entrada:
1+.12
(1+.12)
1+0.21/3
(1+(0.21/3))
Recompensa 500: si logras escribir una respuesta en Sin nombre / Bloques
code-golf
arithmetic
balanced-string
Downgoat
fuente
fuente
1+2+3+4
(qué ciertas soluciones podrían estar entre paréntesis((1+2)+(3+4))
)Respuestas:
Python, 153 * 0.9 = 137.7 bytes
Este programa maneja la entrada decimal.
La segunda línea comienza con un espacio, la segunda comienza con una pestaña, la tercera con dos pestañas y la tercera con un espacio. Esto salvó un byte. Aquí hay un hexdump (
xxd
pp):Aquí hay un programa que usé para probar: (Guarde el programa anterior como
paren.py
)Asegúrese de que su terminal use el
\033[38;5;<COL>m
código de escape para los colores.fuente
prefer to go left-right
. Pruebe el caso de prueba 3 en el OP, su resultado no es correcto. Esto puede ser un problema real , por ejemplo, con la aritmética de enteros((2*(3/4))+3)
(((2*3)/4)+3)
JavaScript (ES6) 179 (263-20% -5% -10%)
Como las otras dos respuestas son actualmente incorrectas, publicaré la mía. Es una variación del analizador de expresiones que utilicé aquí y aquí y en otro lugar. Mire allí para obtener explicaciones de algoritmos más detalladas.
Es bastante voluminoso pero debería funcionar.
Fragmento de prueba
fuente
Python, 241 * 0.8 * 0.95 * 0.9 = 164.84 caracteres
Estoy usando la biblioteca ast (Árboles de sintaxis abstracta) y un dict de reemplazo de cadena homebrew. El reemplazo de la cuerda cuesta mucho, pero la bonificación ayuda a mantener el puntaje algo bajo. Tal vez (la parte de reemplazo de la cuerda) se pueda jugar más.
Tenga en cuenta que esta solución agrega un conjunto adicional de paréntesis alrededor de cada número, pero creo que eso está dentro del espíritu de la pregunta
Banco de pruebas:
Salida del conjunto de pruebas:
fuente
import ast
en su código