package aoc2023 import println import readInput /* --- Day 1: Trebuchet?! --- https://adventofcode.com/2023/day/1 */ fun main() { val inlineTestInput = """ 1abc2 pqr3stu8vwx a1b2c3d4e5f treb7uchet """ val inlineTestInput2 = """ two1nine eightwothree abcone2threexyz xtwone3four 4nineeightseven2 zoneight234 7pqrstsixteen """ fun part1(input: List): Int { return input.sumOf { (it.first { it.isDigit() }.toString() + it.last { it.isDigit() }.toString()).toInt() } } val digitStrings = arrayOf("---", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine") val digitStringsRev = digitStrings.map { it.reversed() }.toTypedArray() fun findFirst(s: String, digs: Array): Int { for (p in s.indices) { if (s[p].isDigit()) return s[p].digitToInt() val m = s.subSequence(p, s.length) val match = digs.withIndex().firstOrNull { m.startsWith(it.value) } if (match != null) return match.index } return -1 } fun part2(input: List): Int { return input.sumOf { findFirst(it, digitStrings) * 10 + findFirst(it.reversed(), digitStringsRev) } } // test if implementation meets criteria from the description, like: val testInput = inlineTestInput.trim().reader().readLines() val testInput2 = inlineTestInput2.trim().reader().readLines() //val testInput = readInput("aoc2023/Day01_test") println("Part 1 Test: " + part1(testInput)) println("Part 2 Test: " + part2(testInput2)) check(part1(testInput) == 142) check(part2(testInput2) == 281) val input = readInput("aoc2023/Day01") part1(input).println() part2(input).println() }