Esegui la regola della catena


15

Abbiamo avuto molte sfide sulla differenziazione e l'integrazione, ma nessuna sulla risoluzione dei problemi relativi alle tariffe. Quindi, in questa sfida, otterrai un sacco di derivati ​​(saranno numerici, non in termini di variabili) e dovrai trovare un altro derivato.

L'input verrà in un elenco di equazioni separato da una nuova riga, nel modulo dx/dt = 4. Possono esserci decimali e negativi.

L'ingresso termina con un differenziale, quello che dovrai trovare. Puoi presumere che ci saranno sempre abbastanza informazioni per trovarle, ma ci possono essere anche informazioni in eccesso.

Potrebbe anche essere necessario prendere in considerazione la derivata della funzione inversa, ad esempio se lo si possiede dy/dx = 3, lo si sa anche dx/dy = 1/3.

Il tuo output sarà nel modulo dy/dt = 6. Tutti gli spazi bianchi, ecc. Devono essere uguali. Supponiamo che tutte le variabili siano sempre una lettera (possono essere maiuscole e possono essere d).

Questo è , quindi vince il codice più breve in byte !

Casi test

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

L'output è "answer: dx / dt = .318" o solo "dx / dt = .318"?
GamrCorps,

@GamrCorps quest'ultimo.
Maltysen,

2
Possiamo usare i solutori di equazioni integrati?
Martin Ender,

3
Ho la sensazione che le risposte tratteranno d_/d_come un rapporto e questo mi rende triste
Arcturus,

@ MartinBüttner sì, ma non risolto i solutori di equazioni differenziali.
Maltysen,

Risposte:


2

Python - 278 275

Nessun altro lo ha ancora fatto, quindi ho pensato di inviarlo, anche se non è stato ancora giocato molto bene.

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

Qui è parzialmente non golfato:

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

Tre byte sono stati salvati da Thomas Kwa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.