adventofcode2017/7/7.2.go
2017-12-09 23:42:09 +00:00

86 lines
1.5 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// cat input | go run 7.2.go
type node struct {
NodeName string
NodeWeight int
Children []string
ChildWeight int
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
allNodes := make(map[string]node)
for scanner.Scan() {
s := strings.Split(scanner.Text(), " -> ")
var children []string
if len(s) == 2 {
// Node has children
children = strings.Split(s[1], ", ")
}
// Name and Weight
tNode := strings.Split(s[0], " ")
node := node{NodeName: tNode[0]}
node.NodeWeight, _ = strconv.Atoi(strings.TrimRight(strings.TrimLeft(tNode[1], "("), ")"))
node.Children = children
allNodes[node.NodeName] = node
}
for _, n := range allNodes {
n.ChildWeight = weighChildren(allNodes, n.NodeName)
}
fmt.Println(allNodes)
}
func weighChildren(allNodes map[string]node, child string) int {
if len(allNodes[child].Children) == 0 {
return allNodes[child].NodeWeight
}
sum := allNodes[child].NodeWeight
check := 0
uneven := false
for _, e := range allNodes[child].Children {
r := weighChildren(allNodes, e)
sum += r
if check == 0 {
check = r
}
if check != r {
uneven = true
}
}
f := allNodes[child]
f.ChildWeight = sum
allNodes[child] = f
if uneven {
for _, e := range allNodes[child].Children {
fmt.Println(e, allNodes[e].ChildWeight, allNodes[e].NodeWeight)
}
os.Exit(0)
}
return sum
}