From d4e7bca3931a8e9246639bd5ae2d4ede1fa8e0b1 Mon Sep 17 00:00:00 2001 From: aaron Date: Mon, 4 Dec 2023 21:15:27 +0100 Subject: [PATCH] solution to part a using list comprehensions --- 4/scratchcards.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 4/scratchcards.py diff --git a/4/scratchcards.py b/4/scratchcards.py new file mode 100644 index 0000000..a1555be --- /dev/null +++ b/4/scratchcards.py @@ -0,0 +1,57 @@ +from aocd.models import Puzzle +from aocd import submit +from dataclasses import dataclass +import math +import re + + +def get_winning_numbers(input_data: str) -> list: + """ + Parse input_data, extract all cards and turn them into sets. + Return the intersection between numbers and winning numbers. + """ + + # separate cards into a list of strings and remove excess whitespace + pairs = [ " ".join(card.split()) for card in input_data.split("\n") ] + # extract a set of winning numbers + winners = [ set(pair.split(":")[1].split("|")[0].strip().split(" ")) for pair in pairs ] + # extract a set of scratch numbers + numbers = [ set(pair.split(":")[1].split("|")[1].strip().split(" ")) for pair in pairs ] + # calculate set intersection between numbers and winning numbers + intersections = [ numbers[i].intersection(winners[i]) for i in range(len(numbers)) ] + + return intersections + +def calculate_score(winning_numbers:list) -> list: + """ + Calculate the score for each number + - 0 points for no match + - 1 point for 1 match + - double the points for each successive match + """ + scores = [] + for i, win in enumerate(winning_numbers): + if len(win) == 0: + scores.append(0) + if len(win) == 1: + scores.append(1) + if len(win) > 1: + scores.append(2**(len(win) - 1)) + return scores + + +if __name__ == "__main__": + # get puzzle and parse data + puzzle = Puzzle(year=2023, day=4) + + # parse_input(puzzle.input_data) + winning_numbers = get_winning_numbers(puzzle.input_data) + + answer_a = sum(calculate_score(winning_numbers)) + print(f"{answer_a}") + submit(answer_a, part="a", day=4, year=2023) + + # part b: + answer_b = 0 + print(f"{answer_b}") + #submit(answer_b, part="b", day=4, year=2023)