Me encanta la programación y sé todos los idiomas, pero soy muy malo en matemáticas. Desafortunadamente, mi escuela requiere que los estudiantes de computación tomen un año de cálculo. ¡Hay una prueba la próxima semana, y no conozco ninguna de las fórmulas para derivados!
Por favor, ayúdame a encontrar las fórmulas. Necesito una hoja de trucos: un programa (lo más corto posible para que mi maestro no lo note) que toma una expresión (como 4*x^3-2
) como entrada y genera la derivada. (No me importa si la entrada y la salida usan argumentos de línea de comando, STDIN, STDOUT o lo que sea, ya que de todos modos estoy haciendo todo el cálculo en mi cabeza).
La prueba cubre los siguientes tipos de funciones:
- Constantes, como
-3
o8.5
- Funciones de potencia, como
x^0.5
ox^-7
- Funciones exponenciales, como
0.5^x
o7^x
(la base siempre es positiva) - Una constante multiplicada por una función, como
3*x^5
o-0.1*0.3^x
- La suma y diferencia de múltiples funciones, como
-5*x^2+10-3^x
Mi maestro siempre formatea sus preguntas exactamente de la misma manera, como se muestra arriba. Tampoco usa fracciones, números como pi o e , o números realmente grandes (más de 1,000). Él nunca usa paréntesis, y siempre muestra multiplicación usando un asterisco ( *
). La única variable utilizada es siempre x .
Por otro lado, mi maestro es bastante indulgente con las respuestas. No necesitan simplificarse ni formatearse exactamente como se muestra arriba, siempre que esté claro lo que dice la respuesta.
Si bien puedo usar cualquier idioma, recuerde que no puedo encontrar derivados por mí mismo. Entonces, si el programa usa funciones incorporadas para tratar ecuaciones o calcular derivadas, no podré usarlo.
Durante la prueba, no tendré acceso a Internet ni a ningún archivo que no sea el programa en la hoja de trucos.
Nota: Este escenario es completamente ficticio. En la vida real, hacer trampa y ayudar a otros a hacer trampa está mal y nunca se debe hacer.
x
sea siempre la variable para diferenciar?Respuestas:
Wolfram
136134109 [Gracias a Calle por su comentario a continuación]Soporte limitado para reglas de productos y cadenas.
Ejemplo:
Tenga en cuenta que esto no utiliza ninguna "función incorporada para tratar ecuaciones o calcular derivadas": solo interviene la coincidencia de patrones *.
[* Bueno ... técnicamente, el intérprete también analiza y crea una especie de AST a partir de la entrada también]
Sin golf:
fuente
Power
,Times
etc. IDK, sin embargo, cuánto mejorará su versión de golf, pero tiene al menos unoTimes
allí para que pueda definir. guardar algunos personajes También tenga en cuenta que en su versión sin golf diced[expr_]:= v/...
.Perl - 121
122(+2 para
-p
)Prueba:
fuente
Haskell 38 Chars
La función
d
toma una función y devuelve una función. Se ingresa en forma de serie de potencia y se emite de la misma manera (que es un tipo de lo que sea).Por ejemplo, si ingresamos
x->x^2
, obtenemosx->2*x
.Y para la función exponencial.
fuente
2^x
?4*x^3-2
) como entrada", como lo requiere el OP.Prolog 176
Operadores admitidos: binario
+
, binario-
, binario*
, binario^
, unario-
. Tenga en cuenta que unary+
no es compatible.Ejecución de muestra:
Prolog se confunde cuando se ejecuta en
^-
secuencia. Se debe insertar un espacio entre^
y-
para que pueda analizar la expresión correctamente.Espero que a tu maestro no le importe el lío de la ecuación.
Tiempo loco:
fuente
C, 260
¡Hola, creo que conozco a tu maestra! ¿No es aquel que tiene la capacidad sobrenatural de detectar estudiantes que ejecutan funciones de coincidencia de patrones de biblioteca en su cabeza?
Entonces, el uso
sscanf
está fuera de discusión ... Pero no se preocupe:Ejecución de ejemplos (entrada encendida
stdin
; la salida va astdout
):¡Este formato es mucho mejor que solo
12*x^2
, porque de esta manera su maestro puede estar seguro de que calculó la respuesta usted mismo y no hizo trampa al copiarla de otra persona!La salida tiene un pequeño problema de dominio
x=0
, ¡pero es correcta en casi todas partes !Como referencia, aquí hay una versión no legible, legible (por simples mortales). Utiliza una máquina de estados con 5 estados y 5 categorías de caracteres de entrada.
PD Tenga cuidado con esa
gets
función: tiene una vulnerabilidad de seguridad que puede permitir que su maestro ejecute un rootkit en su mente al proporcionar información demasiado larga ...fuente
Lua
296268263No es muy golfista y actualmente no puede manejar múltiples términos (solo puede ejecutarlo varias veces, ¿verdad?), Pero puede manejar
n^x
,x^n
yn
como entrada.Sin golf ...
fuente
str.func(str,...)
==str:func(...)
, por eso las cadenas obtuvieron la metatabla después de todo ...l
local. Solo espere que la entrada se almacenea
y diga que la salida se almacenarál
.a:find("x")
, también tenga en cuenta que1then
solo funciona en Lua 5.2()
es opcional. El1then
fue simplemente fija como no tengo 5.2 (no hacer las actualizaciones de CPU hasta después de la disertación es hecho b / c que no quiero estropear nada).ECMAScript 6, 127 bytes
Aquí está mi intento de expresión regular (usando una única expresión regular y algo de lógica en la devolución de llamada de reemplazo):
Esto espera que la cadena de entrada se almacene
i
y simplemente devuelve el resultado. Pruébelo en una consola compatible con ECMAScript 6 (como la de Firefox).fuente
sed, 110
Tomando muy literalmente "No es necesario simplificarlos ni formatearlos exactamente como se muestra arriba, siempre que esté claro lo que dice la respuesta":
El recuento de bytes incluye 1 para la
r
bandera.Sin golf, con comentarios:
Ejecución de muestra:
Apuesto a que esto podría jugar más golf; Es mi primer intento
sed
. ¡Divertido!fuente
Rubí, 152
... o 150 si no necesita imprimir ... o 147 si también está bien con una matriz que necesita unir.
corre con
ruby -nal
sin golf:
Mi principal problema con este es el número de caracteres que toma la división adecuada. La única otra forma en que podía pensar era
split(/(?<!\^)([-+])/)
qué da+
y-
como sus propios resultados. ¿Alguna pista para una mejor solución?Además, ¿hay una forma más corta de regresar
s
si no está vacía, pero de lo contrario regresay
? He usados[0]?y:s
? En JS lo harías||y
, pero""
es verdad en Ruby.fuente
split(/(?<!\^)(?=[-+])/)
:?