This commit is contained in:
2018-12-09 22:26:06 +01:00
parent 6a5f28117d
commit 75f935e775
2 changed files with 120 additions and 0 deletions

View File

@@ -0,0 +1,119 @@
package com.basdado.adventofcode
fun main() {
val day = Day9()
// val testGame = Day9.Game(9, 25)
// testGame.play()
// // Correct last line: 0 16 8 17 4 18 19 2 24 20 25 10 21 5 22 11 1 12 6 13 3 14 7 15
// println(testGame.playerScores.joinToString())
//
day.puzzle1()
// Puzzle 1 answer = 385820
day.puzzle2()
}
class Day9 {
fun puzzle1() {
val input = lines("/day/9/input.txt")
.findFirst()
.get()
val regex = Regex("([0-9]+) players; last marble is worth ([0-9]+) points")
val match = regex.matchEntire(input)!!
val playerCount = match.groupValues[1].toInt()
val marbleCount = match.groupValues[2].toInt()
val game = Game(playerCount, marbleCount)
game.play()
println(game.playerScores.max())
}
fun puzzle2() {
val input = lines("/day/9/input.txt")
.findFirst()
.get()
val regex = Regex("([0-9]+) players; last marble is worth ([0-9]+) points")
val match = regex.matchEntire(input)!!
val playerCount = match.groupValues[1].toInt()
val marbleCount = match.groupValues[2].toInt() * 100
val game = Game(playerCount, marbleCount)
game.play()
println(game.playerScores.max())
}
class Game(val playerCount: Int, val marbleCount: Int) {
val playerScores = LongArray(playerCount)
val marbleCircle = DoubleLinkedList(0)
fun play() {
var marble = 1
var current = marbleCircle.first
var currentPlayer = 0
while(marble <= marbleCount) {
// println("$currentPlayer ${current.value} $marbleCircle")
if (marble % 23 == 0) {
playerScores[currentPlayer] = playerScores[currentPlayer] + marble
val toRemove = current.previous.previous.previous.previous.previous.previous.previous
val prev = toRemove.previous
val next = toRemove.next
prev.next = next
next.previous = prev
playerScores[currentPlayer] = playerScores[currentPlayer] + toRemove.value
current = next
} else {
val newNode = DoubleLinkedList.Node(marble)
newNode.previous = current.next
newNode.next = current.next.next
newNode.previous.next = newNode
newNode.next.previous = newNode
current = newNode
}
currentPlayer = (currentPlayer + 1) % playerCount
marble++
}
// println("$currentPlayer ${current.value} $marbleCircle")
}
}
class DoubleLinkedList<T>(firstEntry: T) {
class Node<T>(val value: T) {
var next: Node<T> = this
var previous: Node<T> = this
}
var first: Node<T>
init {
first = Node(firstEntry)
}
override fun toString(): String {
var node = first
var res = StringBuilder()
do {
res.append(node.value).append(" ")
node = node.next
} while (node != first)
return res.toString()
}
}
}

View File

@@ -0,0 +1 @@
468 players; last marble is worth 71843 points