Update day20.py
This commit is contained in:
parent
cd0f76a449
commit
3b4e2206e2
|
@ -1,5 +1,5 @@
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Union
|
from typing import Union, Tuple
|
||||||
|
|
||||||
|
|
||||||
class Side(Enum):
|
class Side(Enum):
|
||||||
|
@ -166,6 +166,7 @@ def solve_p1(data: list[Tile]) -> int:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
# SOLVED PART 1
|
||||||
DATA = parse_data()
|
DATA = parse_data()
|
||||||
connect_tiles(DATA, set(), DATA[0].flip_ud())
|
connect_tiles(DATA, set(), DATA[0].flip_ud())
|
||||||
print(solve_p1(DATA))
|
print(solve_p1(DATA))
|
||||||
|
@ -195,5 +196,50 @@ def render_full_image(data: list[Tile]) -> Tile:
|
||||||
return Tile("RENDERED", rendered[1:])
|
return Tile("RENDERED", rendered[1:])
|
||||||
|
|
||||||
|
|
||||||
RENDERED = render_full_image(DATA)
|
def scan_window(window: list[list[str]], start_r: int, start_c: int) -> list[Tuple[int, int]]:
|
||||||
RENDERED.print()
|
if len(window) != 3 or len(window[0]) != 20:
|
||||||
|
return []
|
||||||
|
required = [(0, 18), (1, 0), (1, 5), (1, 6), (1, 11), (1, 12), (1, 17), (1, 18), (1, 19), (2, 1), (2, 4), (2, 7), (2, 10), (2, 13), (2, 16)]
|
||||||
|
for r, c in required:
|
||||||
|
if window[r][c] != "#":
|
||||||
|
return []
|
||||||
|
return [(r+start_r, c+start_c) for (r, c) in required]
|
||||||
|
|
||||||
|
|
||||||
|
def scan_image(image: list[list[str]]) -> set[Tuple[int, int]]:
|
||||||
|
found = set()
|
||||||
|
for i in range(len(image)-2):
|
||||||
|
for j in range(len(image[0])-19):
|
||||||
|
window = [image[i][j:j+20], image[i+1][j:j+20], image[i+2][j:j+20]]
|
||||||
|
for found_r, found_c in scan_window(window, start_r=i, start_c=j):
|
||||||
|
found.add((found_r, found_c))
|
||||||
|
return found
|
||||||
|
|
||||||
|
|
||||||
|
def solve_p2(data: list[Tile]) -> int:
|
||||||
|
rendered = render_full_image(data)
|
||||||
|
scan_set = set()
|
||||||
|
for i in range(4):
|
||||||
|
scan_set = scan_image(rendered.image)
|
||||||
|
if len(scan_set) > 0:
|
||||||
|
break
|
||||||
|
rendered.rotate_r()
|
||||||
|
if len(scan_set) == 0:
|
||||||
|
rendered.flip_lr()
|
||||||
|
for i in range(4):
|
||||||
|
scan_set = scan_image(rendered.image)
|
||||||
|
if len(scan_set) > 0:
|
||||||
|
break
|
||||||
|
rendered.rotate_r()
|
||||||
|
|
||||||
|
# Find not marked characters
|
||||||
|
counted = 0
|
||||||
|
for r in range(len(rendered.image)):
|
||||||
|
for c in range(len(rendered.image[0])):
|
||||||
|
if rendered.image[r][c] == '#' and (r, c) not in scan_set:
|
||||||
|
counted += 1
|
||||||
|
return counted
|
||||||
|
|
||||||
|
|
||||||
|
# SOLVED PART 2
|
||||||
|
print(solve_p2(DATA))
|
||||||
|
|
Loading…
Reference in a new issue