From 048d579effeeb9bf052d00039101f8a3db2bef08 Mon Sep 17 00:00:00 2001 From: kleph Date: Mon, 4 Dec 2023 03:21:24 +0100 Subject: [PATCH] 2023 - Day 3 part 2 --- 2023/3/3_2.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 2023/3/3_2.py diff --git a/2023/3/3_2.py b/2023/3/3_2.py new file mode 100644 index 0000000..5ab2012 --- /dev/null +++ b/2023/3/3_2.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# 2023 - Advent Of Code 3 - part 2 + +# file = 'input_example.txt' +file = 'input.txt' + + +def is_num(char): + if '0' <= char <= '9': + return True + return False + + +def parse_num(y, x): + pos = x + # print(f'begin pos: {pos}') + while pos > 0 and is_num(input_lines[y][pos-1]): + pos -= 1 + # print(f'begin pos: {pos}') + n = "" + while pos < len(input_lines[y]) and is_num(input_lines[y][pos]): + n += input_lines[y][pos] + pos += 1 + print(f'num: {int(n)}') + return int(n), pos + + +accum = 0 +# pylint: disable=consider-using-with +input_lines = [line.strip('\n') for line in open(file, encoding="utf-8")] + +# print(input_lines[y][x]) + +for linenum, line in enumerate(input_lines): + last_pos = 0 + for charnum, c in enumerate(line): + if c == '*': + part_found = [] + print(f'found gear at {c} at {charnum},{linenum}') + if linenum > 0 and charnum > 0: + if is_num(input_lines[linenum-1][charnum-1]): + # print('7') + number, last_pos = parse_num(linenum-1, charnum-1) + part_found.append(number) + if linenum > 0 and last_pos < charnum: + if is_num(input_lines[linenum-1][charnum]): + # print('8') + number, last_pos = parse_num(linenum-1, charnum) + part_found.append(number) + if last_pos < charnum+1: + if is_num(input_lines[linenum-1][charnum+1]): + # print('9') + number, last_pos = parse_num(linenum-1, charnum+1) + part_found.append(number) + last_pos = 0 + if charnum > 0: + if is_num(line[charnum-1]): + # print('4') + number, last_pos = parse_num(linenum, charnum-1) + part_found.append(number) + if is_num(line[charnum+1]): + # print('6') + number, last_pos = parse_num(linenum, charnum+1) + part_found.append(number) + last_pos = 0 + if linenum < len(input_lines) and last_pos < charnum: + if is_num(input_lines[linenum+1][charnum-1]): + # print('1') + number, last_pos = parse_num(linenum+1, charnum-1) + part_found.append(number) + if last_pos < charnum: + if is_num(input_lines[linenum+1][charnum]): + # print('2') + number, last_pos = parse_num(linenum+1, charnum) + part_found.append(number) + if linenum < len(input_lines) and last_pos < charnum+1: + if is_num(input_lines[linenum+1][charnum+1]): + # print('3') + number, last_pos = parse_num(linenum+1, charnum+1) + part_found.append(number) + if len(part_found) == 2: + # gear_ratio = int(part_found[0]) + int(part_found[1]) + # print(f'gear ratio {gear_ratio}') + accum += int(part_found[0]) * int(part_found[1]) + + +print(f"sum: {accum}")