83 lines
2.2 KiB
Python
Raw Normal View History

2019-11-18 02:37:56 +01:00
""" https://adventofcode.com/2018/day/9 """
def readFile():
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
2019-11-18 02:37:56 +01:00
data = f.read().split(" ")
return (int(data[0]), int(data[6]))
class Player:
num = 1
def __init__(self):
self.score = 0
self.number = Player.num
Player.num += 1
def getMaxScore(players):
maxScore = 0
for player in players:
if player.score > maxScore:
maxScore = player.score
return maxScore
def part1(vals):
players = [Player() for i in range(vals[0])]
curPlayer = 0
curMarble = 0
marbles = [0]
for i in range(1, vals[1] + 1):
size = len(marbles)
if i % 23 != 0:
idx = (curMarble + 2) % size
if idx == 0:
marbles.append(i)
curMarble = size
else:
marbles.insert(idx, i)
curMarble = idx
else:
idx = (curMarble - 7) % size
temp = marbles.pop(idx)
players[curPlayer].score += i + temp
curMarble = idx % (size - 1)
curPlayer = (curPlayer + 1) % vals[0]
return getMaxScore(players)
def part2(vals): # optimized part 1 because that took too long
from collections import deque
players = [Player() for i in range(vals[0])]
curPlayer = 0
marbles = deque([0])
for i in range(1, vals[1] + 1):
if i % 23 == 0:
marbles.rotate(7)
players[curPlayer].score += i + marbles.pop()
marbles.rotate(-1)
else:
marbles.rotate(-1)
marbles.append(i)
curPlayer = (curPlayer + 1) % vals[0]
return getMaxScore(players)
def testPart1():
examples = [
(9, 23, 32), (10, 1618, 8317),
(13, 7999, 146373), (17, 1104, 2764),
(21, 6111, 54718), (30, 5807, 37305)
]
for e in examples:
r = part1(e[:2])
print(f"{e[0]} Players, {e[1]} Marbles, Goal: {e[2]}," \
f"Result: {r}, Correct: {e[2] == r}")
if __name__ == "__main__":
#testPart1()
vals = readFile()
print(f"Part 1: {part1(vals)}")
print(f"Part 2: {part2((vals[0], vals[1]*100))}")