Haz la regla de la cadena

15

Hemos tenido muchos desafíos en la diferenciación e integración, pero ninguno en la solución de problemas relacionados con las tasas. Entonces, en este desafío, obtendrás un montón de derivadas (serán numéricas, no en términos de ninguna variable) y tendrás que encontrar otra derivada.

La entrada vendrá en una lista de ecuaciones separadas por una nueva línea, en el formulario dx/dt = 4. Puede haber decimales y negativos.

La entrada terminará con un diferencial, el que tendrá que encontrar. Puede suponer que siempre habrá suficiente información para encontrarla, pero también puede haber exceso de información.

Es posible que también deba considerar la derivada de la función inversa, por ejemplo, si la tiene dy/dx = 3, también lo sabe dx/dy = 1/3.

Su salida será en el formulario dy/dt = 6. Todo el espacio en blanco, etc. tiene que ser el mismo. Suponga que todas las variables son siempre una letra (pueden ser mayúsculas y pueden ser d).

Este es el , por lo que gana el código más corto en bytes .

Casos de prueba

dy/dx = 4
dx/dt = 5
dy/dt

answer: dy/dt = 20

dy/dx = -3
dt/dx = 3
dy/dt

answer: dy/dt = -1

dA/dt = 4
dA/dC = 2
dC/dr = 6.28
dr/dt

answer: dr/dt = 0.3184713375796178

dx/dy = 7
dx/dt = 0
dy/dt

answer: dy/dt = 0
Maltysen
fuente
¿La salida es "respuesta: dx / dt = .318" o simplemente "dx / dt = .318"?
GamrCorps
@GamrCorps el último.
Maltysen
2
¿Podemos usar solucionadores de ecuaciones incorporados?
Martin Ender
3
Tengo la sensación de que las respuestas se tratarán d_/d_como una relación y eso me pone triste
Arcturus
@ MartinBüttner sí, pero no solucionadores de ecuaciones diferenciales incorporados.
Maltysen

Respuestas:

2

Python - 278 275

Nadie más ha hecho esto todavía, así que pensé en enviarlo, aunque todavía no se ha jugado muy bien.

a={}
e={}
k=input
i=k()
while"="in i:
 b,d=i.split(" =");b,c=b.split("/");d=float(d)
 if d:a[b]=a.get(b,[])+[[c,1/d]]
 a[c]=a.get(c,[])+[[b,d]];i=k()
i=i.split("/")
def f(x):
 for j in a.get(x,[]):
  if j[0] not in e:e[j[0]]=e[x]*j[1];f(j[0])
e[i[1]]=1
f(i[1])
print(e[i[0]])

Aquí está parcialmente sin golfizar:

a={}
e={}
i=input()
while "=" in i:
 b,d=i.split(" =")
 b,c=b.split("/")
 d=float(d)
 if d:a[b]=a.get(b,[])+[[c,1/d]]
 a[c]=a.get(c,[])+[[b,d]]
 i=input()
i=i.split("/")
def f(x):
 for j in a.get(x,[]):
  if j[0] not in e:e[j[0]]=e[x]*j[1];f(j[0])
e[i[1]]=1
f(i[1])
print(e[i[0]])

Tres bytes fueron guardados por Thomas Kwa.

KSFT
fuente