From 59dfc17ee1d02c1a91f1a936e1015dc7275af16c Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Tue, 22 Dec 2020 08:08:13 +0100 Subject: [PATCH] Fix deques order --- days/src/main/kotlin/Day22.kt | 43 +++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/days/src/main/kotlin/Day22.kt b/days/src/main/kotlin/Day22.kt index 41bbbc2..61d893f 100644 --- a/days/src/main/kotlin/Day22.kt +++ b/days/src/main/kotlin/Day22.kt @@ -13,33 +13,36 @@ class Day22(@Groups val input: Input>>) { private val two = input.value[1].drop(1).map { it.toInt() } fun part1(): Long { - val oneDeque = ArrayDeque().apply { one.forEach { addFirst(it) } } - val twoDeque = ArrayDeque().apply { two.forEach { addFirst(it) } } + val oneDeque = ArrayDeque(one) + val twoDeque = ArrayDeque(two) while (oneDeque.isNotEmpty() && twoDeque.isNotEmpty()) { - val a = oneDeque.removeLast() - val b = twoDeque.removeLast() + val a = oneDeque.removeFirst() + val b = twoDeque.removeFirst() if (a > b) { - oneDeque.addFirst(a) - oneDeque.addFirst(b) + oneDeque.addLast(a) + oneDeque.addLast(b) } else { - twoDeque.addFirst(b) - twoDeque.addFirst(a) + twoDeque.addLast(b) + twoDeque.addLast(a) } } 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.score() = + asReversed().mapIndexed { index, value -> (index + 1).toLong() * value.toLong() }.sum() + fun part2(): Long { - val oneDeque = ArrayDeque().apply { one.forEach { addFirst(it) } } - val twoDeque = ArrayDeque().apply { two.forEach { addFirst(it) } } + val oneDeque = ArrayDeque(one) + val twoDeque = ArrayDeque(two) val winner = playGame(oneDeque, 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, two: ArrayDeque): Int { @@ -48,24 +51,24 @@ class Day22(@Groups val input: Input>>) { while (one.isNotEmpty() && two.isNotEmpty()) { if (!playedGames.add(PlayedGame(one.toList(), two.toList()))) return 1 - val a = one.removeLast() - val b = two.removeLast() + val a = one.removeFirst() + val b = two.removeFirst() val winner = when { one.size >= a && two.size >= b -> playGame( - ArrayDeque(one.drop(one.size - a)), - ArrayDeque(two.drop(two.size - b)) + ArrayDeque(one.take(a)), + ArrayDeque(two.take(b)) ) a > b -> 1 else -> 2 } if (winner == 1) { - one.addFirst(a) - one.addFirst(b) + one.addLast(a) + one.addLast(b) } else { - two.addFirst(b) - two.addFirst(a) + two.addLast(b) + two.addLast(a) } }