From e4b8d8e71c7e85bc26982c42d8c4931c17b7f157 Mon Sep 17 00:00:00 2001 From: Christopher Bohn <bohn@unl.edu> Date: Fri, 1 Dec 2023 10:34:46 -0600 Subject: [PATCH] Completed 2023 Day 01 --- 2023/python/Day01.py | 77 +++++++++++++++++++++++ 2023/python/DayXX | 1 + scaffolding/DayXX | 30 +++++++++ {2020 => scaffolding}/ImportData.TEMPLATE | 0 4 files changed, 108 insertions(+) create mode 100644 2023/python/Day01.py create mode 120000 2023/python/DayXX create mode 100644 scaffolding/DayXX rename {2020 => scaffolding}/ImportData.TEMPLATE (100%) diff --git a/2023/python/Day01.py b/2023/python/Day01.py new file mode 100644 index 0000000..f751d71 --- /dev/null +++ b/2023/python/Day01.py @@ -0,0 +1,77 @@ +import functools +from typing import List, Optional, Dict + +from ImportData import import_data + +day: int = 1 + +# sample_data: List[str] = ''' +# 1abc2 +# pqr3stu8vwx +# a1b2c3d4e5f +# treb7uchet +# '''.split('\n')[1:-1] + +sample_data: List[str] = ''' +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen +'''.split('\n')[1:-1] + +data_structure: type = List[str] + + +def parse_data(data: List[str]) -> data_structure: + return data + + +def part1(data: data_structure) -> int: + values: List[int] = [] + for datum in data: + first_digit: Optional[int] = None + last_digit: int = 0 + for character in datum: + if character.isdigit(): + first_digit = int(character) if first_digit is None else first_digit + last_digit = int(character) + if first_digit is None: + first_digit = 0 + last_digit = 0 + values.append(10 * first_digit + last_digit) + return functools.reduce(lambda a, b: a + b, values) + + +def part2(data: data_structure) -> int: + digit_names: Dict[str, int] = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, + 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, 'zero': 0} + values: List[int] = [] + for datum in data: + first_digit: Optional[int] = None + last_digit: int = 0 + for index, character in enumerate(datum): + digit: Optional[int] = None + if character.isdigit(): + digit = int(character) + else: + for digit_name in digit_names: + if datum[index:index+len(digit_name)] == digit_name: + digit = digit_names[digit_name] + if digit is not None: + first_digit = digit if first_digit is None else first_digit + last_digit = digit + if first_digit is None: + first_digit = 0 + last_digit = 0 + values.append(10 * first_digit + last_digit) + return functools.reduce(lambda a, b: a + b, values) + + +if __name__ == '__main__': + production_ready = True + raw_data = import_data(day) if production_ready else sample_data + print(part1(parse_data(raw_data))) + print(part2(parse_data(raw_data))) diff --git a/2023/python/DayXX b/2023/python/DayXX new file mode 120000 index 0000000..087f361 --- /dev/null +++ b/2023/python/DayXX @@ -0,0 +1 @@ +../../scaffolding/DayXX \ No newline at end of file diff --git a/scaffolding/DayXX b/scaffolding/DayXX new file mode 100644 index 0000000..9740ec2 --- /dev/null +++ b/scaffolding/DayXX @@ -0,0 +1,30 @@ +from typing import List + +from ImportData import import_data + +day: int = X + +sample_data: List[str] = [ + +] + +data_structure: type = Y + + +def parse_data(data: List[str]) -> data_structure: + return None + + +def part1(data: data_structure) -> int: + return -1 + + +def part2(data: data_structure) -> int: + return -1 + + +if __name__ == '__main__': + production_ready = False + raw_data = import_data(day) if production_ready else sample_data + print(part1(parse_data(raw_data))) + print(part2(parse_data(raw_data))) diff --git a/2020/ImportData.TEMPLATE b/scaffolding/ImportData.TEMPLATE similarity index 100% rename from 2020/ImportData.TEMPLATE rename to scaffolding/ImportData.TEMPLATE -- GitLab