diff --git a/2024/14/main.py b/2024/14/main.py new file mode 100644 index 0000000..1bd8f80 --- /dev/null +++ b/2024/14/main.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# -*- encoding: utf-8; py-indent-offset: 4 -*- + +# Author: Sebastian Mark +# CC-BY-SA (https://creativecommons.org/licenses/by-sa/4.0/deed.de) + +# pylint: disable=missing-module-docstring,missing-function-docstring,consider-using-f-string,no-else-return + +import re + + +def readinput(): + with open("input", "r", encoding="utf-8") as file: + robots = [] + for line in file: + regex = r"p=(.?\d+),(.?\d+) v=(.?\d+),(.?\d+)" + m = re.findall(regex, line)[0] + robots.append( + { + "pos": (int(m[0]), int(m[1])), # x,y + "move": (int(m[2]), int(m[3])), # x,y + } + ) + return robots + + +def get_robot_pos_after_time(area: dict, robot: tuple, seconds: int) -> tuple: + for _ in range(seconds): + nxtx = (robot["pos"][0] + robot["move"][0]) % area["width"] + nxty = (robot["pos"][1] + robot["move"][1]) % area["height"] + + robot["pos"] = nxtx, nxty + + return robot["pos"] + + +def get_quadrant(area: dict, position: tuple) -> int: + middle_x = area["width"] // 2 + middle_y = area["height"] // 2 + + if position[0] == middle_x or position[1] == middle_y: + return 0 + + if position[1] < middle_y: + if position[0] < middle_x: + return 1 + else: + return 2 + else: + if position[0] < middle_x: + return 3 + else: + return 4 + + +def assign_qadrants(area: dict, positions: dict) -> list: + quadrant_count = {} + for pos, count in positions.items(): + quadrant = get_quadrant(area, pos) + if quadrant != 0: + quadrant_count[quadrant] = quadrant_count.get(quadrant, 0) + count + + return quadrant_count + + +def main(): + robots = readinput() + + area = {"width": 101, "height": 103} + seconds = 100 + + # part 1 + positions = {} + for robot in robots: + pos = get_robot_pos_after_time(area, robot, seconds) + positions[pos] = positions.get(pos, 0) + 1 + + safety_factor = 1 + quadrant_count = assign_qadrants(area, positions) + for c in quadrant_count.values(): + safety_factor *= c + + print("Safety factor: %d" % safety_factor) + + +if __name__ == "__main__": + main()