You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

55 lines
1.6 KiB

package day1
import java.io.File
object Day1 {
fun calculateOne(input : List<String>) = input
.filter(String::isNotBlank)
.fold(0, addMagicNumber())
fun calculateTwo(input : List<String>) = 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")
}