From 5336db8643c363877a5c1b4d3d3e13d02524247e Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Tue, 15 Dec 2020 08:01:51 +0100 Subject: [PATCH] Day15 --- days/src/main/kotlin/Day15.kt | 53 +++++++++++++++++++++++++++++++ days/src/main/resources/day15.txt | 1 + 2 files changed, 54 insertions(+) create mode 100644 days/src/main/kotlin/Day15.kt create mode 100644 days/src/main/resources/day15.txt diff --git a/days/src/main/kotlin/Day15.kt b/days/src/main/kotlin/Day15.kt new file mode 100644 index 0000000..548910f --- /dev/null +++ b/days/src/main/kotlin/Day15.kt @@ -0,0 +1,53 @@ +package be.vandewalleh.aoc.days + +import be.vandewalleh.aoc.utils.input.Csv +import be.vandewalleh.aoc.utils.input.Day +import be.vandewalleh.aoc.utils.input.Input +import be.vandewalleh.aoc.utils.input.createDay +import kotlin.math.abs +import org.eclipse.collections.impl.factory.primitive.IntObjectMaps + +@Day(15) +class Day15(@Csv val input: Input) { + + private fun run(until: Int): Int { + val start = input.value + + val map = IntObjectMaps.mutable.empty() + + var last = -1 + + fun say(round: Int, number: Int) { + val lastValues = map.get(number) + val values = lastValues + ?.let { intArrayOf(round, it.maxOrNull()!!) } + ?: intArrayOf(round) + + map.put(number, values) + last = number + } + + for (i in 1..until) { + if (i <= start.size) { + say(i, start[i - 1]) + } else { + val lastValues = map.get(last) + if (lastValues?.size ?: 0 == 1) say(i, 0) + else say(i, abs(lastValues[0] - lastValues[1])) + } + } + return last + } + + fun part1() = run(until = 2020) + + fun part2() = run(until = 30000000) +} + +fun main() { + // val input = Input(intArrayOf(3, 1, 2)) + with(createDay()) { + println(part1()) + println(part2()) + } +} diff --git a/days/src/main/resources/day15.txt b/days/src/main/resources/day15.txt new file mode 100644 index 0000000..9abfdc6 --- /dev/null +++ b/days/src/main/resources/day15.txt @@ -0,0 +1 @@ +0,1,5,10,3,12,19