Day 8 part 1 solution.

This commit is contained in:
Anna Rose 2018-12-10 20:23:18 -05:00
parent 31f60eca0e
commit 4d567425a7
No known key found for this signature in database
GPG Key ID: 8D9ACA841015C59A
4 changed files with 108 additions and 1 deletions

27
2018/day08-1.go Normal file
View 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
}

View 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)
}
}

View 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
}

View File

@ -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
}