1
+ package adventofcode2023
2
+
3
+ import java.io.File
4
+
5
+ object Day03 {
6
+ fun part1 (inputs : List <String >) {
7
+ val firstDigitChecks = setOf (
8
+ Pair (- 1 , 0 ),
9
+ Pair (- 1 , - 1 ),
10
+ Pair (0 , - 1 ),
11
+ Pair (- 1 , 1 ),
12
+ Pair (0 , 1 )
13
+ )
14
+ val centralDigitChecks = setOf (
15
+ Pair (0 , 1 ),
16
+ Pair (0 , - 1 )
17
+ )
18
+ val lastDigitChecks = setOf (
19
+ Pair (1 , 0 ),
20
+ Pair (1 , 1 ),
21
+ Pair (0 , 1 ),
22
+ Pair (1 , - 1 ),
23
+ Pair (0 , - 1 )
24
+ )
25
+
26
+ fun checkPositions (x : Int , y : Int , checks : Set <Pair <Int , Int >>): Boolean {
27
+ return checks.any {
28
+ val checkX = x + it.first
29
+ val checkY = y + it.second
30
+
31
+ if (checkX < 0 || checkY < 0
32
+ || checkX >= inputs[0 ].length || checkY >= inputs.size
33
+ ) {
34
+ false
35
+ } else {
36
+ inputs[checkY][checkX] != ' .'
37
+ }
38
+ }
39
+ }
40
+
41
+ fun checkPartNumberDigit (x : Int , y : Int ): Boolean =
42
+ (x > 0 && ! inputs[y][x - 1 ].isDigit() && checkPositions(x, y, firstDigitChecks)
43
+ || x < inputs[0 ].length - 1 && ! inputs[y][x + 1 ].isDigit() && checkPositions(x, y, lastDigitChecks)
44
+ || checkPositions(x, y, centralDigitChecks))
45
+
46
+ var sum = 0
47
+
48
+ for (y in inputs.indices) {
49
+ var x = 0
50
+ while (x < inputs[0 ].length) {
51
+ if (inputs[y][x].isDigit()) {
52
+ var isPartNumber = checkPartNumberDigit(x, y)
53
+ var number = inputs[y][x].toString()
54
+
55
+ while (x < inputs[0 ].length - 1 && inputs[y][x + 1 ].isDigit()) {
56
+ x++
57
+ number + = inputs[y][x]
58
+ if (! isPartNumber && checkPartNumberDigit(x, y)) isPartNumber = true
59
+ }
60
+
61
+ if (isPartNumber) sum + = number.toInt()
62
+ }
63
+ x++
64
+ }
65
+ }
66
+
67
+ println (sum)
68
+ }
69
+ }
70
+
71
+ fun main () {
72
+ val inputs = File (" resources/adventofcode2023/Day03.txt" ).readLines()
73
+ Day03 .part1(inputs)
74
+ }
0 commit comments