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
 |