Wykonaj regułę łańcuchową

15

Mieliśmy wiele wyzwań związanych z różnicowaniem i integracją, ale nie było tylko rozwiązywania problemów związanych ze stawkami. Tak więc w tym wyzwaniu dostaniesz kilka pochodnych (będą liczbowe, nie pod względem zmiennych) i będziesz musiał znaleźć inną pochodną.

Dane wejściowe pojawią się w postaci listy równań rozdzielonych znakiem nowej linii w formie dx/dt = 4. Mogą występować ułamki dziesiętne i negatywy.

Wejście zakończy się jedną różnicą, którą będziesz musiał znaleźć. Możesz założyć, że zawsze będzie wystarczająco dużo informacji, aby je znaleźć, ale może być też nadmiar informacji.

Być może będziesz musiał rozważyć pochodną funkcji odwrotnej, np. Jeśli tak dy/dx = 3, wiesz o tym dx/dy = 1/3.

Twój wynik będzie w formie dy/dt = 6. Wszystkie białe znaki itp. Muszą być takie same. Załóżmy, że wszystkie zmienne są zawsze jedną literą (mogą być dużymi literami i mogą być d).

To jest , więc wygrywa najkrótszy kod w bajtach !

Przypadki testowe

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
źródło
Czy wynik „odpowiedź: dx / dt = .318” czy tylko „dx / dt = .318”?
GamrCorps
@GamrCorps to drugie.
Maltysen
2
Czy możemy korzystać z wbudowanych rozwiązań rozwiązywania równań?
Martin Ender
3
Mam wrażenie, że odpowiedzi będą traktowane d_/d_jako stosunek i to mnie smuci
Arcturus
@ MartinBüttner tak, ale nie wbudowane solwery równań różniczkowych.
Maltysen

Odpowiedzi:

2

Python - 278 275

Nikt jeszcze tego nie zrobił, więc pomyślałem, że to złożę, mimo że nie jest jeszcze dobrze zagrany w golfa.

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

Tutaj jest częściowo niezamieszkany:

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

Trzy bajty zostały zapisane przez Thomasa Kwa.

KSFT
źródło