@@ -11,37 +11,44 @@ object Day13 {
11
11
private fun verticalLine (list : List <String >, index : Int ): String =
12
12
list.joinToString(separator = " " ) { it[index].toString() }
13
13
14
- private fun checkIfSameLines (list : List <String >, a : Int , b : Int , vertical : Boolean ): Boolean
15
- = (vertical && verticalLine(list, a) == verticalLine(list, b)) || (! vertical && list[a] == list[b])
14
+ private fun countLinesDifference (list : List <String >, a : Int , b : Int , vertical : Boolean ): Int {
15
+ val lineA = if (vertical) verticalLine(list, a) else list[a]
16
+ val lineB = if (vertical) verticalLine(list, b) else list[b]
17
+ return lineA.withIndex().count { it.value != lineB[it.index] }
18
+ }
16
19
17
- private fun findReflectionLine (list : List <String >, vertical : Boolean = false): Int? {
20
+ private fun findReflectionLine (
21
+ list : List <String >,
22
+ different : Int = 0,
23
+ vertical : Boolean = false
24
+ ): Int? {
18
25
val maxIndex = if (vertical) list[0 ].length else list.size
26
+
19
27
for (i in 0 .. maxIndex - 2 ) {
20
- if (checkIfSameLines(list, i, i + 1 , vertical)) {
21
- var j = 1
22
- var isReflection = true
23
-
24
- while (i - j >= 0 && i + j + 1 < maxIndex) {
25
- if (! checkIfSameLines(list, i - j, i + j + 1 , vertical)) {
26
- isReflection = false
27
- break
28
- }
29
- j++
30
- }
31
-
32
- if (isReflection) return i + 1
28
+ var j = 1
29
+ var differentCount = countLinesDifference(list, i, i + 1 , vertical)
30
+
31
+ while (differentCount <= different && i - j >= 0 && i + j + 1 < maxIndex) {
32
+ differentCount + = countLinesDifference(list, i - j, i + j + 1 , vertical)
33
+ j++
33
34
}
35
+
36
+ if (differentCount == different) return i + 1
34
37
}
35
38
36
39
return null
37
40
}
38
41
39
42
fun part1 () = println (inputs.sumOf {
40
- val ind = (findReflectionLine(it, true ) ? : findReflectionLine(it)?.times(100 ))
41
- ind!! .toInt()
43
+ (findReflectionLine(it, vertical = true ) ? : findReflectionLine(it)?.times(100 ))!! .toInt()
44
+ })
45
+
46
+ fun part2 () = println (inputs.sumOf {
47
+ (findReflectionLine(it, 1 , vertical = true ) ? : findReflectionLine(it, 1 )?.times(100 ))!! .toInt()
42
48
})
43
49
}
44
50
45
51
fun main () {
46
52
Day13 .part1()
53
+ Day13 .part2()
47
54
}
0 commit comments