Lakukan Aturan Rantai

15

Kami memiliki banyak tantangan pada diferensiasi dan integrasi, tetapi tidak ada satu pun dalam menyelesaikan masalah tarif terkait. Jadi dalam tantangan ini, Anda akan mendapatkan banyak turunan (Mereka akan numerik, bukan dalam hal variabel apa pun) dan harus menemukan turunan lainnya.

Input akan datang dalam daftar persamaan yang dipisahkan baris baru, dalam formulir dx/dt = 4. Mungkin ada desimal dan negatif.

Input akan diakhiri dengan satu diferensial, yang harus Anda temukan. Anda dapat mengasumsikan akan selalu ada informasi yang cukup untuk menemukannya, tetapi mungkin juga ada informasi berlebih.

Anda mungkin juga harus mempertimbangkan turunan dari fungsi terbalik, misalnya jika Anda miliki dy/dx = 3, Anda juga tahu itu dx/dy = 1/3.

Output Anda akan dalam bentuk dy/dt = 6. Semua spasi putih, dll. Harus sama. Asumsikan semua variabel selalu satu huruf (Mereka bisa huruf besar, dan mereka bisa menjadi d).

Ini adalah , jadi kode terpendek dalam byte menang!

Uji Kasus

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
sumber
Apakah output "answer: dx / dt = .318" atau hanya "dx / dt = .318"?
GamrCorps
@ GarrCorps yang terakhir.
Maltysen
2
Bisakah kita menggunakan pemecah persamaan bawaan?
Martin Ender
3
Saya punya perasaan jawaban akan diperlakukan d_/d_sebagai rasio dan itu membuat saya sedih
Arcturus
@ MartinBüttner ya, tapi tidak dibangun pemecah persamaan diferensial.
Maltysen

Jawaban:

2

Python - 278 275

Belum ada orang lain yang melakukan ini, jadi saya pikir saya akan mengirimkan ini, meskipun belum golf dengan baik.

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

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

Tiga byte disimpan oleh Thomas Kwa.

KSFT
sumber