Skip to content

Commit 447664d

Browse files
committed
Use the abstract AdventOfCode class in all solutions
This drastically reduces the amount of repeated code and makes most functions in Utils.kt obsolete.
1 parent 6cc9ad5 commit 447664d

File tree

26 files changed

+120
-411
lines changed

26 files changed

+120
-411
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
.kotlin/
44
build
55
src/input/**/*.txt
6-
!src/input/2024/ForTests.txt
76
!src/input/2024/Day99.txt
87
local.properties
98
/.kotlintest/

src/input/2024/ForTests.txt

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/main/kotlin/de/ronny_h/aoc/AdventOfCode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ abstract class AdventOfCode<T>(val year: Int, val day: Int) {
1212
private val input = readInput()
1313

1414
fun run(expectedPart1: T, expectedPart2: T) {
15-
println("Day $day $year, part 1")
15+
println("Day $day $year - ${this::class.simpleName} - part 1")
1616
printAndCheck(::part1, expectedPart1)
17-
println("Day $day $year, part 2")
17+
println("Day $day $year - ${this::class.simpleName} - part 2")
1818
printAndCheck(::part2, expectedPart2)
1919
}
2020

src/main/kotlin/de/ronny_h/aoc/extensions/Utils.kt

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,10 @@ package de.ronny_h.aoc.extensions
22

33
import java.math.BigInteger
44
import java.security.MessageDigest
5-
import kotlin.io.path.Path
6-
import kotlin.io.path.readText
7-
import kotlin.reflect.KSuspendFunction1
8-
import kotlin.time.TimedValue
9-
import kotlin.time.measureTimedValue
10-
11-
/**
12-
* Reads lines from the given input txt file.
13-
*/
14-
fun readInput(name: String) = Path("src/input/2024/$name.txt").readText().trim().lines()
155

166
/**
177
* Converts string to md5 hash.
188
*/
199
fun String.md5() = BigInteger(1, MessageDigest.getInstance("MD5").digest(toByteArray()))
2010
.toString(16)
2111
.padStart(32, '0')
22-
23-
fun printAndCheck(input: List<String>, block: (List<String>) -> Int, expected: Int) {
24-
printAndCheck(measureTimedValue { block(input).toLong() }, expected.toLong())
25-
}
26-
27-
fun printAndCheck(input: List<String>, block: (List<String>) -> Long, expected: Long) {
28-
printAndCheck(measureTimedValue { block(input) }, expected)
29-
}
30-
31-
fun printAndCheck(input: List<String>, block: (List<String>) -> String, expected: String) {
32-
printAndCheck(measureTimedValue { block(input) }, expected)
33-
}
34-
35-
suspend fun printAndCheck(input: List<String>, block: KSuspendFunction1<List<String>, Int>, expected: Int) {
36-
printAndCheck(measureTimedValue { block(input).toLong() }, expected.toLong())
37-
}
38-
39-
suspend fun printAndCheck(input: List<String>, block: KSuspendFunction1<List<String>, Long>, expected: Long) {
40-
printAndCheck(measureTimedValue { block(input) }, expected)
41-
}
42-
43-
private fun printAndCheck(result: TimedValue<Long>, expected: Long) {
44-
println("result: ${result.value}, expected: $expected, took: ${result.duration}")
45-
check(result.value == expected)
46-
}
47-
48-
private fun printAndCheck(result: TimedValue<String>, expected: String) {
49-
println("result: ${result.value}, expected: $expected, took: ${result.duration}")
50-
check(result.value == expected)
51-
}

src/main/kotlin/de/ronny_h/aoc/year24/day02/RedNosedReports.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,11 @@
11
package de.ronny_h.aoc.year24.day02
22

3-
import de.ronny_h.aoc.extensions.printAndCheck
4-
import de.ronny_h.aoc.extensions.readInput
3+
import de.ronny_h.aoc.AdventOfCode
54
import kotlin.math.abs
65

7-
fun main() {
8-
val day = "Day02"
9-
val input = readInput(day)
10-
val reports = RedNosedReports()
6+
fun main() = RedNosedReports().run(670, 700)
117

12-
println("$day part 1")
13-
printAndCheck(input, reports::part1, 670)
14-
15-
println("$day part 2")
16-
printAndCheck(input, reports::part2, 700)
17-
}
18-
19-
class RedNosedReports {
8+
class RedNosedReports : AdventOfCode<Int>(2024, 2) {
209
fun parseReports(input: List<String>) = input
2110
.filter { it.isNotBlank() }
2211
.map { line ->
@@ -42,7 +31,7 @@ class RedNosedReports {
4231
}.component1()
4332
}
4433

45-
fun part1(input: List<String>) = parseReports(input)
34+
override fun part1(input: List<String>) = parseReports(input)
4635
.map(::isSafeReport)
4736
.count { it }
4837

@@ -56,7 +45,7 @@ class RedNosedReports {
5645
return false
5746
}
5847

59-
fun part2(input: List<String>) = parseReports(input)
48+
override fun part2(input: List<String>) = parseReports(input)
6049
.map { isSafeReport(it) || isSafeReportWithOneLevelRemoved(it) }
6150
.count { it }
6251

src/main/kotlin/de/ronny_h/aoc/year24/day03/MullItOver.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,11 @@
11
package de.ronny_h.aoc.year24.day03
22

3-
import de.ronny_h.aoc.extensions.printAndCheck
4-
import de.ronny_h.aoc.extensions.readInput
3+
import de.ronny_h.aoc.AdventOfCode
54
import kotlin.text.get
65

7-
fun main() {
8-
val day = "Day03"
9-
val input = readInput(day)
10-
val mullItOver = MullItOver()
6+
fun main() = MullItOver().run(174960292, 56275602)
117

12-
println("$day part 1")
13-
printAndCheck(input, mullItOver::part1, 174960292)
14-
15-
println("$day part 2")
16-
printAndCheck(input, mullItOver::part2, 56275602)
17-
}
18-
19-
class MullItOver {
8+
class MullItOver : AdventOfCode<Int>(2024, 3) {
209
private val mulRegex = """(?<mul>mul\((\d{1,3}),(\d{1,3})\))"""
2110
private val doRegex = """(?<do>do\(\))"""
2211
private val dontRegex = """(?<dont>don't\(\))"""
@@ -31,11 +20,11 @@ class MullItOver {
3120
.findAll(line)
3221
.sumOf(::multiply)
3322

34-
fun part1(input: List<String>): Int {
23+
override fun part1(input: List<String>): Int {
3524
return input.sumOf(::findAndMultiply)
3625
}
3726

38-
fun part2(input: List<String>): Int {
27+
override fun part2(input: List<String>): Int {
3928
var doIt = true
4029

4130
return input

src/main/kotlin/de/ronny_h/aoc/year24/day04/CeresSearch.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,16 @@
11
package de.ronny_h.aoc.year24.day04
22

3+
import de.ronny_h.aoc.AdventOfCode
34
import de.ronny_h.aoc.extensions.Grid
4-
import de.ronny_h.aoc.extensions.printAndCheck
5-
import de.ronny_h.aoc.extensions.readInput
65

7-
fun main() {
8-
val day = "Day04"
9-
val input = readInput(day)
10-
val search = CeresSearch()
6+
fun main() = CeresSearch().run(2500, 1933)
117

12-
println("$day part 1")
13-
printAndCheck(input, search::part1, 2500)
14-
15-
println("$day part 2")
16-
printAndCheck(input, search::part2, 1933)
17-
}
18-
19-
class CeresSearch {
20-
fun part1(input: List<String>): Int {
8+
class CeresSearch : AdventOfCode<Int>(2024, 4) {
9+
override fun part1(input: List<String>): Int {
2110
return XMasGrid(input).searchForXMAS()
2211
}
2312

24-
fun part2(input: List<String>): Int {
13+
override fun part2(input: List<String>): Int {
2514
return XMasGrid(input).searchForMASCross()
2615
}
2716
}

src/main/kotlin/de/ronny_h/aoc/year24/day05/PrintQueue.kt

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,10 @@
11
package de.ronny_h.aoc.year24.day05
22

3-
import de.ronny_h.aoc.extensions.printAndCheck
4-
import de.ronny_h.aoc.extensions.readInput
5-
import kotlin.collections.get
3+
import de.ronny_h.aoc.AdventOfCode
64

7-
fun main() {
8-
val day = "Day05"
9-
val input = readInput(day)
10-
val queue = PrintQueue()
5+
fun main() = PrintQueue().run(6384, 5353)
116

12-
println("$day part 1")
13-
printAndCheck(input, queue::part1, 6384)
14-
15-
println("$day part 2")
16-
printAndCheck(input, queue::part2, 5353)
17-
}
18-
19-
class PrintQueue {
7+
class PrintQueue : AdventOfCode<Int>(2024, 5) {
208
private fun parseRules(input: List<String>): List<Pair<Int, Int>> = input
219
.takeWhile { it.contains("|") }
2210
.map {
@@ -31,15 +19,15 @@ class PrintQueue {
3119
.map(String::toInt)
3220
}
3321

34-
fun part1(input: List<String>): Int {
22+
override fun part1(input: List<String>): Int {
3523
val rules = parseRules(input)
3624
val updates = parseUpdates(input)
3725
val pageComparator = PageComparator(rules)
3826
val orderedUpdates = updates.filter { it == it.sortedWith(pageComparator) }
3927
return orderedUpdates.sumOf { it[it.size / 2] }
4028
}
4129

42-
fun part2(input: List<String>): Int {
30+
override fun part2(input: List<String>): Int {
4331
val rules = parseRules(input)
4432
val updates = parseUpdates(input)
4533
val pageComparator = PageComparator(rules)

src/main/kotlin/de/ronny_h/aoc/year24/day06/GuardGallivant.kt

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,19 @@
11
package de.ronny_h.aoc.year24.day06
22

3+
import de.ronny_h.aoc.AdventOfCode
34
import de.ronny_h.aoc.extensions.Coordinates
45
import de.ronny_h.aoc.extensions.Direction
56
import de.ronny_h.aoc.extensions.Direction.NORTH
67
import de.ronny_h.aoc.extensions.Grid
78
import kotlinx.coroutines.*
89
import kotlinx.coroutines.channels.produce
9-
import de.ronny_h.aoc.extensions.printAndCheck
10-
import de.ronny_h.aoc.extensions.readInput
1110
import java.lang.Runtime.getRuntime
1211
import java.util.concurrent.atomic.AtomicInteger
1312

14-
suspend fun main() {
15-
val day = "Day06"
16-
val input = readInput(day)
17-
val guard = GuardGallivant()
13+
fun main() = GuardGallivant().run(4580, 1480)
1814

19-
println("$day part 1")
20-
printAndCheck(input, guard::part1, 4580)
21-
22-
println("$day part 2")
23-
printAndCheck(input, guard::part2, 1480)
24-
}
25-
26-
class GuardGallivant {
27-
fun part1(input: List<String>): Int {
15+
class GuardGallivant : AdventOfCode<Int>(2024, 6) {
16+
override fun part1(input: List<String>): Int {
2817
val visited = mutableSetOf<Coordinates>()
2918
Lab(input).doTheGuardWalk { position, _ ->
3019
visited.add(position)
@@ -33,7 +22,7 @@ class GuardGallivant {
3322
return visited.size
3423
}
3524

36-
suspend fun part2(input: List<String>): Int {
25+
override fun part2(input: List<String>): Int = runBlocking {
3726
val lab = Lab(input)
3827
val loopCount = AtomicInteger(0)
3928

@@ -57,7 +46,7 @@ class GuardGallivant {
5746
}.awaitAll()
5847
}
5948

60-
return loopCount.get()
49+
return@runBlocking loopCount.get()
6150
}
6251
}
6352

src/main/kotlin/de/ronny_h/aoc/year24/day07/BridgeRepair.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,23 @@
11
package de.ronny_h.aoc.year24.day07
22

3-
import de.ronny_h.aoc.extensions.printAndCheck
4-
import de.ronny_h.aoc.extensions.readInput
3+
import de.ronny_h.aoc.AdventOfCode
54
import kotlin.math.pow
65

7-
fun main() {
8-
val day = "Day07"
9-
val input = readInput(day)
10-
val repair = BridgeRepair()
6+
fun main() = BridgeRepair().run(1399219271639, 275791737999003)
117

12-
println("$day part 1")
13-
printAndCheck(input, repair::part1, 1399219271639)
14-
15-
println("$day part 2")
16-
printAndCheck(input, repair::part2, 275791737999003)
17-
}
18-
19-
class BridgeRepair {
8+
class BridgeRepair : AdventOfCode<Long>(2024, 7) {
209
private fun parseEquations(input: List<String>) = input.map { line ->
2110
val (result, numbers) = line.split(": ")
2211
Equation(result.toLong(), numbers.split(" ").map(String::toLong))
2312
}
2413

25-
fun part1(input: List<String>) = parseEquations(input)
14+
override fun part1(input: List<String>) = parseEquations(input)
2615
.map { it.checkSolvability(listOf(Long::plus, Long::times)) }
2716
.filter { it.solvable }
2817
.sumOf { it.result }
2918

3019

31-
fun part2(input: List<String>) = parseEquations(input)
20+
override fun part2(input: List<String>) = parseEquations(input)
3221
.map { it.checkSolvability(listOf(Long::plus, Long::times, ::concat)) }
3322
.filter { it.solvable }
3423
.sumOf { it.result }

0 commit comments

Comments
 (0)