From 15ab5575b23b2e27caed6228aa5f3ae5c418523d Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 6 Dec 2022 15:36:34 +0100 Subject: [PATCH] [py] Port 2018_09 --- py/2018/09/solve.py | 87 --------------------------------------------- py/aoc/__init__.py | 3 +- py/aoc/y2018/d09.py | 85 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 88 deletions(-) delete mode 100644 py/2018/09/solve.py create mode 100644 py/aoc/y2018/d09.py diff --git a/py/2018/09/solve.py b/py/2018/09/solve.py deleted file mode 100644 index 526b1c9..0000000 --- a/py/2018/09/solve.py +++ /dev/null @@ -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) diff --git a/py/aoc/__init__.py b/py/aoc/__init__.py index ff62c4a..58c3163 100644 --- a/py/aoc/__init__.py +++ b/py/aoc/__init__.py @@ -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, diff --git a/py/aoc/y2018/d09.py b/py/aoc/y2018/d09.py new file mode 100644 index 0000000..c400f89 --- /dev/null +++ b/py/aoc/y2018/d09.py @@ -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()}")