Skip to content

Commit 147b32f

Browse files
committed
add 2023/day3 solution
1 parent abb2ef3 commit 147b32f

File tree

6 files changed

+266
-2
lines changed

6 files changed

+266
-2
lines changed

src/main/kotlin/advent2023/Day03.kt

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package advent2023
2+
3+
import advent2023.shared.Point2D
4+
5+
class Day03(private val input: List<String>) {
6+
7+
fun solvePart1(): Int {
8+
val coordinates = mutableSetOf<Point2D>()
9+
val grid = input.map { line -> line.map { char -> char } }
10+
11+
grid.forEachIndexed { rowIndex, line ->
12+
line.forEachIndexed { colIndex, char ->
13+
// If valid symbol
14+
if (!char.isDigit() && char != '.') {
15+
// Check adjacent box for a digit
16+
((rowIndex - 1)..(rowIndex + 1)).forEach { r ->
17+
((colIndex - 1)..(colIndex + 1)).forEach { c ->
18+
// Boundary conditions
19+
if (r >= 0 && r < grid.size && c >= 0 && c < grid[r].size) {
20+
if (grid[r][c].isDigit()) {
21+
// We have a number! Find the point of its first digit
22+
var temp = c
23+
while (temp > 0 && grid[r][temp - 1].isDigit()) {
24+
temp -= 1
25+
}
26+
coordinates.add(Point2D(r, temp))
27+
}
28+
}
29+
}
30+
}
31+
}
32+
}
33+
}
34+
val partNumbers = coordinates.map { coord -> coord.determineNumber(grid) }
35+
return partNumbers.sum()
36+
}
37+
38+
fun solvePart2(): Int {
39+
val coordinates = mutableListOf<Pair<Point2D, Point2D>>()
40+
val grid = input.map { line -> line.map { char -> char } }
41+
42+
grid.forEachIndexed { rowIndex, line ->
43+
line.forEachIndexed { colIndex, char ->
44+
// Condition for identifying a Gear
45+
if (char == '*') {
46+
val gearSet = mutableSetOf<Point2D>()
47+
// Check adjacent box for a digit
48+
((rowIndex - 1)..(rowIndex + 1)).forEach { r ->
49+
((colIndex - 1)..(colIndex + 1)).forEach { c ->
50+
if (r >= 0 && r < grid.size && c >= 0 && c < grid[r].size) {
51+
if (grid[r][c].isDigit()) {
52+
// We have a number! Find the point of its first digit
53+
var temp = c
54+
while (temp > 0 && grid[r][temp - 1].isDigit()) {
55+
temp -= 1
56+
}
57+
gearSet.add(Point2D(r, temp))
58+
}
59+
}
60+
}
61+
}
62+
if (gearSet.size == 2) {
63+
coordinates.add(Pair(gearSet.first(), gearSet.last()))
64+
}
65+
}
66+
}
67+
}
68+
val partNumbers = coordinates.map { gearSet ->
69+
val first = gearSet.first.determineNumber(grid)
70+
val second = gearSet.second.determineNumber(grid)
71+
first * second
72+
}
73+
return partNumbers.sum()
74+
}
75+
76+
private fun Point2D.determineNumber(grid: List<List<Char>>): Int {
77+
val stringBuilder = StringBuilder()
78+
var temp = y
79+
while (temp < grid[x].size && grid[x][temp].isDigit()) {
80+
stringBuilder.append(grid[x][temp])
81+
temp += 1
82+
}
83+
return stringBuilder.toString().toInt()
84+
}
85+
}
86+
87+
fun main() {
88+
val input = Resources.resourceAsListOfString("advent2023/day03.txt")
89+
val day03 = Day03(input = input)
90+
println("Part 1 Solution: ${day03.solvePart1()}")
91+
println("Part 2 Solution: ${day03.solvePart2()}")
92+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package advent2023.shared
2+
3+
data class Point2D(val x: Int, val y: Int)

0 commit comments

Comments
 (0)