Day 14
This commit is contained in:
98
src/main/kotlin/com/basdado/adventofcode/Day14.kt
Normal file
98
src/main/kotlin/com/basdado/adventofcode/Day14.kt
Normal file
@@ -0,0 +1,98 @@
|
||||
package com.basdado.adventofcode
|
||||
|
||||
const val DAY14_INPUT = "/day/14/input.txt"
|
||||
|
||||
fun main() {
|
||||
val day = Day14()
|
||||
day.puzzle1()
|
||||
day.puzzle2()
|
||||
}
|
||||
|
||||
class Day14 {
|
||||
|
||||
fun puzzle1() {
|
||||
|
||||
val recipeCount = lines(DAY14_INPUT).findFirst().get().toInt()
|
||||
val initialRecipes = listOf<Byte>(3, 7)
|
||||
val recipes = initialRecipes.toMutableList()
|
||||
|
||||
var elf1Pos = 0
|
||||
var elf2Pos = 1
|
||||
|
||||
while(recipes.size < recipeCount + 10) {
|
||||
|
||||
val elf1Score = recipes[elf1Pos]
|
||||
val elf2Score = recipes[elf2Pos]
|
||||
appendDigits(elf1Score + elf2Score, recipes)
|
||||
|
||||
elf1Pos = (elf1Pos + 1 + elf1Score) % recipes.size
|
||||
elf2Pos = (elf2Pos + 1 + elf2Score) % recipes.size
|
||||
}
|
||||
|
||||
println(recipes.subList(recipeCount, recipeCount + 10).joinToString(""))
|
||||
}
|
||||
|
||||
fun puzzle2() {
|
||||
|
||||
val desiredRecipeSequence = getDigits(lines(DAY14_INPUT).findFirst().get().toLong())
|
||||
val initialRecipes = listOf<Byte>(3, 7)
|
||||
val recipes = initialRecipes.toMutableList()
|
||||
|
||||
println(findRecipeSequence(recipes, desiredRecipeSequence))
|
||||
}
|
||||
|
||||
private fun findRecipeSequence(
|
||||
recipes: MutableList<Byte>,
|
||||
desiredRecipeSequence: List<Byte>
|
||||
): Int {
|
||||
var elf1Pos = 0
|
||||
var elf2Pos = 1
|
||||
|
||||
while (true) {
|
||||
|
||||
val elf1Score = recipes[elf1Pos]
|
||||
val elf2Score = recipes[elf2Pos]
|
||||
val newRecipeScores = elf1Score + elf2Score
|
||||
|
||||
appendDigits(newRecipeScores, recipes)
|
||||
|
||||
if (newRecipeScores >= 10) {
|
||||
if (subListEquals(recipes.size - desiredRecipeSequence.size - 1, recipes, desiredRecipeSequence)) {
|
||||
return recipes.size - desiredRecipeSequence.size - 1
|
||||
}
|
||||
}
|
||||
if (subListEquals(recipes.size - desiredRecipeSequence.size, recipes, desiredRecipeSequence)) {
|
||||
return recipes.size - desiredRecipeSequence.size
|
||||
}
|
||||
|
||||
elf1Pos = (elf1Pos + 1 + elf1Score) % recipes.size
|
||||
elf2Pos = (elf2Pos + 1 + elf2Score) % recipes.size
|
||||
}
|
||||
}
|
||||
|
||||
private fun <T> subListEquals(startIndex: Int, fullList: List<T>, subList: List<T>): Boolean {
|
||||
|
||||
if (startIndex < 0 || startIndex + subList.size > fullList.size) {
|
||||
return false
|
||||
}
|
||||
for (i in 0 until subList.size) {
|
||||
if (fullList[startIndex + i] != subList[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private fun appendDigits(n: Int, list: MutableList<Byte>) {
|
||||
when (n) {
|
||||
in 1..9 -> list.add(n.toByte())
|
||||
in 10..19 -> {
|
||||
list.add((n / 10).toByte())
|
||||
list.add((n % 10).toByte())
|
||||
}
|
||||
else -> list.addAll(getDigits(n.toLong()))
|
||||
}
|
||||
}
|
||||
|
||||
private fun getDigits(n: Long): List<Byte> = n.toString().split("").filter { !it.isBlank() }.map { it.toByte() }
|
||||
}
|
||||
@@ -13,7 +13,7 @@ fun main() {
|
||||
println("Puzzle 1 time: " + measureTimeMillis { day.puzzle1() } + " ms")
|
||||
// Puzzle 1 answer = 385820
|
||||
// Let's do 10 runs
|
||||
println("Puzzle 2 time: " + (1..10).map {measureTimeMillis { day.puzzle2() }}.average() + " ms")
|
||||
println("Puzzle 2 time: " + (1..10).map { measureTimeMillis { day.puzzle2() } }.average() + " ms")
|
||||
}
|
||||
|
||||
class Day9 {
|
||||
|
||||
1
src/main/resources/day/14/example.txt
Normal file
1
src/main/resources/day/14/example.txt
Normal file
@@ -0,0 +1 @@
|
||||
37
|
||||
1
src/main/resources/day/14/input.txt
Normal file
1
src/main/resources/day/14/input.txt
Normal file
@@ -0,0 +1 @@
|
||||
209231
|
||||
Reference in New Issue
Block a user