Este desafío pero con una mejor especificación.
Especificaciones
Su programa tomará una ecuación lineal que contiene una sola variable x
y generará el valor de x
.
Entrada / análisis
- La entrada solo contendrá números, operadores, paréntesis (
()
)x
y un=
signo (esto significa que no hay espacios en blanco). - Los paréntesis siempre serán equilibrados.
- Siempre habrá al menos 1
x
. Unx
puede estar precedido por un número. - Todas las ecuaciones tendrán exactamente un resultado.
Se puede definir un número siguiendo estos pasos. Un número se puede definir por la expresión regular: -?(\d+(\.\d+)?|\.\d+)
.
Si no habla regex: un dígito se define como 0-9
- Puede tener un
-
al principio que significa negativo - Entonces puede haber algunos dígitos. Si no son dígitos, habrá un punto decimal
- Si existe un punto decimal, al menos un dígito lo seguirá
El mayor número / valor será definido por las capacidades de su idioma.
Un operador es cualquiera de: +-*/
siempre aparecerán entre números o paréntesis
Esto significa (5)(5)
que no es una entrada válida en aras de la simplicidad.
El paréntesis siempre contendrá una expresión válida (una combinación válida de números y / u operadores) dentro de ellos. El paréntesis "equilibrado" se define como cada uno (
tendrá un cierre asociado)
Evaluación
- Se debe seguir el orden de las operaciones y las precedentes son (de mayor a menor):
- Paréntesis (el más anidado primero)
- Multiplicación y división
- Suma resta
- Si se producen dos operadores con la misma precedencia, debe preferir ir a la izquierda -> derecha
Salida
Debe generar el resultado de alguna manera. Si no emite solo el resultado numérico, aclare en su respuesta cómo se emite la salida. Su formato de salida debe ser consistente. La salida puede ser un decimal, pero siempre será racional, la precisión se limita a la precisión de su idioma. Solo si su idioma no es compatible con la aritmética de coma flotante, no es necesario que lo sea.
Reglas
- Se permiten los elementos integrados que trivializan esta tarea , pero debe agregar
[uses built-in]
claramente al encabezado de la respuesta. Esto exime su respuesta de ganar - Un "Incorporado trivializando esta tarea" es cualquiera de:
- Algo que toma una ecuación y genera el valor para una / la variable
- Algo que simplificará completamente una ecuación.
- Usar
eval
o una función relacionada para realizar una cantidad significativa del análisis. El usoeval
y las funciones relacionadas no se permiten si se utilizan para (con una modificación mínima a la entrada) resolver ecuaciones lineales. - Si tiene dudas, solo pregunte en un comentario.
- Se permiten los elementos integrados que analizan la ecuación.
Ejemplos
3+4=x
7
4+x=5
1
3+3*3=x
12
3x-4=7+2x
11
3--1=x
4
3*(2+4x)=7x-4
-2
1.2+2.3x=5.8
2
10=4x
2.5
Entradas inválidas :
(5)(4)=x no operator between (5) and (4)
5(x+3)=2 no operator 5 and (...)
x=y the only variable is x
4=3 there is no x
x+3=x-7 no solution
x=x infinite solutions
+5=x + is not an unary operator. -5=x would be valid though
1/(x-3)=5 Nonlinear
3/x Nonlinear
fuente
eval
trivializar el desafío? Además, ¿las formas denew Function(...)
conteo?Respuestas:
JavaScript ES6, 246 bytes
Todavía queda algo de golf, ¡pero al menos es una solución!
Nombra la función
n=>{n=n.split("=")...
para usarla.Hyper-ungolfed:
Esto utiliza un enfoque de pivote. (No estoy seguro de si así se llama el algoritmo, solo un nombre que inventé). Primero recoge en qué dirección buscar desde cero (es decir, de qué manera se intersectarán las pendientes de los dos lados de las ecuaciones) y busca el valor Una vez que encuentra un punto de mínima diferencia, va a ese punto y disminuye el incremento de búsqueda. Esto finalmente da como resultado una solución precisa que necesitamos.
fuente
JavaScript (Node.js) ,
10693 bytesPruébalo en línea!
-13 bytes gracias a @tsh
Sin golf:
Explicación:
Esta solución funciona con el método de Newton para encontrar raíces. El código resta el lado derecho de la ecuación del lado izquierdo, de manera que cuando
f(x)=0
,x
será igual al valor que estamos despejando. Por lo tanto, cuando encontremos la raíz de esta nueva función, será nuestrox
valor deseado . Luego encuentra la derivadaf'(x)
al encontrar la pendiente entre dos puntos de la función. A continuación, los valores se inserta simplemente en el método de Newton que establece una aproximación de la raízx
,x=x-(f(x)/f'(x))
(en el código, se utiliza como un 0 inicial dex
valor). Como esto encuentra las raíces, encuentra nuestrox
valor. Y como se garantiza que la ecuación sea lineal, la aproximación será exacta.fuente
Mathcad, [utiliza incorporado]
Mathcad tiene dos métodos integrados para resolver tales ecuaciones:
El solucionador simbólico está bastante contento con y = x y devuelve la solución x = y.
Para aquellos que no están familiarizados con Mathcad, la imagen a continuación se toma directamente del libro de trabajo WYSIWYGish Mathcad 15. Cambiar cualquiera de las expresiones donde están escritas hará que Mathcad reevalúe su respuesta y actualice la pantalla en consecuencia.
fuente
Axiom, 214 bytes [utiliza incorporado]
Para algún error devolvería% i, para otro tipo de errores la función se detiene del sistema, algo más como 1--2 parece estar fuera del lenguaje ... prueba:
fuente