diff --git a/Sources/AOC2018/day09.swift b/Sources/AOC2018/day09.swift new file mode 100644 index 0000000..370dadb --- /dev/null +++ b/Sources/AOC2018/day09.swift @@ -0,0 +1,187 @@ +// +// Advent of Code 2018 "Day 9: Marble Mania" +// + +import Foundation + +struct List { + var val = 0 + var ptrNext = -1 + var ptrPrev = -1 +} + +class Marble { + var player: [Int] = [] + var lastMarble = 0 + var circle: [List] = [] + var circleCount = 1 + var currentMarble = 0 + var currentPlayer = 0 + var PC = 0 + + init(numPlayers: Int, lastMarble last: Int) { + circle = Array(repeating: List(), count: last+1) + circleCount = 1 + currentMarble = 0 + currentPlayer = 0 + PC = 0 + circle[0].ptrNext = 0 + circle[0].ptrPrev = 0 + + player = Array(repeating: 0, count: numPlayers) + for num in 0...last { circle[num].val = num } + lastMarble = last + } + + func insert() { + circle[currentMarble].ptrNext = circle[PC].val + circle[currentMarble].ptrPrev = circle[PC].ptrPrev + circle[circle[PC].ptrPrev].ptrNext = circle[currentMarble].val + circle[PC].ptrPrev = circle[currentMarble].val + PC = currentMarble + circleCount += 1 + } + + func remove() { + circle[circle[PC].ptrPrev].ptrNext = circle[PC].ptrNext + circle[circle[PC].ptrNext].ptrPrev = circle[PC].ptrPrev + PC = circle[circle[PC].ptrPrev].ptrNext + circleCount -= 1 + } + + func incrPC() { + PC = circle[PC].ptrNext + } + + func incrPC(by n: Int) { + for _ in 0.. ()) = day09Tests + lazy var final: (() -> ()) = day09Final + + let testData: [(Int, Int, Int)] = [ + (9, 25, 32), + (13, 7999, 146373), + (17, 1104, 2764), + (21, 6111, 54718), + (30, 5807, 37305) + ] + + let finalData = (477, 70851) + + func printCircle(circle: [List], withCount circleCount: Int) -> String { + var retVal = "" + var marble = circle[0] + for _ in 0.. 0 { print("\nDay \(onlyOneDay)")