+64
-4
Kotlin/aoc-2023/day1/day1.kt
+64
-4
Kotlin/aoc-2023/day1/day1.kt
···
11
11
}
12
12
}
13
13
14
+
class WrittenNumber(
15
+
val written: String,
16
+
val size: Int,
17
+
val toReplace: String
18
+
) {
19
+
fun getIndexAtString(str: String): Int {
20
+
return str.indexOf(written)
21
+
}
22
+
23
+
fun replaceAtString(str: String): String {
24
+
return str.replace(written, toReplace)
25
+
}
26
+
27
+
override fun toString(): String {
28
+
return "$written $size"
29
+
}
30
+
}
31
+
32
+
fun checkIdxForEachWrittenNumber(line: String): MutableList<WrittenNumber> {
33
+
return mutableListOf(
34
+
WrittenNumber("one", 3, "1"),
35
+
WrittenNumber("two", 3, "2"),
36
+
WrittenNumber("three", 5, "3"),
37
+
WrittenNumber("four", 4, "4"),
38
+
WrittenNumber("five", 4, "5"),
39
+
WrittenNumber("six", 3, "6"),
40
+
WrittenNumber("seven", 5, "7"),
41
+
WrittenNumber("eight", 5, "8"),
42
+
WrittenNumber("nine", 4, "9")
43
+
).filter{ it.getIndexAtString(line) != -1 }
44
+
.sortedBy { it.getIndexAtString(line) }
45
+
.toMutableList()
46
+
}
47
+
14
48
fun main(args: Array<String>) {
15
49
val filename = args.firstOrNull() ?: "./example.txt"
16
50
17
51
val lines = openFile(filename)
18
52
19
-
val result = lines.map {
20
-
"""\D""".toRegex()
21
-
.replace(it, "")
22
-
}.fold(0) { acc, line -> run {
53
+
val result = lines.map { line -> run {
54
+
val numbersWritten = checkIdxForEachWrittenNumber(line)
55
+
56
+
for (index in 1..<(numbersWritten.size - 1)) {
57
+
val actualData = numbersWritten.getOrNull(index)
58
+
59
+
if (actualData == null) {
60
+
continue
61
+
}
62
+
63
+
val idx = actualData.getIndexAtString(line)
64
+
65
+
val previousData = numbersWritten.getOrNull(index - 1)
66
+
67
+
if (previousData == null) {
68
+
continue
69
+
}
70
+
71
+
val previousIdx = previousData.getIndexAtString(line)
72
+
val previousWordSize = previousData.size
73
+
74
+
if (idx in previousIdx..(previousIdx + previousWordSize)) {
75
+
numbersWritten.removeAt(index)
76
+
}
77
+
}
78
+
79
+
val result = numbersWritten.fold(line) { acc, classOperator -> classOperator.replaceAtString(acc) }
80
+
81
+
result.replace("""\D""".toRegex(), "")
82
+
} }.fold(0) { acc, line -> run {
23
83
val first = line.first().digitToInt()
24
84
val last = line.last().digitToInt()
25
85