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"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ReadInput isn't here to make friends. It is highly specific to this domain.
|
||||
|
@ -25,7 +27,7 @@ func ReadInput() []string {
|
|||
return lines
|
||||
}
|
||||
|
||||
// ReadInputS is like ReadInput, but returns a byte array.
|
||||
// ReadInputBytes is like ReadInput, but returns a byte array.
|
||||
func ReadInputBytes() []byte {
|
||||
rawData, err := ioutil.ReadFile(os.Args[1])
|
||||
|
||||
|
@ -35,3 +37,26 @@ func ReadInputBytes() []byte {
|
|||
|
||||
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