11package de.havox_design.aoc2023.day08
22
3+ import java.util.regex.Pattern
4+
35class Day08 (private var filename : String ) {
4- fun solvePart1 (): Long =
5- 0L
6+ private val PATTERN_GROUP_NODE_NAME = " nodeName"
7+ private val PATTERN_GROUP_LEFT_NODE_NAME = " leftNodeName"
8+ private val PATTERN_GROUP_RIGHT_NODE_NAME = " rightNodeName"
9+ private val NODE_PATTERN = Pattern .compile(
10+ " ^(?<${PATTERN_GROUP_NODE_NAME } >\\ w+) = " +
11+ " \\ ((?<${PATTERN_GROUP_LEFT_NODE_NAME } >\\ w+), (?<${PATTERN_GROUP_RIGHT_NODE_NAME } >\\ w+)\\ )$"
12+ )
13+ private val INSTRUCTIONS = ArrayList <Direction >()
14+ private val NODES = HashSet <Node >()
15+ private val START_NODE_NAME = " AAA"
16+ private val END_NODE_NAME = " ZZZ"
17+
18+ fun solvePart1 (): Long {
19+ convertInput()
20+
21+ var steps = 0L
22+ var currentNode = NODES .first { node -> node.name == START_NODE_NAME }
23+ var instructionIndex = 0
24+
25+ while (currentNode.name != END_NODE_NAME ) {
26+ val currentInstruction = INSTRUCTIONS [instructionIndex]
27+ instructionIndex++
28+ instructionIndex % = INSTRUCTIONS .size
29+ currentNode = currentNode.getNode(currentInstruction)
30+ steps++
31+ }
32+
33+ return steps
34+ }
635
736 fun solvePart2 (): Long =
837 0L
938
39+ private fun convertInput () {
40+ val input = getResourceAsText(filename)
41+
42+ parseInstructions(input[0 ])
43+ parseNodes(input)
44+ }
45+
46+ private fun parseInstructions (input : String ) {
47+ for (char in input.toCharArray()) {
48+ INSTRUCTIONS .add(Direction .from(char))
49+ }
50+ }
51+
52+ private fun parseNodes (input : List <String >) {
53+ val nodeInput = ArrayList <Triple <String , String , String >>()
54+
55+ for (index in input.indices) {
56+ if (index <= 1 ) {
57+ continue
58+ }
59+
60+ val row = input[index]
61+ val matcher = NODE_PATTERN .matcher(row)
62+ matcher.matches()
63+ val nodeName = matcher.group(PATTERN_GROUP_NODE_NAME )
64+ val leftNodeName = matcher.group(PATTERN_GROUP_LEFT_NODE_NAME )
65+ val rightNodeName = matcher.group(PATTERN_GROUP_RIGHT_NODE_NAME )
66+
67+ nodeInput.add(Triple (nodeName, leftNodeName, rightNodeName))
68+ NODES .add(Node (nodeName, null , null ))
69+ }
70+
71+ for (entry in nodeInput) {
72+ val nodeName = entry.first
73+ val leftName = entry.second
74+ val rightName = entry.third
75+
76+ val node = NODES .first { n -> n.name == nodeName }
77+ val left = NODES .first { n -> n.name == leftName }
78+ val right = NODES .first { n -> n.name == rightName }
79+
80+ node.setNodes(left, right)
81+ }
82+ }
83+
1084 private fun getResourceAsText (path : String ): List <String > =
1185 this .javaClass.classLoader.getResourceAsStream(path)!! .bufferedReader().readLines()
1286}
0 commit comments