Skip to content

Instantly share code, notes, and snippets.

@sshaplygin
Last active December 7, 2023 15:18
Show Gist options
  • Save sshaplygin/f8557bb5d1cd1f4262465d0fb27c5a11 to your computer and use it in GitHub Desktop.
Save sshaplygin/f8557bb5d1cd1f4262465d0fb27c5a11 to your computer and use it in GitHub Desktop.
Adventofcode 2023 day 3
def get_text(is_test = False):
if is_test:
return [
'467..114..',
'...*......',
'..35..633.',
'......#...',
'617*......',
'.....+.58.',
'..592.....',
'......755.',
'...$.*....',
'.664.598..',
]
text = []
with open('input.txt', 'r') as file:
for line in file:
text.append(line.strip())
return text
steps = [
[-1, -1], [+1, +1], # диагональ с слевого верхного угла до правого нижнего
[-1, +1], [+1, -1], # диагональ с правого верхнего угла до левого нижнего
[0, -1], [0, +1],
[-1, 0], [+1, 0],
]
def check_around(arr, i, j):
if i < 0 or j < 0 or i >= len(arr) or j >= len(arr[0]):
return False
return arr[i][j] != "." and not arr[i][j].isdigit()
def is_gear(arr, i, j):
if i < 0 or j < 0 or i >= len(arr) or j >= len(arr[0]):
return False
return arr[i][j] == "*"
def sum_parts(arr):
s = 0
for i in range(len(arr)):
data = []
is_valid = False
for j in range(len(arr[0])):
if arr[i][j].isdigit():
if not is_valid:
for step in steps:
if check_around(arr, i + step[0], j + step[1]):
is_valid = True
break
data.append(arr[i][j])
arr[i][j] = '.'
continue
if len(data) != 0:
if is_valid:
num = int(''.join(data))
s += num
data = []
is_valid = False
if len(data) != 0 and is_valid:
num = int(''.join(data))
s += num
return s
def gear_ratio(arr):
s = 0
gears: dict = {}
for i in range(len(arr)):
data = []
has_gear = False
point = []
for j in range(len(arr[0])):
if arr[i][j].isdigit():
for step in steps:
if is_gear(arr, i + step[0], j + step[1]):
has_gear = True
point = [str(i + step[0]), str(j+step[1])]
break
data.append(arr[i][j])
arr[i][j] = '.'
continue
if len(data) != 0:
if has_gear:
k = ''.join(point)
if k not in gears:
gears[k] = []
gears[k].append(int(''.join(data)))
data = []
point = []
has_gear = False
if len(data) != 0 and has_gear:
k = ''.join(point)
if k not in gears:
gears[k] = []
gears[k].append(int(''.join(data)))
for key in gears:
if len(gears[key]) != 2:
continue
s += gears[key][0] * gears[key][1]
return s
def make_matrix(text):
arr = [] * len(text)
for i in range(len(text)):
arr.append([])
for j in range(len(text[0])):
arr[i].append(text[i][j])
return arr
if __name__ == '__main__':
text = get_text(True)
print(sum_parts(make_matrix(text)))
print(gear_ratio(make_matrix(text)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment