package day1 import java.io.File object Day1 { fun calculateOne(input : List) = input .filter(String::isNotBlank) .fold(0, addMagicNumber()) fun calculateTwo(input : List) = input .filter(String::isNotBlank) .map(::replaceElvenNumbers) .fold(0, addMagicNumber()) private fun addMagicNumber() = { accumulator: Int, line: String -> val firstDigit = NUMBER_REGEX.findAll(line).first().value val secondDigit = NUMBER_REGEX.findAll(line).last().value val total = (firstDigit + secondDigit).toInt() + accumulator total } private fun replaceElvenNumbers(string: String): String = string.mapIndexed { index, _ -> readElvenNumberAtStart(string.substring(index)) }.joinToString(separator = "") private fun readElvenNumberAtStart(string: String) = when { string.isBlank() -> "" string[0].isDigit() -> string[0].toString() string.startsWith("one") -> "1" string.startsWith("two") -> "2" string.startsWith("three") -> "3" string.startsWith("four") -> "4" string.startsWith("five") -> "5" string.startsWith("six") -> "6" string.startsWith("seven") -> "7" string.startsWith("eight") -> "8" string.startsWith("nine") -> "9" else -> "" } fun answerOne() = File("src/main/resources/day1/input.txt") .readLines() .let(::calculateOne) fun answerTwo() = File("src/main/resources/day1/input.txt") .readLines() .let(::calculateTwo) private val NUMBER_REGEX = Regex("\\d") }