Day 8 part 1 solution.
This commit is contained in:
parent
31f60eca0e
commit
4d567425a7
27
2018/day08-1.go
Normal file
27
2018/day08-1.go
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"internal/day08"
|
||||||
|
"internal/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := util.ReadInputInts()
|
||||||
|
root := day08.BuildTree(data)
|
||||||
|
fmt.Println(sumMetadata(root))
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumMetadata(node *day08.Node) int {
|
||||||
|
sum := 0
|
||||||
|
for _, v := range node.Metadata {
|
||||||
|
sum += v
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, child := range node.Children {
|
||||||
|
sum += sumMetadata(child)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum
|
||||||
|
}
|
25
2018/internal/day08/debug.go
Normal file
25
2018/internal/day08/debug.go
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func DebugPrintTree(root *Node) {
|
||||||
|
debugPrintTreeR(root, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func debugPrintTreeR(node *Node, indent int) {
|
||||||
|
for i := 0; i < indent; i++ {
|
||||||
|
fmt.Printf(" ")
|
||||||
|
}
|
||||||
|
fmt.Printf("Children: %d | Metadata: ", len(node.Children))
|
||||||
|
|
||||||
|
for _, md := range node.Metadata {
|
||||||
|
fmt.Printf("%d ", md)
|
||||||
|
}
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
|
for _, child := range node.Children {
|
||||||
|
debugPrintTreeR(child, indent+1)
|
||||||
|
}
|
||||||
|
}
|
30
2018/internal/day08/tree.go
Normal file
30
2018/internal/day08/tree.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package day08
|
||||||
|
|
||||||
|
type Node struct {
|
||||||
|
Children []*Node
|
||||||
|
Metadata []int
|
||||||
|
}
|
||||||
|
|
||||||
|
func BuildTree(data []int) *Node {
|
||||||
|
root, _ := buildTreeR(data, 0)
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildTreeR(data []int, index int) (*Node, int) {
|
||||||
|
node := &Node{}
|
||||||
|
numChildren := data[index]
|
||||||
|
numMetadata := data[index+1]
|
||||||
|
index += 2
|
||||||
|
|
||||||
|
for i := 0; i < numChildren; i++ {
|
||||||
|
var child *Node
|
||||||
|
child, index = buildTreeR(data, index)
|
||||||
|
node.Children = append(node.Children, child)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < numMetadata; i++ {
|
||||||
|
node.Metadata = append(node.Metadata, data[index+i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return node, index + numMetadata
|
||||||
|
}
|
|
@ -5,6 +5,8 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ReadInput isn't here to make friends. It is highly specific to this domain.
|
// ReadInput isn't here to make friends. It is highly specific to this domain.
|
||||||
|
@ -25,7 +27,7 @@ func ReadInput() []string {
|
||||||
return lines
|
return lines
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadInputS is like ReadInput, but returns a byte array.
|
// ReadInputBytes is like ReadInput, but returns a byte array.
|
||||||
func ReadInputBytes() []byte {
|
func ReadInputBytes() []byte {
|
||||||
rawData, err := ioutil.ReadFile(os.Args[1])
|
rawData, err := ioutil.ReadFile(os.Args[1])
|
||||||
|
|
||||||
|
@ -35,3 +37,26 @@ func ReadInputBytes() []byte {
|
||||||
|
|
||||||
return bytes.TrimRight(rawData, "\n")
|
return bytes.TrimRight(rawData, "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadInputInts is like ReadInput, but returns an array of ints. (space-separated in the input)
|
||||||
|
func ReadInputInts() []int {
|
||||||
|
rawData, err := ioutil.ReadFile(os.Args[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
strData := strings.Split(strings.TrimSpace(string(rawData)), " ")
|
||||||
|
data := []int{}
|
||||||
|
for _, newIntStr := range strData {
|
||||||
|
newInt, err := strconv.Atoi(newIntStr)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data = append(data, newInt)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user