diff --git a/go/evaluate-division.go b/go/evaluate-division.go new file mode 100644 index 0000000..e28a279 --- /dev/null +++ b/go/evaluate-division.go @@ -0,0 +1,75 @@ +package main + +type Expression struct { + variable string + constant float64 +} + +func calcEquation(equations [][]string, values []float64, queries [][]string) []float64 { + process := func() map[string]([]Expression) { + g := make(map[string]([]Expression), 0) + + for i, eq := range equations { + x, y := eq[0], eq[1] + + if g[x] == nil { + g[x] = make([]Expression, 0) + } + g[x] = append(g[x], Expression{ + variable: y, + constant: values[i], + }) + + if g[y] == nil { + g[y] = make([]Expression, 0) + } + g[y] = append(g[y], Expression{ + variable: x, + constant: 1 / values[i], + }) + } + + return g + } + graph := process() + + var dfs func(map[string]bool, string, string, float64, *float64) + dfs = func(visited map[string]bool, src, dest string, product float64, result *float64) { + if visited[src] { + return + } + visited[src] = true + + if src == dest { + *result = product + return + } + + neighbors, hasNeighbors := graph[src] + if !hasNeighbors { + return + } + + for _, nextSrc := range neighbors { + dfs(visited, nextSrc.variable, dest, product*nextSrc.constant, result) + } + } + + getResult := func(src, dst string) float64 { + result := -1.0 + + visited := make(map[string]bool, 0) + if graph[src] != nil { + dfs(visited, src, dst, 1.0, &result) + } + + return result + } + + results := make([]float64, len(queries)) + for i, query := range queries { + results[i] = getResult(query[0], query[1]) + } + + return results +}