Faire la règle de la chaîne

15

Nous avons eu beaucoup de défis sur la différenciation et l'intégration, mais aucun sur la résolution des problèmes de taux associés. Donc, dans ce défi, vous obtiendrez un tas de dérivés (ils seront numériques, pas en termes de variables) et devrez trouver un autre dérivé.

L'entrée viendra dans une liste d'équations séparées par des sauts de ligne, sous la forme dx/dt = 4. Il peut y avoir des décimales et des négatifs.

L'entrée se terminera par un différentiel, celui que vous devrez trouver. Vous pouvez supposer qu'il y aura toujours suffisamment d'informations pour le trouver, mais il peut également y avoir un excès d'informations.

Vous devrez peut-être aussi considérer la dérivée de la fonction inverse, par exemple si vous l'avez dy/dx = 3, vous le savez aussi dx/dy = 1/3.

Votre sortie sera dans le formulaire dy/dt = 6. Tous les espaces, etc. doivent être identiques. Supposons que toutes les variables sont toujours composées d'une seule lettre (elles peuvent être en majuscules et elles peuvent l'être d).

C'est le , donc le code le plus court en octets gagne!

Cas de test

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
la source
La sortie est-elle "réponse: dx / dt = .318" ou simplement "dx / dt = .318"?
GamrCorps
@GamrCorps ce dernier.
Maltysen
2
Pouvons-nous utiliser des solveurs d'équations intégrés?
Martin Ender
3
J'ai le sentiment que les réponses seront traitées d_/d_comme un rapport et cela me rend triste
Arcturus
@ MartinBüttner oui, mais pas les solveurs d'équations différentielles intégrés.
Maltysen

Réponses:

2

Python - 278 275

Personne d'autre ne l'a encore fait, alors j'ai pensé le soumettre, même s'il n'est pas encore très bien joué.

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]])

Ici, il est partiellement non golfé:

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]])

Trois octets ont été enregistrés par Thomas Kwa.

KSFT
la source