advent_of_code/2021/13/13_2.py

113 lines
2.7 KiB
Python
Raw Normal View History

2021-12-13 23:16:44 +01:00
#!/usr/bin/env python
# 2021 - Advent Of Code - 13 part 2
2022-11-30 01:48:52 +01:00
# 2022: cheat for pylint to start fresh for 2022
# pylint: disable=unnecessary-list-index-lookup
2021-12-13 23:16:44 +01:00
def parse_file(file):
parsed_dots = []
parsed_folds = []
2022-04-05 13:27:24 +02:00
with open(file, encoding="utf-8") as f:
2021-12-13 23:16:44 +01:00
for line in f.readlines():
if line.startswith('fold along '):
_, f = line.strip().split('fold along ')
parsed_folds.append(f.split('='))
elif line == '\n':
pass
else:
dot = [int(d) for d in line.strip().split(',')]
parsed_dots.append(dot)
return parsed_dots, parsed_folds
def find_max(dot_list):
mx = 0
my = 0
for d in dot_list:
if d[0] > mx:
mx = d[0]
if d[1] > my:
my = d[1]
return mx, my
def place_dots(g, dots_list):
for dot in dots_list:
g[dot[1]][dot[0]] = 1
def print_grid(g):
for y, _ in enumerate(g):
for x, _ in enumerate(g[y]):
if g[y][x] == 1:
print('#', end='')
else:
print('.', end='')
print()
def fold_horizontally(g, fold_y, g_maxy):
print(f'folding y={fold_y}')
for y in range(fold_y, g_maxy+1):
folding_dist = y - fold_y
new_y = fold_y - folding_dist
# place new dots
for x, _ in enumerate(g[y]):
if g[y][x] == 1:
g[new_y][x] = 1
# cut the other half of the grid
for _ in range(fold_y+1):
g.pop()
return fold_y-1
def fold_vertically(g, fold_x, g_maxx):
print(f'folding x={fold_x}')
for y, _ in enumerate(g):
# place new dots
for x in range(fold_x, g_maxx+1):
folding_dist = x - fold_x
new_x = fold_x - folding_dist
if g[y][x] == 1:
g[y][new_x] = 1
# cut the other half of the grid
g[y] = g[y][:fold_x]
return fold_x-1
def count_dots(g):
count = 0
for y, _ in enumerate(g):
for x, _ in enumerate(g[y]):
if g[y][x] == 1:
count += 1
return count
# dots, folds = parse_file('input_example.txt')
dots, folds = parse_file('input.txt')
maxx, maxy = find_max(dots)
grid = [[0] * (maxx+1) for _ in range(maxy+1)]
place_dots(grid, dots)
print(f'grid size: {maxx}, {maxy}')
print(f'real grid size: {len(grid[0])}, {len(grid)}')
print()
for fold in folds:
if fold[0] == 'x':
maxx = fold_vertically(grid, int(fold[1]), maxx)
else:
maxy = fold_horizontally(grid, int(fold[1]), maxy)
print(f'grid size: {maxx}, {maxy}')
print(f'real grid size: {len(grid[0])}, {len(grid)}')
print()
print_grid(grid)