Skip to content

Commit 69b0a43

Browse files
committed
Solved day08 part 1
1 parent 9145930 commit 69b0a43

File tree

3 files changed

+113
-2
lines changed

3 files changed

+113
-2
lines changed
Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,86 @@
11
package de.havox_design.aoc2023.day08
22

3+
import java.util.regex.Pattern
4+
35
class 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
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.havox_design.aoc2023.day08
2+
3+
enum class Direction(private val symbol: Char) {
4+
LEFT('L'),
5+
RIGHT('R');
6+
7+
companion object {
8+
fun from(char: Char): Direction {
9+
if(entries.map { dir -> dir.symbol }.contains(char)) {
10+
return entries.first { dir -> dir.symbol == char }
11+
}
12+
13+
throw IllegalArgumentException("Unknown symbol '${char}'.")
14+
}
15+
}
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package de.havox_design.aoc2023.day08
2+
3+
data class Node(val name: String, var left: Node?, var right: Node?) {
4+
fun setNode(direction: Direction, node: Node) {
5+
when(direction) {
6+
Direction.LEFT -> left = node
7+
Direction.RIGHT -> right = node
8+
}
9+
}
10+
11+
fun setNodes(left: Node, right: Node) {
12+
setNode(Direction.LEFT, left)
13+
setNode(Direction.RIGHT, right)
14+
}
15+
16+
fun getNode(direction: Direction): Node =
17+
when(direction) {
18+
Direction.LEFT -> left!!
19+
Direction.RIGHT -> right!!
20+
}
21+
}

0 commit comments

Comments
 (0)