[WIP] Solve test 1 for problem 3 part 2
This commit is contained in:
parent
14955c5bb9
commit
b12e0632af
@ -60,13 +60,10 @@
|
|||||||
from math import inf
|
from math import inf
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from sympy import Segment
|
from sympy import Segment, Point
|
||||||
|
|
||||||
<<<<<<< HEAD
|
# with open("files/P3.txt") as f:
|
||||||
with open("files/P3.txt") as f:
|
|
||||||
=======
|
|
||||||
with open("files/test1.txt") as f:
|
with open("files/test1.txt") as f:
|
||||||
>>>>>>> ef8582f ([WIP] Solution to problem 3 part 2 in Python)
|
|
||||||
wire_a, wire_b = [path.split(",") for path in f.read().strip().split()]
|
wire_a, wire_b = [path.split(",") for path in f.read().strip().split()]
|
||||||
|
|
||||||
|
|
||||||
@ -115,10 +112,6 @@ def part_1() -> None:
|
|||||||
print(f"The manhattan distance to the closest intersection is {closest}")
|
print(f"The manhattan distance to the closest intersection is {closest}")
|
||||||
|
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
if __name__ == "__main__":
|
|
||||||
part_1()
|
|
||||||
=======
|
|
||||||
# --- Part Two ---
|
# --- Part Two ---
|
||||||
|
|
||||||
# It turns out that this circuit is very timing-sensitive; you actually need to
|
# It turns out that this circuit is very timing-sensitive; you actually need to
|
||||||
@ -162,21 +155,24 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
# What is the fewest combined steps the wires must take to reach an
|
# What is the fewest combined steps the wires must take to reach an
|
||||||
# intersection?
|
# intersection?
|
||||||
print(path_a)
|
# print(path_a)
|
||||||
print(path_b)
|
# print(path_b)
|
||||||
|
|
||||||
|
|
||||||
def accumulate_path(wire):
|
def accumulate_path(wire, steps):
|
||||||
path = 0
|
path = 0
|
||||||
for step in wire:
|
for step in wire[:steps]:
|
||||||
_, length = step[0], int(step[1:])
|
_, length = step[0], int(step[1:])
|
||||||
path += length
|
path += length
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
# print(accumulate_path(wire_a, 2))
|
||||||
|
|
||||||
|
|
||||||
def get_direction(segment):
|
def get_direction(segment):
|
||||||
is_horizontal = False
|
is_horizontal = False
|
||||||
if segment.points[0][0] == segment.points[1][0]:
|
if segment.points[0][1] == segment.points[1][1]:
|
||||||
is_horizontal = True
|
is_horizontal = True
|
||||||
|
|
||||||
if is_horizontal:
|
if is_horizontal:
|
||||||
@ -184,13 +180,49 @@ def get_direction(segment):
|
|||||||
direction = "L"
|
direction = "L"
|
||||||
else:
|
else:
|
||||||
direction = "R"
|
direction = "R"
|
||||||
|
else:
|
||||||
|
if segment.points[0][1] > segment.points[1][1]:
|
||||||
|
direction = "D"
|
||||||
|
else:
|
||||||
|
direction = "U"
|
||||||
|
|
||||||
return is_horizontal, direction
|
return is_horizontal, direction
|
||||||
|
|
||||||
|
|
||||||
|
def get_range(segment, is_horizontal, direction):
|
||||||
|
if is_horizontal:
|
||||||
|
if direction == "L":
|
||||||
|
return range(segment.points[0][0], segment.points[1][0], -1)
|
||||||
|
else:
|
||||||
|
return range(segment.points[0][0], segment.points[1][0])
|
||||||
|
else:
|
||||||
|
if direction == "D":
|
||||||
|
return range(segment.points[0][1], segment.points[1][1], -1)
|
||||||
|
else:
|
||||||
|
return range(segment.points[0][1], segment.points[1][1])
|
||||||
|
|
||||||
|
|
||||||
def find_intersection(segment_a, segment_b, intersection_point):
|
def find_intersection(segment_a, segment_b, intersection_point):
|
||||||
horizontal_a, direction_a = get_direction(segment_a)
|
is_horizontal_a, direction_a = get_direction(segment_a)
|
||||||
horizontal_b, direction_b = get_direction(segment_b)
|
# print(is_horizontal_a, direction_a)
|
||||||
|
is_horizontal_b, direction_b = get_direction(segment_b)
|
||||||
|
# print(is_horizontal_b, direction_b)
|
||||||
|
|
||||||
|
range_a = get_range(segment_a, is_horizontal_a, direction_a)
|
||||||
|
# print(range_a)
|
||||||
|
range_b = get_range(segment_b, is_horizontal_b, direction_b)
|
||||||
|
# print(range_b)
|
||||||
|
|
||||||
|
# print(f"intersection point is {intersection_point}")
|
||||||
|
# steps = 0
|
||||||
|
for idx_a, a in enumerate(range_a):
|
||||||
|
for idx_b, b in enumerate(range_b):
|
||||||
|
# print(Point(a, b))
|
||||||
|
if Point(a, b) == intersection_point:
|
||||||
|
print(f"intersection at {a,b}")
|
||||||
|
steps = idx_a + idx_b
|
||||||
|
print(steps)
|
||||||
|
return steps
|
||||||
|
|
||||||
|
|
||||||
def part_2() -> None:
|
def part_2() -> None:
|
||||||
@ -203,14 +235,15 @@ def part_2() -> None:
|
|||||||
s2 = Segment(p3, p4)
|
s2 = Segment(p3, p4)
|
||||||
intersect = s1.intersection(s2)
|
intersect = s1.intersection(s2)
|
||||||
if intersect:
|
if intersect:
|
||||||
print(intersect)
|
# print(intersect[0])
|
||||||
# manhattan_distance = abs(intersect[0][0]) + abs(
|
# print(path_a[idx_a], path_b[idx_b])
|
||||||
# intersect[0][1]
|
until_intersection = find_intersection(s1, s2, intersect[0])
|
||||||
# )
|
# sum_of_steps = idx_a + idx_b
|
||||||
print(path_a[idx_a], path_b[idx_b])
|
steps_a = accumulate_path(wire_a, idx_a)
|
||||||
sum_of_steps = idx_a + idx_b
|
steps_b = accumulate_path(wire_b, idx_b)
|
||||||
print(sum_of_steps)
|
# print(sum_of_steps)
|
||||||
print(s2, s2.points, s2.points[0], s2.points[0][0])
|
# print(s1, s1.points, s1.points[0], s1.points[0][0])
|
||||||
|
sum_of_steps = steps_a + steps_b + until_intersection
|
||||||
if sum_of_steps < closest:
|
if sum_of_steps < closest:
|
||||||
closest = sum_of_steps
|
closest = sum_of_steps
|
||||||
# print(s1, s2)
|
# print(s1, s2)
|
||||||
@ -221,4 +254,3 @@ def part_2() -> None:
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# part_1()
|
# part_1()
|
||||||
part_2()
|
part_2()
|
||||||
>>>>>>> ef8582f ([WIP] Solution to problem 3 part 2 in Python)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user