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")
|
|
|
|
}
|