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
+ }
0 commit comments