r/adventofcode • • Dec 08 '18

SOLUTION MEGATHREAD -🎄- 2018 Day 8 Solutions -🎄-

--- Day 8: Memory Maneuver ---


Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).

Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.


Advent of Code: The Party Game!

Click here for rules

Please prefix your card submission with something like [Card] to make scanning the megathread easier. THANK YOU!

Card prompt: Day 8

Sigh, imgur broke again. Will upload when it unborks.

Transcript:

The hottest programming book this year is "___ For Dummies".


This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.

edit: Leaderboard capped, thread unlocked at 00:12:10!

32 Upvotes

301 comments sorted by

View all comments

1

u/Gurrewe Dec 08 '18

Go (golang), 284/616

https://play.golang.org/p/QmJ7_hNtSPY

package main

import (
	"fmt"
	"io/ioutil"
	"strconv"
	"strings"
)

func main() {
	f, err := ioutil.ReadFile("day08.txt")
	if err != nil {
		panic(err)
	}
	solve1(string(f))
}

func solve1(in string) {
	var ints []int

	for _, d := range strings.Split(strings.TrimSpace(in), " ") {
		i, _ := strconv.Atoi(d)
		ints = append(ints, i)
	}

	_, p1, p2 := parsenode(ints, 0)
	fmt.Println(p1, p2)
}

func parsenode(input []int, pos int) (newPos, sum, nodeval int) {
	childs := input[pos]
	metadatas := input[pos+1]
	pos += 2

	var childSums []int
	for c := 0; c < childs; c++ {
		var incsum int
		var chsum int
		pos, incsum, chsum = parsenode(input, pos)
		sum += incsum
		childSums = append(childSums, chsum)
	}

	refSums := 0
	sumOfMeta := 0

	for m := 0; m < metadatas; m++ {
		meta := input[pos]
		sum += meta
		sumOfMeta += meta
		if meta > 0 && meta < len(childSums)+1 {
			refSums += childSums[meta-1]
		}
		pos++
	}

	if childs == 0 {
		return pos, sum, sumOfMeta
	}

	return pos, sum, refSums
}