Fix deques order
This commit is contained in:
parent
e54fa1b187
commit
59dfc17ee1
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user