177 lines
5.9 KiB
Plaintext
177 lines
5.9 KiB
Plaintext
Advent of Code
|
||
|
||
--- Day 22: Grid Computing ---
|
||
|
||
You gain access to a massive storage cluster arranged in a grid; each
|
||
storage node is only connected to the four nodes directly adjacent to it
|
||
(three if the node is on an edge, two if it's in a corner).
|
||
|
||
You can directly access data only on node /dev/grid/node-x0-y0, but you can
|
||
perform some limited actions on the other nodes:
|
||
|
||
• You can get the disk usage of all nodes (via df). The result of doing
|
||
this is in your puzzle input.
|
||
|
||
• You can instruct a node to move (not copy) all of its data to an
|
||
adjacent node (if the destination node has enough space to receive the
|
||
data). The sending node is left empty after this operation.
|
||
|
||
Nodes are named by their position: the node named node-x10-y10 is adjacent
|
||
to nodes node-x9-y10, node-x11-y10, node-x10-y9, and node-x10-y11.
|
||
|
||
Before you begin, you need to understand the arrangement of data on these
|
||
nodes. Even though you can only move data between directly connected nodes,
|
||
you're going to need to rearrange a lot of the data to get access to the
|
||
data you need. Therefore, you need to work out how you might be able to
|
||
shift data around.
|
||
|
||
To do this, you'd like to count the number of viable pairs of nodes. A
|
||
viable pair is any two nodes (A,B), regardless of whether they are directly
|
||
connected, such that:
|
||
|
||
• Node A is not empty (its Used is not zero).
|
||
|
||
• Nodes A and B are not the same node.
|
||
|
||
• The data on node A (its Used) would fit on node B (its Avail).
|
||
|
||
How many viable pairs of nodes are there?
|
||
|
||
Your puzzle answer was 955.
|
||
|
||
--- Part Two ---
|
||
|
||
Now that you have a better understanding of the grid, it's time to get to
|
||
work.
|
||
|
||
Your goal is to gain access to the data which begins in the node with y=0
|
||
and the highest x (that is, the node in the top-right corner).
|
||
|
||
For example, suppose you have the following grid:
|
||
|
||
Filesystem Size Used Avail Use%
|
||
/dev/grid/node-x0-y0 10T 8T 2T 80%
|
||
/dev/grid/node-x0-y1 11T 6T 5T 54%
|
||
/dev/grid/node-x0-y2 32T 28T 4T 87%
|
||
/dev/grid/node-x1-y0 9T 7T 2T 77%
|
||
/dev/grid/node-x1-y1 8T 0T 8T 0%
|
||
/dev/grid/node-x1-y2 11T 7T 4T 63%
|
||
/dev/grid/node-x2-y0 10T 6T 4T 60%
|
||
/dev/grid/node-x2-y1 9T 8T 1T 88%
|
||
/dev/grid/node-x2-y2 9T 6T 3T 66%
|
||
|
||
In this example, you have a storage grid 3 nodes wide and 3 nodes tall. The
|
||
node you can access directly, node-x0-y0, is almost full. The node
|
||
containing the data you want to access, node-x2-y0 (because it has y=0 and
|
||
the highest x value), contains 6 terabytes of data - enough to fit on your
|
||
node, if only you could make enough space to move it there.
|
||
|
||
Fortunately, node-x1-y1 looks like it has enough free space to enable you to
|
||
move some of this data around. In fact, it seems like all of the nodes have
|
||
enough space to hold any node's data (except node-x0-y2, which is much
|
||
larger, very full, and not moving any time soon). So, initially, the grid's
|
||
capacities and connections look like this:
|
||
|
||
( 8T/10T) -- 7T/ 9T -- [ 6T/10T]
|
||
| | |
|
||
6T/11T -- 0T/ 8T -- 8T/ 9T
|
||
| | |
|
||
28T/32T -- 7T/11T -- 6T/ 9T
|
||
|
||
The node you can access directly is in parentheses; the data you want starts
|
||
in the node marked by square brackets.
|
||
|
||
In this example, most of the nodes are interchangable: they're full enough
|
||
that no other node's data would fit, but small enough that their data could
|
||
be moved around. Let's draw these nodes as .. The exceptions are the empty
|
||
node, which we'll draw as _, and the very large, very full node, which we'll
|
||
draw as #. Let's also draw the goal data as G. Then, it looks like this:
|
||
|
||
(.) . G
|
||
. _ .
|
||
# . .
|
||
|
||
The goal is to move the data in the top right, G, to the node in
|
||
parentheses. To do this, we can issue some commands to the grid and
|
||
rearrange the data:
|
||
|
||
• Move data from node-y0-x1 to node-y1-x1, leaving node node-y0-x1 empty:
|
||
|
||
(.) _ G
|
||
. . .
|
||
# . .
|
||
|
||
• Move the goal data from node-y0-x2 to node-y0-x1:
|
||
|
||
(.) G _
|
||
. . .
|
||
# . .
|
||
|
||
• At this point, we're quite close. However, we have no deletion command,
|
||
so we have to move some more data around. So, next, we move the data from
|
||
node-y1-x2 to node-y0-x2:
|
||
|
||
(.) G .
|
||
. . _
|
||
# . .
|
||
|
||
• Move the data from node-y1-x1 to node-y1-x2:
|
||
|
||
(.) G .
|
||
. _ .
|
||
# . .
|
||
|
||
• Move the data from node-y1-x0 to node-y1-x1:
|
||
|
||
(.) G .
|
||
_ . .
|
||
# . .
|
||
|
||
• Next, we can free up space on our node by moving the data from
|
||
node-y0-x0 to node-y1-x0:
|
||
|
||
(_) G .
|
||
. . .
|
||
# . .
|
||
|
||
• Finally, we can access the goal data by moving the it from node-y0-x1 to
|
||
node-y0-x0:
|
||
|
||
(G) _ .
|
||
. . .
|
||
# . .
|
||
|
||
So, after 7 steps, we've accessed the data we want. Unfortunately, each of
|
||
these moves takes time, and we need to be efficient:
|
||
|
||
What is the fewest number of steps required to move your goal data to
|
||
node-x0-y0?
|
||
|
||
Your puzzle answer was 246.
|
||
|
||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||
|
||
At this point, all that is left is for you to admire your advent calendar.
|
||
|
||
If you still want to see it, you can get your puzzle input.
|
||
|
||
References
|
||
|
||
Visible links
|
||
. http://adventofcode.com/
|
||
. http://adventofcode.com/2016/about
|
||
. http://adventofcode.com/2016/support
|
||
. http://adventofcode.com/2016/events
|
||
. http://adventofcode.com/2016/settings
|
||
. http://adventofcode.com/2016/auth/logout
|
||
. http://adventofcode.com/2016
|
||
. http://adventofcode.com/2016
|
||
. http://adventofcode.com/2016/leaderboard
|
||
. http://adventofcode.com/2016/stats
|
||
. http://adventofcode.com/2016/sponsors
|
||
. http://adventofcode.com/2016/sponsors
|
||
. https://en.wikipedia.org/wiki/Df_(Unix)#Example
|
||
. https://en.wikipedia.org/wiki/Terabyte
|
||
. http://adventofcode.com/2016
|
||
. http://adventofcode.com/2016/day/22/input
|