Mach die Kettenregel

15

Wir hatten viele Herausforderungen bei der Differenzierung und Integration, aber keine bei der Lösung der damit zusammenhängenden Ratenprobleme. In dieser Herausforderung erhalten Sie also eine Reihe von Derivaten (sie sind numerisch, nicht in Bezug auf Variablen) und müssen ein anderes Derivat finden.

Die Eingabe erfolgt in einer durch Zeilenumbrüche getrennten Liste von Gleichungen in der Form dx/dt = 4. Es kann Dezimalstellen und Negative geben.

Die Eingabe endet mit einem Differential, das Sie finden müssen. Sie können davon ausgehen, dass es immer genug Informationen gibt, um sie zu finden, aber es kann auch zu viel Informationen geben.

Möglicherweise müssen Sie auch die Ableitung der Umkehrfunktion berücksichtigen, z. B. dy/dx = 3wissen Sie das auch, wenn Sie dies getan haben dx/dy = 1/3.

Ihre Ausgabe erfolgt in der Form dy/dt = 6. Alle Leerzeichen usw. müssen gleich sein. Angenommen, alle Variablen bestehen immer aus einem Buchstaben (Großbuchstaben und Großbuchstaben d).

Das ist , also gewinnt der kürzeste Code in Bytes !

Testfälle

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
quelle
Ist die Ausgabe "answer: dx / dt = .318" oder nur "dx / dt = .318"?
GamrCorps
@GamrCorps letzteres.
Maltysen
2
Können wir eingebaute Gleichungslöser verwenden?
Martin Ender
3
Ich habe das Gefühl, Antworten werden d_/d_als Verhältnis behandelt und das macht mich traurig
Arcturus
@ MartinBüttner ja, aber nicht in Differentialgleichungslöser eingebaut.
Maltysen

Antworten:

2

Python - 278 275

Bisher hat noch niemand dies getan, daher dachte ich, ich würde dies einreichen, obwohl es noch nicht sehr gut golfen ist.

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

Hier ist es teilweise ungolfed:

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

Drei Bytes wurden von Thomas Kwa gespeichert.

KSFT
quelle