This commit is contained in:
2018-12-14 10:32:56 +01:00
parent 25744e75bf
commit 79720bfdf7
4 changed files with 101 additions and 1 deletions

View 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() }
}

View File

@@ -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 {

View File

@@ -0,0 +1 @@
37

View File

@@ -0,0 +1 @@
209231