First (unsuccessful) attempt at day 7.1.
This commit is contained in:
parent
0388b57112
commit
f6ea56d266
6 changed files with 238 additions and 0 deletions
51
2018/internal/tree/findorder.go
Normal file
51
2018/internal/tree/findorder.go
Normal file
|
@ -0,0 +1,51 @@
|
|||
package tree
|
||||
|
||||
import "fmt" // debug
|
||||
|
||||
// FindOrder determines the correct order according to these rules:
|
||||
// 1. A node cannot come before all of its parents have been included.
|
||||
// 2. At any given time, the lowest-lettered step must be executed.
|
||||
func FindOrder(root *Node) []*Node {
|
||||
seen := make(map[rune]bool)
|
||||
return findOrderR(root, seen)
|
||||
}
|
||||
|
||||
func findOrderR(node *Node, seen map[rune]bool) []*Node {
|
||||
order := []*Node{}
|
||||
|
||||
// debug
|
||||
fmt.Printf("In node: %c | Children: ", node.Name)
|
||||
for _, child := range node.Children {
|
||||
fmt.Printf("%c ", child.Name)
|
||||
}
|
||||
fmt.Printf("| Parents: ")
|
||||
for _, parent := range node.Parents {
|
||||
fmt.Printf("%c ", parent.Name)
|
||||
}
|
||||
fmt.Println()
|
||||
// end debug
|
||||
|
||||
// add the node, but only if all its parents have been seen
|
||||
if len(node.Parents) == 0 {
|
||||
seen[node.Name] = true
|
||||
} else {
|
||||
for _, parent := range node.Parents {
|
||||
if _, ok := seen[parent.Name]; !ok {
|
||||
return order
|
||||
}
|
||||
}
|
||||
|
||||
if _, ok := seen[node.Name]; !ok {
|
||||
order = append(order, node)
|
||||
fmt.Printf("Added node: %c\n", node.Name)
|
||||
seen[node.Name] = true
|
||||
}
|
||||
}
|
||||
|
||||
// recurse
|
||||
for _, child := range node.Children {
|
||||
order = append(order, findOrderR(child, seen)...)
|
||||
}
|
||||
|
||||
return order
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue