Виконайте правило ланцюга


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

Чи є вихід "відповідь: dx / dt = .318" чи просто "dx / dt = .318"?
GamrCorps

@GamrCorps останній.
Мальтісен

2
Чи можемо ми використовувати вбудовані розв'язувачі рівнянь?
Мартін Ендер

3
У мене є відчуття, що відповіді трактуватимуться d_/d_як співвідношення, і це мене сумує
Арктур

@ MartinBüttner так, але не вбудований в рішення диференціальних рівнянь.
Малтісен

Відповіді:


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

Ось він частково невольфований:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.