aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-06 10:24:20 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-06 10:24:20 +0800
commit749020a0961903ee89db0324d37c6132b4b061dc (patch)
treea739f03564d89239e71e0b14f249d92df98f950d /src
parent8263b5724c410e5f90dcf1ec146f40c1497278a9 (diff)
downloadadvent-of-code-749020a0961903ee89db0324d37c6132b4b061dc.tar.gz
advent-of-code-749020a0961903ee89db0324d37c6132b4b061dc.zip
2017 day3 part1
Diffstat (limited to 'src')
-rw-r--r--src/2017/day3/README.md40
-rw-r--r--src/2017/day3/aoc.cpp40
-rw-r--r--src/2017/day3/aoc.h1
-rw-r--r--src/2017/day3/input1
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 @@
+