diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/2017/day3/README.md | 40 | ||||
-rw-r--r-- | src/2017/day3/aoc.cpp | 40 | ||||
-rw-r--r-- | src/2017/day3/aoc.h | 1 | ||||
-rw-r--r-- | src/2017/day3/input | 1 |
4 files changed, 82 insertions, 0 deletions
diff --git a/src/2017/day3/README.md b/src/2017/day3/README.md index e69de29..fcf7558 100644 --- a/src/2017/day3/README.md +++ b/src/2017/day3/README.md @@ -0,0 +1,40 @@ +--- Day 3: Spiral Memory --- +You come across an experimental new kind of memory stored on an infinite two-dimensional grid. + +Each square on the grid is allocated in a spiral pattern starting at a location marked 1 and then counting up while spiraling outward. For example, the first few squares are allocated like this: + +17 16 15 14 13 +18 5 4 3 12 +19 6 1 2 11 +20 7 8 9 10 +21 22 23---> ... +While this is very space-efficient (no squares are skipped), requested data must be carried back to square 1 (the location of the only access port for this memory system) by programs that can only move up, down, left, or right. They always take the shortest path: the Manhattan Distance between the location of the data and square 1. + +For example: + +Data from square 1 is carried 0 steps, since it's at the access port. +Data from square 12 is carried 3 steps, such as: down, left, left. +Data from square 23 is carried only 2 steps: up twice. +Data from square 1024 must be carried 31 steps. +How many steps are required to carry the data from the square identified in your puzzle input all the way to the access port? + +Your puzzle input is 312051. + +--- Part Two --- +As a stress test on the system, the programs here clear the grid and then store the value 1 in square 1. Then, in the same allocation order as shown above, they store the sum of the values in all adjacent squares, including diagonals. + +So, the first few squares' values are chosen as follows: + +Square 1 starts with the value 1. +Square 2 has only one adjacent filled square (with value 1), so it also stores 1. +Square 3 has both of the above squares as neighbors and stores the sum of their values, 2. +Square 4 has all three of the aforementioned squares as neighbors and stores the sum of their values, 4. +Square 5 only has the first and fourth squares as neighbors, so it gets the value 5. +Once a square is written, its value does not change. Therefore, the first few squares would receive the following values: + +147 142 133 122 59 +304 5 4 2 57 +330 10 1 1 54 +351 11 23 25 26 +362 747 806---> ... +What is the first value written that is larger than your puzzle input? diff --git a/src/2017/day3/aoc.cpp b/src/2017/day3/aoc.cpp index ed2d9d3..85c2aa4 100644 --- a/src/2017/day3/aoc.cpp +++ b/src/2017/day3/aoc.cpp @@ -1,5 +1,45 @@ #include "aoc.h" +#include <math.h> namespace aoc2017 { +std::pair<int, int> circle(int t) { + int i = 1; + int j = 0; + while ((i * i) < t) { + i += 2; + j += 1; + } + return {j, i}; } + +void middles(int i, int m[]) { + int x = i * i; + for (int a : {0, 1, 2, 3}) { + int n = x - i + 1; + m[a] = (n + x) / 2; + x = n; + } +} + +int closest(int t, int m[]) { + int min{INT32_MAX}; + for (int a : {0, 1, 2, 3}) { + int d = std::abs(t - m[a]); + if (d < min) { + min = d; + } + } + return min; +} + +int day3(int target) { + auto p = circle(target); + int ms[4] = {0}; + middles(p.second, ms); + // printf("%d -> %d %d %d %d\n", target, ms[0], ms[1], ms[2], ms[3]); + int d = closest(target, ms); + return d + p.first; +} + +} // namespace aoc2017 diff --git a/src/2017/day3/aoc.h b/src/2017/day3/aoc.h index 7aacc4c..be3159d 100644 --- a/src/2017/day3/aoc.h +++ b/src/2017/day3/aoc.h @@ -3,4 +3,5 @@ namespace aoc2017 { +int day3(int); } diff --git a/src/2017/day3/input b/src/2017/day3/input index e69de29..8b13789 100644 --- a/src/2017/day3/input +++ b/src/2017/day3/input @@ -0,0 +1 @@ + |