[py] Port 2018_09

This commit is contained in:
Joscha 2022-12-06 15:36:34 +01:00
parent 26433b8618
commit 15ab5575b2
3 changed files with 87 additions and 88 deletions

View file

@ -1,87 +0,0 @@
import sys
import collections
# PART 1
class Circle:
def __init__(self):
self.marbles = collections.deque([0])
#self.marbles = [0]
self.next = 1
def move_focus(self, steps):
self.marbles.rotate(steps)
#self.marbles = self.marbles[steps:] + self.marbles[:steps]
def insert(self):
self.marbles.append(self.next)
#self.marbles = [self.next] + self.marbles
self.next += 1
def remove(self):
return self.marbles.pop()
#n = self.marbles[0]
#self.marbles = self.marbles[1:]
#return n
def insert_marble(self):
# returns the two marbles removed in a tuple, or None
if self.next % 23 == 0:
return self.insert_multiple()
else:
self.insert_normal()
return None
def insert_normal(self):
self.move_focus(2)
self.insert()
def insert_multiple(self):
cur = self.next
self.next += 1
self.move_focus(-7)
left = self.remove()
return (cur, left)
class Game:
def __init__(self, elves, until):
self.circle = Circle()
self.until = until
self.elves = [0 for _ in range(elves)]
def play(self):
while True:
for elf in range(len(self.elves)):
if self.circle.next % 10000 == 0:
print(f"{self.circle.next:5} of {self.until:5} - {100 * self.circle.next / self.until:.04}% {len(self.circle.marbles):8}")
if self.circle.next > self.until:
return
result = self.circle.insert_marble()
if result is not None:
fst, snd = result
self.elves[elf] += fst + snd
def highscore(self):
return max(self.elves)
# PART 2
def main(elves, until):
game = Game(elves, until)
game.play()
score = game.highscore()
print(score)
if __name__ == "__main__":
#main( 9, 25)
#main(10, 1618)
#main(13, 7999)
#main(17, 1104)
#main(21, 6111)
#main(30, 5807)
main(429, 70901)
main(429, 70901*100)

View file

@ -2,7 +2,7 @@ import sys
import argparse
from pathlib import Path
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09
from .y2020 import d10
from .y2021 import d14
from .y2022 import d01, d02, d03, d04, d05, d06
@ -16,6 +16,7 @@ DAYS = {
"2018_06": y2018.d06.solve,
"2018_07": y2018.d07.solve,
"2018_08": y2018.d08.solve,
"2018_09": y2018.d09.solve,
"2020_10": y2020.d10.solve,
"2021_14": y2021.d14.solve,
"2022_01": y2022.d01.solve,

85
py/aoc/y2018/d09.py Normal file
View file

@ -0,0 +1,85 @@
import collections
class Circle:
def __init__(self):
self.marbles = collections.deque([0])
# self.marbles = [0]
self.next = 1
def move_focus(self, steps):
self.marbles.rotate(steps)
# self.marbles = self.marbles[steps:] + self.marbles[:steps]
def insert(self):
self.marbles.append(self.next)
# self.marbles = [self.next] + self.marbles
self.next += 1
def remove(self):
return self.marbles.pop()
# n = self.marbles[0]
# self.marbles = self.marbles[1:]
# return n
def insert_marble(self):
# returns the two marbles removed in a tuple, or None
if self.next % 23 == 0:
return self.insert_multiple()
else:
self.insert_normal()
return None
def insert_normal(self):
self.move_focus(2)
self.insert()
def insert_multiple(self):
cur = self.next
self.next += 1
self.move_focus(-7)
left = self.remove()
return (cur, left)
class Game:
def __init__(self, elves, until):
self.circle = Circle()
self.until = until
self.elves = [0 for _ in range(elves)]
def play(self):
while True:
for elf in range(len(self.elves)):
# if self.circle.next % 10000 == 0:
# print(
# f"{self.circle.next:5} of {self.until:5} - {100 * self.circle.next / self.until:.04}% {len(self.circle.marbles):8}"
# )
if self.circle.next > self.until:
return
result = self.circle.insert_marble()
if result is not None:
fst, snd = result
self.elves[elf] += fst + snd
def highscore(self):
return max(self.elves)
def solve(inputstr):
elves, _, _, _, _, _, until, _ = inputstr.strip().split()
elves, until = int(elves), int(until)
game = Game(elves, until)
game.play()
score = game.highscore()
print(f"Part 1: {game.highscore()}")
game = Game(elves, until * 100)
game.play()
score = game.highscore()
print(f"Part 2: {game.highscore()}")