Faça a regra da cadeia


15

Tivemos muitos desafios em diferenciação e integração, mas nenhum em resolver problemas relacionados a taxas. Portanto, neste desafio, você obterá várias derivadas (elas serão numéricas, não em termos de variáveis) e terá que encontrar outra derivada.

A entrada virá em uma lista de equações separada por nova linha, na forma dx/dt = 4 . Pode haver decimais e negativos.

A entrada terminará com um diferencial, o que você precisará encontrar. Você pode supor que sempre haverá informações suficientes para encontrá-las, mas também pode haver informações em excesso.

Você também pode ter que considerar a derivada da função inversa, por exemplo, se tiver dy/dx = 3, também sabe disso dx/dy = 1/3.

Sua saída estará no formulário dy/dt = 6. Todo o espaço em branco etc. deve ser o mesmo. Suponha que todas as variáveis ​​tenham sempre uma letra (elas podem estar em maiúsculas e podem ser d).

Isso é , então o código mais curto em bytes vence!

Casos de teste

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

A saída é "answer: dx / dt = .318" ou apenas "dx / dt = .318"?
GamrCorps

@GamrCorps o último.
Maltysen

2
Podemos usar solucionadores de equações embutidos?
Martin Ender

3
Tenho a sensação de respostas irá tratar d_/d_como uma razão e que me deixa triste
Arcturus

@ MartinBüttner sim, mas não solucionadores de equações diferenciais integrados.
Maltysen

Respostas:


2

Python - 278 275

Ninguém mais fez isso ainda, então pensei em enviar isso, mesmo que ainda não tenha sido muito bem jogado.

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

Aqui está parcialmente não destruído:

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

Três bytes foram salvos por Thomas Kwa.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.