Правило цепочки

15

У нас было много проблем, связанных с дифференциацией и интеграцией, но не было просто решения проблем, связанных с тарифами. Таким образом, в этом задании вы получите набор производных (они будут числовыми, а не с точки зрения каких-либо переменных) и вам нужно будет найти другую производную.

Входные данные поступят в разделенном через новую строку списке уравнений в форме dx/dt = 4. Там могут быть десятичные и отрицательные.

Вход будет заканчиваться одним дифференциалом, который вам нужно будет найти. Вы можете предположить, что всегда будет достаточно информации, чтобы найти ее, но может быть и избыточная информация.

Возможно, вам также придется рассмотреть производную обратной функции, например, если у вас есть dy/dx = 3, вы также знаете это dx/dy = 1/3.

Ваш вывод будет в форме dy/dt = 6. Все пробелы и т. Д. Должны быть одинаковыми. Предположим, что все переменные всегда состоят из одной буквы (они могут быть заглавными, и они могут быть d).

Это , поэтому выигрывает самый короткий код в байтах !

Тестовые случаи

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
источник
Вывод «answer: dx / dt = .318» или просто «dx / dt = .318»?
GamrCorps
@GamrCorps последний.
Maltysen
2
Можем ли мы использовать встроенные средства решения уравнений?
Мартин Эндер
3
Я чувствую, что ответы будут воспринимать d_/d_как соотношение, и это меня огорчает
Арктур
@ MartinBüttner да, но не решатели встроенных дифференциальных уравнений.
Maltysen

Ответы:

2

Питон - 278 275

Никто еще не сделал этого, поэтому я подумал, что отправлю это, хотя пока еще не очень хорошо.

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

Здесь это частично 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]])

Томас Ква спас три байта.

KSFT
источник