Added 2017/03
This commit is contained in:
parent
a1d66965f9
commit
931dbde893
73
2017/03/3.md
Normal file
73
2017/03/3.md
Normal file
@ -0,0 +1,73 @@
|
||||
## \-\-- Day 3: Spiral Memory \-\--
|
||||
|
||||
You come across an experimental new kind of memory stored on an
|
||||
[infinite two-dimensional
|
||||
grid]{title="Good thing we have all these infinite two-dimensional grids lying around!"}.
|
||||
|
||||
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](https://en.wikipedia.org/wiki/Taxicab_geometry) 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 answer was `371`.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: \*
|
||||
|
||||
## \-\-- Part Two \-\-- {#part2}
|
||||
|
||||
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?
|
||||
|
||||
Answer:
|
||||
|
||||
Your puzzle input is still `368078`{.puzzle-input}.
|
56
2017/03/solution.py
Normal file
56
2017/03/solution.py
Normal file
@ -0,0 +1,56 @@
|
||||
#!/bin/python3
|
||||
import sys
|
||||
from pprint import pprint
|
||||
import numpy as np
|
||||
import math
|
||||
|
||||
def manhattan_distance(a, b):
|
||||
return np.abs(a - b).sum()
|
||||
|
||||
def spiral_ccw(A):
|
||||
A = np.array(A)
|
||||
out = []
|
||||
while(A.size):
|
||||
out.append(A[0][::-1]) # first row reversed
|
||||
A = A[1:][::-1].T # cut off first row and rotate clockwise
|
||||
return np.concatenate(out)
|
||||
|
||||
def base_spiral(nrow, ncol):
|
||||
return spiral_ccw(np.arange(nrow*ncol).reshape(nrow,ncol))[::-1]
|
||||
|
||||
def to_spiral(A):
|
||||
A = np.array(A)
|
||||
B = np.empty_like(A)
|
||||
B.flat[base_spiral(*A.shape)] = A.flat
|
||||
return B
|
||||
|
||||
input_f = sys.argv[1]
|
||||
|
||||
#########################################
|
||||
# #
|
||||
# Part 1 #
|
||||
# #
|
||||
#########################################
|
||||
|
||||
number = int(input_f)
|
||||
org = number
|
||||
while not math.sqrt(number).is_integer():
|
||||
number+=1
|
||||
|
||||
mid = int((math.sqrt(number)-1)/2)
|
||||
|
||||
length = int(math.sqrt(number))
|
||||
|
||||
a = [mid, mid]
|
||||
|
||||
arr = to_spiral(np.arange(1,number+1).reshape(length,length))
|
||||
|
||||
b = np.where(arr == org)
|
||||
|
||||
print(manhattan_distance(np.array(a),np.array([b[0][0],b[1][0]])))
|
||||
|
||||
#########################################
|
||||
# #
|
||||
# Part 2 #
|
||||
# #
|
||||
#########################################
|
7
2017/03/test2
Normal file
7
2017/03/test2
Normal file
@ -0,0 +1,7 @@
|
||||
37 36 35 34 33 32 31
|
||||
38 17 16 15 14 13 30
|
||||
39 18 05 04 03 12 29
|
||||
40 19 06 01 02 11 28
|
||||
41 20 07 08 09 10 27
|
||||
42 21 22 23 24 25 26
|
||||
43 44 45 46 47 48 49
|
9
2017/03/test3
Normal file
9
2017/03/test3
Normal file
@ -0,0 +1,9 @@
|
||||
65 64 63 62 61 60 59 58 57
|
||||
66 37 36 35 34 33 32 31 56
|
||||
67 38 17 16 15 14 13 30 55
|
||||
68 39 18 05 04 03 12 29 54
|
||||
69 40 19 06 01 02 11 28 53
|
||||
70 41 20 07 08 09 10 27 52
|
||||
71 42 21 22 23 24 25 26 51
|
||||
72 43 44 45 46 47 48 49 50
|
||||
73 74 75 76 77 78 79 80 81
|
Loading…
Reference in New Issue
Block a user