new structure for 2018, added license information
This commit is contained in:
83
2018/09/code.py
Normal file
83
2018/09/code.py
Normal file
@ -0,0 +1,83 @@
|
||||
""" https://adventofcode.com/2018/day/9 """
|
||||
|
||||
def readFile():
|
||||
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
|
||||
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))}")
|
Reference in New Issue
Block a user