this repo has no description

:construction: (Kotlin) aoc 2023 day 1 part 2

Changed files
+71 -8
Kotlin
aoc-2023
+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
+7 -4
Kotlin/aoc-2023/day1/example.txt
··· 1 - 1abc2 2 - pqr3stu8vwx 3 - a1b2c3d4e5f 4 - treb7uchet 1 + two1nine 2 + eightwothree 3 + abcone2threexyz 4 + xtwone3four 5 + 4nineeightseven2 6 + zoneight234 7 + 7pqrstsixteen