From 12f275465e93ba539e855f867b7c094ff0087aec Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 10 Dec 2018 11:07:29 +0100 Subject: [PATCH] Adding day 8 --- day8/part1.scala | 29 +++++++++++++++++++++++++++++ day8/part2.scala | 31 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 day8/part1.scala create mode 100644 day8/part2.scala diff --git a/day8/part1.scala b/day8/part1.scala new file mode 100644 index 0000000..ae6ac81 --- /dev/null +++ b/day8/part1.scala @@ -0,0 +1,29 @@ +import scala.io.StdIn.readLine + +case class Node(c: Char, nbChild: Int, nbMetadata: Int, children: List[Node], metadata: List[Int]) + +val it = readLine.split(" ").map(_.toInt).toList + +def readNode(c: Char, input: List[Int]): (Int, Node) = input match { + case nbChild :: nbMeta :: t => + val (read, children) = List.range(0, nbChild, 1).foldLeft((0, List.empty[Node])) { case (acc, id) => + val (read, node) = readNode((c + id + 1).toChar, t.drop(acc._1)) + (acc._1 + read, node :: acc._2) + } + val metadata: List[Int] = input.drop(read + 2).take(nbMeta).toList + (read + 2 + nbMeta, Node(c, nbChild, nbMeta, children, metadata)) + case _ => (0, null) +} + +val rootNode = readNode('A', it)._2 + +def sumMetadata(node: Node): Int = { + val childrenSum = node.children.map(sumMetadata).sum + val metadataSum = node.metadata.sum +// println(s"Node ${node.c} children sum = $childrenSum, metadataSum = $metadataSum, both = ${childrenSum + metadataSum}") + childrenSum + metadataSum +} + +// println(rootNode) + +println(sumMetadata(rootNode)) diff --git a/day8/part2.scala b/day8/part2.scala new file mode 100644 index 0000000..498d5cc --- /dev/null +++ b/day8/part2.scala @@ -0,0 +1,31 @@ +import scala.io.StdIn.readLine + +case class Node(c: Char, nbChild: Int, nbMetadata: Int, children: List[Node], metadata: List[Int]) { + val metaSum: Int = metadata.sum +} + +val it = readLine.split(" ").map(_.toInt).toList + +def readNode(c: Char, input: List[Int]): (Int, Node) = input match { + case nbChild :: nbMeta :: t => + val (read, children) = List.range(0, nbChild, 1).foldLeft((0, List.empty[Node])) { case (acc, id) => + val (read, node) = readNode((c + id + 1).toChar, t.drop(acc._1)) + (acc._1 + read, acc._2 ++ List(node)) + } + val metadata: List[Int] = input.drop(read + 2).take(nbMeta).toList + (read + 2 + nbMeta, Node(c, nbChild, nbMeta, children, metadata)) + case _ => (0, null) +} + +val rootNode = readNode('A', it)._2 + +def sumMetadata(node: Node): Int = + node match { + case _ if node.nbChild > 0 => node.metadata.map { + case m if m <= node.nbChild => sumMetadata(node.children(m - 1)) + case _ => 0 + }.sum + case _ => node.metaSum + } + +println(sumMetadata(rootNode))