1
0

Fix deques order

This commit is contained in:
Hubert Van De Walle 2020-12-22 08:08:13 +01:00
parent e54fa1b187
commit 59dfc17ee1

View File

@ -13,33 +13,36 @@ class Day22(@Groups val input: Input<List<List<String>>>) {
private val two = input.value[1].drop(1).map { it.toInt() } private val two = input.value[1].drop(1).map { it.toInt() }
fun part1(): Long { fun part1(): Long {
val oneDeque = ArrayDeque<Int>().apply { one.forEach { addFirst(it) } } val oneDeque = ArrayDeque(one)
val twoDeque = ArrayDeque<Int>().apply { two.forEach { addFirst(it) } } val twoDeque = ArrayDeque(two)
while (oneDeque.isNotEmpty() && twoDeque.isNotEmpty()) { while (oneDeque.isNotEmpty() && twoDeque.isNotEmpty()) {
val a = oneDeque.removeLast() val a = oneDeque.removeFirst()
val b = twoDeque.removeLast() val b = twoDeque.removeFirst()
if (a > b) { if (a > b) {
oneDeque.addFirst(a) oneDeque.addLast(a)
oneDeque.addFirst(b) oneDeque.addLast(b)
} else { } else {
twoDeque.addFirst(b) twoDeque.addLast(b)
twoDeque.addFirst(a) twoDeque.addLast(a)
} }
} }
val deque = if (oneDeque.isEmpty()) twoDeque else oneDeque val deque = if (oneDeque.isEmpty()) twoDeque else oneDeque
return deque.mapIndexed { index, value -> (index + 1).toLong() * value.toLong() }.sum() return deque.score()
} }
private fun ArrayDeque<Int>.score() =
asReversed().mapIndexed { index, value -> (index + 1).toLong() * value.toLong() }.sum()
fun part2(): Long { fun part2(): Long {
val oneDeque = ArrayDeque<Int>().apply { one.forEach { addFirst(it) } } val oneDeque = ArrayDeque(one)
val twoDeque = ArrayDeque<Int>().apply { two.forEach { addFirst(it) } } val twoDeque = ArrayDeque(two)
val winner = playGame(oneDeque, twoDeque) val winner = playGame(oneDeque, twoDeque)
val deque = if (winner == 1) oneDeque else twoDeque val deque = if (winner == 1) oneDeque else twoDeque
return deque.mapIndexed { index, value -> (index + 1).toLong() * value.toLong() }.sum() return deque.score()
} }
private fun playGame(one: ArrayDeque<Int>, two: ArrayDeque<Int>): Int { private fun playGame(one: ArrayDeque<Int>, two: ArrayDeque<Int>): Int {
@ -48,24 +51,24 @@ class Day22(@Groups val input: Input<List<List<String>>>) {
while (one.isNotEmpty() && two.isNotEmpty()) { while (one.isNotEmpty() && two.isNotEmpty()) {
if (!playedGames.add(PlayedGame(one.toList(), two.toList()))) return 1 if (!playedGames.add(PlayedGame(one.toList(), two.toList()))) return 1
val a = one.removeLast() val a = one.removeFirst()
val b = two.removeLast() val b = two.removeFirst()
val winner = when { val winner = when {
one.size >= a && two.size >= b -> playGame( one.size >= a && two.size >= b -> playGame(
ArrayDeque(one.drop(one.size - a)), ArrayDeque(one.take(a)),
ArrayDeque(two.drop(two.size - b)) ArrayDeque(two.take(b))
) )
a > b -> 1 a > b -> 1
else -> 2 else -> 2
} }
if (winner == 1) { if (winner == 1) {
one.addFirst(a) one.addLast(a)
one.addFirst(b) one.addLast(b)
} else { } else {
two.addFirst(b) two.addLast(b)
two.addFirst(a) two.addLast(a)
} }
} }