2017 Day 03 Complete!
This commit is contained in:
parent
dc2725defe
commit
e075f2bc44
1
2017/day03/input
Normal file
1
2017/day03/input
Normal file
@ -0,0 +1 @@
|
||||
312051
|
129
2017/day03/main.go
Normal file
129
2017/day03/main.go
Normal file
@ -0,0 +1,129 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println("Usage: day03 <target>")
|
||||
os.Exit(0)
|
||||
}
|
||||
target := Atoi(os.Args[1])
|
||||
fmt.Println("== Part 1 ==")
|
||||
part1(target)
|
||||
fmt.Println("== Part 2 ==")
|
||||
part2(target)
|
||||
}
|
||||
|
||||
func part1(target int) {
|
||||
idx := 1
|
||||
lyrSz := 1
|
||||
sizeSquare := int(math.Pow(float64(lyrSz), 2))
|
||||
for sizeSquare < target {
|
||||
lyrSz += 2
|
||||
idx += 1
|
||||
sizeSquare = int(math.Pow(float64(lyrSz), 2))
|
||||
}
|
||||
diff := sizeSquare - target
|
||||
lyrJmp := lyrSz - 1
|
||||
// Find the side it's on
|
||||
side := int(diff / lyrJmp)
|
||||
perps := make([]int, 4)
|
||||
perps[0] = sizeSquare - (lyrJmp / 2)
|
||||
perps[1] = perps[0] - lyrJmp
|
||||
perps[2] = perps[1] - lyrJmp
|
||||
perps[3] = perps[2] - lyrJmp
|
||||
fmt.Println("Distance: ", int(math.Abs(float64(perps[side]-target)))+(idx-1))
|
||||
}
|
||||
|
||||
const (
|
||||
DIR_E = iota
|
||||
DIR_N
|
||||
DIR_W
|
||||
DIR_S
|
||||
DIR_ERROR
|
||||
)
|
||||
|
||||
var memMap map[string]int
|
||||
var lastX, lastY int
|
||||
var lastDir int
|
||||
|
||||
func part2(target int) {
|
||||
lastDir = DIR_S
|
||||
lastX, lastY = 0, 0
|
||||
|
||||
val := 1
|
||||
memMap = make(map[string]int)
|
||||
memMap[getMapKey(lastX, lastY)] = val
|
||||
for val <= target {
|
||||
// Find the coordinate for the next one
|
||||
lastX, lastY, lastDir = findNextMapPos()
|
||||
val = getAdjacentSum(lastX, lastY)
|
||||
memMap[getMapKey(lastX, lastY)] = val
|
||||
}
|
||||
fmt.Println("Result:", val, "at", getMapKey(lastX, lastY))
|
||||
}
|
||||
|
||||
func getAdjacentSum(posX, posY int) int {
|
||||
res := 0
|
||||
for _, x := range []int{-1, 0, 1} {
|
||||
for _, y := range []int{-1, 0, 1} {
|
||||
if x == 0 && y == 0 {
|
||||
continue
|
||||
}
|
||||
if i, ok := memMap[getMapKey((posX+x), (posY+y))]; ok {
|
||||
res += i
|
||||
}
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func findNextMapPos() (int, int, int) {
|
||||
// First check if the current pos is empty
|
||||
if _, ok := memMap[getMapKey(lastX, lastY)]; !ok {
|
||||
return lastX, lastY, lastDir
|
||||
}
|
||||
// Check if the wrapping direction is free
|
||||
nextDir := (lastDir + 1) % DIR_ERROR
|
||||
testX, testY := getXYInDir(nextDir)
|
||||
if _, ok := memMap[getMapKey(testX, testY)]; ok {
|
||||
testX, testY = getXYInDir(lastDir)
|
||||
nextDir = lastDir
|
||||
}
|
||||
// Otherwise continue in lastDir
|
||||
return testX, testY, nextDir
|
||||
}
|
||||
|
||||
func getXYInDir(dir int) (int, int) {
|
||||
testX, testY := lastX, lastY
|
||||
switch dir {
|
||||
case DIR_E:
|
||||
testX++
|
||||
case DIR_N:
|
||||
testY--
|
||||
case DIR_W:
|
||||
testX--
|
||||
case DIR_S:
|
||||
testY++
|
||||
}
|
||||
return testX, testY
|
||||
}
|
||||
|
||||
func getMapKey(xPos, yPos int) string {
|
||||
return fmt.Sprintf("%d;%d", xPos, yPos)
|
||||
}
|
||||
|
||||
func Atoi(i string) int {
|
||||
var ret int
|
||||
var err error
|
||||
if ret, err = strconv.Atoi(i); err != nil {
|
||||
log.Fatal("Invalid Atoi")
|
||||
}
|
||||
return ret
|
||||
}
|
91
2017/day03/problem
Normal file
91
2017/day03/problem
Normal file
@ -0,0 +1,91 @@
|
||||
Advent of Code
|
||||
|
||||
--- 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 answer was ____.
|
||||
|
||||
--- 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?
|
||||
|
||||
Your puzzle answer was _______.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||
|
||||
At this point, you should return to your advent calendar and try another
|
||||
puzzle.
|
||||
|
||||
Your puzzle input was 312051.
|
||||
|
||||
References
|
||||
|
||||
Visible links
|
||||
. http://adventofcode.com/
|
||||
. http://adventofcode.com/2017/about
|
||||
. http://adventofcode.com/2017/support
|
||||
. http://adventofcode.com/2017/events
|
||||
. http://adventofcode.com/2017/settings
|
||||
. http://adventofcode.com/2017/auth/logout
|
||||
. http://adventofcode.com/2017
|
||||
. http://adventofcode.com/2017
|
||||
. http://adventofcode.com/2017/leaderboard
|
||||
. http://adventofcode.com/2017/stats
|
||||
. http://adventofcode.com/2017/sponsors
|
||||
. http://adventofcode.com/2017/sponsors
|
||||
. https://en.wikipedia.org/wiki/Taxicab_geometry
|
||||
. http://adventofcode.com/2017
|
Loading…
Reference in New Issue
Block a user