Cree un programa que resuelva una expresión matemática utilizando los elementos de lados alternos de la expresión. La forma en que se hace es que, en lugar de leer de izquierda a derecha, lee el primer carácter, luego el último, luego el segundo, luego el penúltimo, etc. Esto le dará una nueva expresión que debe evaluar y generar.
a*b/c+d-e
135798642 <-- Order you read the expression in
ae*-bd/+c <-- Order of operation.
Ejemplo:
1*3/2+4-5
15*-34/+2 = -255
Si la expresión no «funciona», 1
debe insertarse a en las posiciones necesarias para que funcione.
Algunos ejemplos probablemente lo ilustrarán mejor:
Input: 1+1+1+1+1
Result: 23 // Because 1+1+1+1+1 -> 11++11++1 -> 23
Input: 1+2-3+12-5
Result: -19 // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
// |
// Not valid expression
Input: 2*2*2*2*2
Result: 968 // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
// || ||
// Not valid, 1 must be inserted
Input: 17/2
Output: 127 // Because 17/2 = 127/ -> 127/1 -> 127
Los operadores que deben ser compatibles son + - * /
. No habrá paréntesis. Se utilizan reglas matemáticas normales y "sintaxis", por lo que, por ejemplo **
, no significa exponenciación. a++++1
es equivalente a a+1
(es decir, estilo MATLAB, no C ++).
En caso de duda, algunas operaciones válidas son:
-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b
Si bien todo lo siguiente no es válido. Se muestra con qué se deben sustituir:
a+ | a+1
a- | a-1
a++++ | a++++1 (This is equivalent to a+1)
a*+++ | a*+++1 (This is equivalent to a*1)
a**b | a*1*b
a*/b | a*1/b
a/*b | a/1*b
a* | a*1
*a | 1*a
***a | 1*1*1*a
Reglas:
- El código puede ser una función o un programa completo.
- La entrada puede ser STDIN o argumento de función
- La entrada debe ser una expresión matemática válida, sin comillas,
''
o""
. - La salida debería ser la respuesta a la nueva expresión, como un entero, decimal o una fracción simplificada.
- Se deben admitir al menos tres dígitos después del punto decimal. Entonces
1/3 = 0.333
no0.33
.0.333333333
es aceptado. ans = ...
es aceptado.- Se aceptan nuevas líneas y espacios iniciales y finales.
- La entrada solo serán enteros
- La división por cero puede provocar un error, NaN, Inf, etc. No se acepta emitir un número.
Como siempre, gana el código más corto en bytes. Se seleccionará un ganador una semana a partir del día en que se publicó el desafío. Las respuestas publicadas más tarde aún pueden ganar si es más corto que el líder actual.
0/0
si la expresión evalúa la división entera o el módulo por cero?
x/0
es una salida válida. Mientras no muestre una respuesta incorrecta, está bien. Error y "No es un número" es por definición correcto, y el infinito es "lo suficientemente correcto",
2^64
, y si se produce un error, ¿debería pasar?