Skip to content

Commit 4b69a2d

Browse files
committed
Solved day19 part 1
1 parent 02a5f41 commit 4b69a2d

File tree

5 files changed

+112
-3
lines changed

5 files changed

+112
-3
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ plugins {
44

55
// project meta data
66
group 'de.havox_design.aoc2023'
7-
version '0.18.4'
7+
version '0.18.5'
88

99
// Switch to gradle "all" distribution.
1010
wrapper {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package de.havox_design.aoc2023.day19
2+
3+
data class Assignment(
4+
val x: Long,
5+
val m: Long,
6+
val a: Long,
7+
val s: Long
8+
) {
9+
fun total() =
10+
x + m + a + s
11+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package de.havox_design.aoc2023.day19
2+
3+
data class Condition(
4+
val field: Char,
5+
val lessThen: Boolean,
6+
val value: Long,
7+
val successLabel: String
8+
) {
9+
private val ICON_EXTREMELY_COOL_LOOKING = 'x'
10+
private val ICON_MUSICAL = 'm'
11+
private val ICON_AERODYNAMIC = 'a'
12+
private val ICON_SHINY = 's'
13+
14+
fun test(assignment: Assignment): Boolean {
15+
val target = when (field) {
16+
ICON_EXTREMELY_COOL_LOOKING -> assignment.x
17+
ICON_MUSICAL -> assignment.m
18+
ICON_AERODYNAMIC -> assignment.a
19+
ICON_SHINY -> assignment.s
20+
else -> error(this)
21+
}
22+
return when (lessThen) {
23+
true -> target < value
24+
else -> target > value
25+
}
26+
}
27+
}
Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,76 @@
11
package de.havox_design.aoc2023.day19
22

33
class Day19(private var filename: String) {
4-
fun solvePart1(): Long =
5-
19114L
4+
private val ICON_ACCEPT = "A"
5+
private val ICON_REJECT = "R"
6+
private val ICON_START = "in"
7+
private val ICON_LESS_THAN = '<'
8+
private val ELEMENT_DELIMITER = ','
9+
private val RULE_START_DELIMITER = '{'
10+
private val SOLUTION_DELIMITER = ':'
11+
12+
@SuppressWarnings("kotlin:S6611")
13+
fun solvePart1(): Long {
14+
val (rules, assignments) = readInput()
15+
16+
return assignments
17+
.filter { assignment ->
18+
var current = ICON_START
19+
20+
while (current != ICON_ACCEPT && current != ICON_REJECT) {
21+
val rule = rules[current]!!
22+
23+
current = (rule.decisions.firstOrNull { it.test(assignment) }?.successLabel) ?: rule.elseRule
24+
}
25+
26+
current == ICON_ACCEPT
27+
}
28+
.sumOf { it.total() }
29+
}
630

731
fun solvePart2(): Long =
832
0L
933

34+
private fun readInput(): Pair<Map<String, SortRule>, List<Assignment>> {
35+
val input = getResourceAsText(filename)
36+
37+
val rules = input
38+
.takeWhile { it.isNotBlank() }
39+
.associate { row ->
40+
val (name, rules) = row.split(RULE_START_DELIMITER, limit = 2)
41+
val splitRules = rules.split(ELEMENT_DELIMITER)
42+
val elseCondition = splitRules.last().dropLast(1)
43+
val conditions = splitRules.dropLast(1).map {
44+
val (test, label) = it.split(SOLUTION_DELIMITER, limit = 2)
45+
val conditionName = test.first()
46+
val lessThen = test[1] == ICON_LESS_THAN
47+
val value = test.drop(2).toLong()
48+
49+
Condition(conditionName, lessThen, value, label)
50+
}
51+
name to SortRule(name, conditions, elseCondition)
52+
}
53+
54+
val regex = Regex("\\{x=(\\d+),m=(\\d+),a=(\\d+),s=(\\d+)}")
55+
val assignments = input
56+
.dropWhile { it.isNotBlank() }
57+
.drop(1)
58+
.map { row ->
59+
regex
60+
.matchEntire(row)!!
61+
.destructured
62+
.let { (x, m, a, s) ->
63+
Assignment(
64+
x.toLong(),
65+
m.toLong(),
66+
a.toLong(),
67+
s.toLong()
68+
)
69+
}
70+
}
71+
return rules to assignments
72+
}
73+
1074
private fun getResourceAsText(path: String): List<String> =
1175
this.javaClass.classLoader.getResourceAsStream(path)!!.bufferedReader().readLines()
1276
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package de.havox_design.aoc2023.day19
2+
3+
data class SortRule(
4+
val name: String,
5+
val decisions: List<Condition>,
6+
val elseRule: String
7+
)

0 commit comments

Comments
 (0)