diff --git a/2023/day_01/python/day_1_1.py b/2023/day_01/python/day_1_1.py new file mode 100644 index 0000000..c06e6db --- /dev/null +++ b/2023/day_01/python/day_1_1.py @@ -0,0 +1,26 @@ + +import sys + + +INPUT_PATH = "day_1\input.txt" +if len(sys.argv) > 1: + INPUT_PATH = sys.argv[1] + +with open(INPUT_PATH) as f: + data = f.readlines() + + +res = 0 +for line in data: + for c in line: + if c.isdigit(): + first = c + break + for c in line[::-1]: + if c.isdigit(): + last = c + break + num = int(first + last) + res += num + +print(res) diff --git a/2023/day_01/python/day_1_2.py b/2023/day_01/python/day_1_2.py new file mode 100644 index 0000000..f6d6f2b --- /dev/null +++ b/2023/day_01/python/day_1_2.py @@ -0,0 +1,87 @@ + +import sys + + +INPUT_PATH = "day_1\input.txt" +if len(sys.argv) > 1: + INPUT_PATH = sys.argv[1] + +with open(INPUT_PATH) as f: + data = f.readlines() + + +res = 0 +for line in data: + + used = "" + for c in line: + if c.isdigit(): + first = c + break + used += c + if used.endswith("one"): + first = "1" + break + elif used.endswith("two"): + first = "2" + break + elif used.endswith("three"): + first = "3" + break + elif used.endswith("four"): + first = "4" + break + elif used.endswith("five"): + first = "5" + break + elif used.endswith("six"): + first = "6" + break + elif used.endswith("seven"): + first = "7" + break + elif used.endswith("eight"): + first = "8" + break + elif used.endswith("nine"): + first = "9" + break + + used = "" + for c in line[::-1]: + if c.isdigit(): + last = c + break + used = c + used + if used.startswith("one"): + last = "1" + break + elif used.startswith("two"): + last = "2" + break + elif used.startswith("thre"): + last = "3" + break + elif used.startswith("four"): + last = "4" + break + elif used.startswith("five"): + last = "5" + break + elif used.startswith("six"): + last = "6" + break + elif used.startswith("seven"): + last = "7" + break + elif used.startswith("eight"): + last = "8" + break + elif used.startswith("nine"): + last = "9" + break + + num = int(first + last) + res += num + +print(res) diff --git a/2023/day_02/python/day_2_1.py b/2023/day_02/python/day_2_1.py new file mode 100644 index 0000000..03963e8 --- /dev/null +++ b/2023/day_02/python/day_2_1.py @@ -0,0 +1,39 @@ +""" +Determine which games would have been possible if the bag had been loaded with only 12 +red cubes, 13 green cubes, and 14 blue cubes. +""" + + +import sys + + +INPUT_PATH = "day_2\input.txt" +if len(sys.argv) > 1: + INPUT_PATH = sys.argv[1] + +with open(INPUT_PATH) as f: + data = f.readlines() + + +limit = { + "red": 12, + "green": 13, + "blue": 14 +} +res = 0 +for line in data: + game, game_info = line.split(":") + num = int(game.split()[1]) + valid = True + for peek_info in game_info.split("; "): + for cubes_info in peek_info.split(","): + n, color = cubes_info.split() + if limit[color] < int(n): + valid = False + break + if valid == False: + break + else: + res += num + +print(res) diff --git a/2023/day_02/python/day_2_2.py b/2023/day_02/python/day_2_2.py new file mode 100644 index 0000000..5f151e5 --- /dev/null +++ b/2023/day_02/python/day_2_2.py @@ -0,0 +1,29 @@ + +import sys + + +INPUT_PATH = "day_2\input.txt" +if len(sys.argv) > 1: + INPUT_PATH = sys.argv[1] + +with open(INPUT_PATH) as f: + data = f.readlines() + + +res = 0 +for line in data: + game, game_info = line.split(":") + maxi = { + "red": 0, + "green": 0, + "blue": 0 + } + for peek_info in game_info.split("; "): + for cubes_info in peek_info.split(","): + n, color = cubes_info.split() + n = int(n) + if maxi[color] < n: + maxi[color] = n + res += maxi["red"] * maxi["green"] * maxi["blue"] + +print(res) diff --git a/2023/day_03/python/day_3_1.py b/2023/day_03/python/day_3_1.py new file mode 100644 index 0000000..fc007eb --- /dev/null +++ b/2023/day_03/python/day_3_1.py @@ -0,0 +1,69 @@ + +import sys + + +def get_symbols(line: str): + symbols = set() + for i, c in enumerate(line): + if c in "#%-=@/*&+$": + symbols.add(i) + return symbols + + +INPUT_PATH = "day_3\input.txt" +if len(sys.argv) > 1: + INPUT_PATH = sys.argv[1] + +with open(INPUT_PATH) as f: + data = f.readlines() + + +res = 0 +last_symbols = set() +symbols = get_symbols(data[0]) +for i, line in enumerate(data): + if i == len(data) - 1: + next_symbols = set() + else: + next_symbols = get_symbols(data[i+1]) + + i = 0 + while i < len(line): + + while i < len(line) and not line[i].isdigit(): + i += 1 + start = i + # print(f"{start=}") # TEMP + + if start == len(line): + continue + + while i < len(line) and line[i].isdigit(): + i += 1 + if i == len(line): + end = i + 1 + else: + end = i + + is_part_number = ( + start - 1 in symbols + or end in symbols + ) + if not is_part_number: + last_next_symbols = last_symbols | next_symbols + for j in range(start-1, end+1): + if j in last_next_symbols: + is_part_number = True + break + + if is_part_number: + number = int(line[start:end]) + # print(f"{number=}, {start=}, {end=}") # TEMP + res += number + + i += 1 + + last_symbols = symbols + symbols = next_symbols + +print(res) diff --git a/2023/day_03/python/day_3_2.py b/2023/day_03/python/day_3_2.py new file mode 100644 index 0000000..707d23d --- /dev/null +++ b/2023/day_03/python/day_3_2.py @@ -0,0 +1,75 @@ + +import sys + + +def get_part_number(line: str, pos: int): + i = pos-1 + while i > -1 and line[i].isdigit(): + i -= 1 + + j = pos+1 + while j < len(line) and line[j].isdigit(): + j += 1 + + return int(line[i+1:j]) + + +def get_symbols(line: str): + symbols = set() + for i, c in enumerate(line): + if c in "#%-=@/*&+$": + symbols.add(i) + return symbols + + +INPUT_PATH = "day_3\input.txt" +if len(sys.argv) > 1: + INPUT_PATH = sys.argv[1] + +with open(INPUT_PATH) as f: + data = f.readlines() + +n = len(data[0]) +empty_line = "." * n +data.insert(0, empty_line) +data.append(empty_line) + +res = 0 +for i, line in enumerate(data[1:-1], 1): + symbols = get_symbols(line) + + for symbol in symbols: + part_numbers = [] + + if symbol > 0 and line[symbol-1].isdigit(): + part_numbers.append(get_part_number(line, symbol-1)) + + if symbol < len(line) - 1 and line[symbol+1].isdigit(): + part_numbers.append(get_part_number(line, symbol+1)) + + last_line = data[i-1] + if last_line[symbol].isdigit(): + part_numbers.append(get_part_number(last_line, symbol)) + else: + if symbol > 0 and last_line[symbol-1].isdigit(): + part_numbers.append(get_part_number(last_line, symbol-1)) + if symbol < len(line) - 1 and last_line[symbol+1].isdigit(): + part_numbers.append(get_part_number(last_line, symbol+1)) + + next_line = data[i+1] + if next_line[symbol].isdigit(): + part_numbers.append(get_part_number(next_line, symbol)) + else: + if symbol > 0 and next_line[symbol-1].isdigit(): + part_numbers.append(get_part_number(next_line, symbol-1)) + if symbol < len(line) - 1 and next_line[symbol+1].isdigit(): + part_numbers.append(get_part_number(next_line, symbol+1)) + + if len(part_numbers) == 2: + # print(part_numbers) # TEMP + product = 1 + for part_number in part_numbers: + product *= part_number + res += product + +print(res)