Add description for day 15
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -4,6 +4,27 @@ from heapq import heappush, heappop
|
|||||||
|
|
||||||
|
|
||||||
def part_1(input):
|
def part_1(input):
|
||||||
|
"""The solution for Part 1 is an implementation of dijkstra algorithm. The input data is stored
|
||||||
|
in a dictionary 'nodes' where the keys are a tuple of the coordinates and the value is the cost
|
||||||
|
(risk level) to travel to this node.
|
||||||
|
The total cost for each node will be stored in a dictionary named 'cost'. We start with a queue,
|
||||||
|
that will contain all the nodes we have to check. Initially there is only the starting node
|
||||||
|
known. The queue also contains the cost for each node to be able to prioritize them in an heapq.
|
||||||
|
The 'done' set is used to remember the already processed nodes.
|
||||||
|
In each iteration we take the node with lowest cost known so far from the queue and set it as
|
||||||
|
the active node. If this node is already stored in 'done' we can skip it and start the next
|
||||||
|
iteration immediately. Nodes can be pushed to the queue multiple times but we only need to
|
||||||
|
process them once, hence we always use the node with the lowest cost from the queue.
|
||||||
|
If the node hasn't been processed yet we check all of its four neighbors if they have been
|
||||||
|
processed. If not we calculate the total cost for this node by adding the risk level to the cost
|
||||||
|
of the active node. The total cost will then be compared to the current known cost for this new
|
||||||
|
node. If it is lower or not yet existing the cost will be updated in the 'cost' dictionary and
|
||||||
|
the new node will be pushed to the queue. At this point we could also push the active node to a
|
||||||
|
dictionary containing the previous node for each node to be able to construct the path. But
|
||||||
|
since only the cost is asked we don't store this information.
|
||||||
|
Finally the active node will be pushed to the 'done' set and start the next iteration if there
|
||||||
|
are elements in the queue.
|
||||||
|
"""
|
||||||
result = 0
|
result = 0
|
||||||
x_size = len(input[0].strip())
|
x_size = len(input[0].strip())
|
||||||
y_size = len(input)
|
y_size = len(input)
|
||||||
@@ -36,6 +57,11 @@ def part_1(input):
|
|||||||
|
|
||||||
|
|
||||||
def part_2(input):
|
def part_2(input):
|
||||||
|
"""The part 2 solution is essentially the same as the solution for part 1. The only difference
|
||||||
|
is that the grid now repeats itself five times to the the right and downwards. The grid itself
|
||||||
|
is only stored once and the new boundaries and costs for new nodes are calculated on the fly
|
||||||
|
while the iteration across the nodes happen.
|
||||||
|
"""
|
||||||
result = 0
|
result = 0
|
||||||
x_size = len(input[0].strip())
|
x_size = len(input[0].strip())
|
||||||
y_size = len(input)
|
y_size = len(input)
|
||||||
|
|||||||
Reference in New Issue
Block a user