From 42cf587323af490d8a65cc41bb478cf74a6974d5 Mon Sep 17 00:00:00 2001 From: Ettore Dreucci Date: Sun, 6 Dec 2020 16:40:17 +0100 Subject: [PATCH] AoC 2020: day1, refactoring for O(n), O(n^2) Signed-off-by: Ettore Dreucci --- 2020-python/solutions/day_1.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/2020-python/solutions/day_1.py b/2020-python/solutions/day_1.py index 251f03f..d5a180d 100644 --- a/2020-python/solutions/day_1.py +++ b/2020-python/solutions/day_1.py @@ -3,39 +3,40 @@ import pathlib import time -def read_input(input_path: str) -> list: +def read_input(input_path: str) -> tuple: """take input file path and return appropriate data structure""" with open(input_path, 'r') as input_file: entries = list() + is_present = [False]*2020 for entry in input_file.readlines(): entries.append(int(entry)) - return entries + is_present[int(entry)-1] = True + return (entries, is_present) -def part1(entries: list) -> int: - """part1 solver take a list of int and return an int""" +def part1(entries: list, is_present: list) -> int: + """part1 solver take a list of int and a list of bool and return an int""" for x in entries: complement = 2020 - x - if complement in entries: + if complement > 0 and is_present[complement-1]: return x * complement return None -def part2(entries: list) -> int: - """part2 solver take a list of int and return an int""" +def part2(entries: list, is_present: list) -> int: + """part2 solver take a list of int and a list of bool and return an int""" for x, i in enumerate(entries): for y in entries[i:]: complement = 2020 - x - y - if complement in entries: + if complement > 0 and is_present[complement-1]: return x * y * complement return None - def main(): """main function""" - input_path = str(pathlib.Path.cwd()) + "/inputs/" + str(pathlib.Path(__file__).stem) - entries = read_input(input_path) + input_path = str(pathlib.Path(__file__).resolve().parent.parent) + "/inputs/" + str(pathlib.Path(__file__).stem) + entries, is_present = read_input(input_path) start_time = time.time() - print("Part 1: %d" % part1(entries)) - print("Part 2: %d" % part2(entries)) + print("Part 1: %d" % part1(entries, is_present)) + print("Part 2: %d" % part2(entries, is_present)) end_time = time.time() print("Execution time: %f" % (end_time-start_time))