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")
|
println("Puzzle 1 time: " + measureTimeMillis { day.puzzle1() } + " ms")
|
||||||
// Puzzle 1 answer = 385820
|
// Puzzle 1 answer = 385820
|
||||||
// Let's do 10 runs
|
// 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 {
|
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