75 lines
1.7 KiB
Python
75 lines
1.7 KiB
Python
|
import matrix
|
||
|
import shared
|
||
|
import itertools
|
||
|
import functools
|
||
|
|
||
|
SYMBOLS="*%@#+-/$=&"
|
||
|
|
||
|
def get_all_numbers_and_starting_coords(mat):
|
||
|
nums = []
|
||
|
for y, row in enumerate(mat):
|
||
|
x = 0
|
||
|
while x < len(row):
|
||
|
num = matrix.number_starting_at(mat, x,y)
|
||
|
if num is None:
|
||
|
x += 1
|
||
|
continue
|
||
|
nums.append(((x,y), num))
|
||
|
x += len(num)
|
||
|
return nums
|
||
|
|
||
|
def get_row_coords(x1,y, length):
|
||
|
coords = []
|
||
|
for x in range(x1, x1+length):
|
||
|
coords.append((x,y))
|
||
|
return coords
|
||
|
|
||
|
# @shared.profile
|
||
|
def part1(mat):
|
||
|
choose = []
|
||
|
nums = get_all_numbers_and_starting_coords(mat)
|
||
|
for coords, num in nums:
|
||
|
valid = process_number(mat, coords, num)
|
||
|
if valid:
|
||
|
choose.append(num)
|
||
|
total = 0
|
||
|
for n in choose:
|
||
|
total += int(n)
|
||
|
print(total)
|
||
|
|
||
|
|
||
|
def process_number(mx, coords, num):
|
||
|
line_coords = get_row_coords(*coords, len(num))
|
||
|
for coord in line_coords:
|
||
|
any_symbols = [v for _,v in matrix.get_neighbor_coords(mx, *coord) if v in SYMBOLS]
|
||
|
if any_symbols:
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
|
||
|
# @shared.profile
|
||
|
def part2(mat):
|
||
|
print(matrix.ppmx(mat, pad=False))
|
||
|
_nums = get_all_numbers_and_starting_coords(mat)
|
||
|
nums = []
|
||
|
#get_row_coords(*coords, len(num))
|
||
|
|
||
|
splats = matrix.find_in_matrix(mat, "*", False)
|
||
|
print(splats)
|
||
|
|
||
|
|
||
|
|
||
|
def main():
|
||
|
mat = shared.load_file_char_matrix(shared.get_fname(3))
|
||
|
with shared.elapsed_timer() as elapsed:
|
||
|
part1(mat)
|
||
|
print("🕒", elapsed())
|
||
|
|
||
|
with shared.elapsed_timer() as elapsed:
|
||
|
part2(mat)
|
||
|
print("🕒", elapsed())
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|