2019 Day 10 Complete
This commit is contained in:
parent
1a8a0d3099
commit
aeeab9885f
41
2019/day10/input
Normal file
41
2019/day10/input
Normal file
@ -0,0 +1,41 @@
|
||||
.#....#.###.........#..##.###.#.....##...
|
||||
...........##.......#.#...#...#..#....#..
|
||||
...#....##..##.......#..........###..#...
|
||||
....#....####......#..#.#........#.......
|
||||
...............##..#....#...##..#...#..#.
|
||||
..#....#....#..#.....#.#......#..#...#...
|
||||
.....#.#....#.#...##.........#...#.......
|
||||
#...##.#.#...#.......#....#........#.....
|
||||
....##........#....#..........#.......#..
|
||||
..##..........##.....#....#.........#....
|
||||
...#..##......#..#.#.#...#...............
|
||||
..#.##.........#...#.#.....#........#....
|
||||
#.#.#.#......#.#...##...#.........##....#
|
||||
.#....#..#.....#.#......##.##...#.......#
|
||||
..#..##.....#..#.........#...##.....#..#.
|
||||
##.#...#.#.#.#.#.#.........#..#...#.##...
|
||||
.#.....#......##..#.#..#....#....#####...
|
||||
........#...##...#.....#.......#....#.#.#
|
||||
#......#..#..#.#.#....##..#......###.....
|
||||
............#..#.#.#....#.....##..#......
|
||||
...#.#.....#..#.......#..#.#............#
|
||||
.#.#.....#..##.....#..#..............#...
|
||||
.#.#....##.....#......##..#...#......#...
|
||||
.......#..........#.###....#.#...##.#....
|
||||
.....##.#..#.....#.#.#......#...##..#.#..
|
||||
.#....#...#.#.#.......##.#.........#.#...
|
||||
##.........#............#.#......#....#..
|
||||
.#......#.............#.#......#.........
|
||||
.......#...##........#...##......#....#..
|
||||
#..#.....#.#...##.#.#......##...#.#..#...
|
||||
#....##...#.#........#..........##.......
|
||||
..#.#.....#.....###.#..#.........#......#
|
||||
......##.#...#.#..#..#.##..............#.
|
||||
.......##.#..#.#.............#..#.#......
|
||||
...#....##.##..#..#..#.....#...##.#......
|
||||
#....#..#.#....#...###...#.#.......#.....
|
||||
.#..#...#......##.#..#..#........#....#..
|
||||
..#.##.#...#......###.....#.#........##..
|
||||
#.##.###.........#...##.....#..#....#.#..
|
||||
..........#...#..##..#..##....#.........#
|
||||
..#..#....###..........##..#...#...#..#..
|
90
2019/day10/main.go
Normal file
90
2019/day10/main.go
Normal file
@ -0,0 +1,90 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
helpers "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
const MaxInt = int(^uint(0) >> 1)
|
||||
|
||||
var field []helpers.Coordinate
|
||||
|
||||
func main() {
|
||||
inp := helpers.StdinToStringSlice()
|
||||
initField(inp)
|
||||
solve()
|
||||
}
|
||||
|
||||
func initField(inp []string) {
|
||||
for y, yb := range inp {
|
||||
for x, xb := range yb {
|
||||
if xb != '#' {
|
||||
continue
|
||||
}
|
||||
field = append(field, helpers.Coordinate{X: x, Y: y})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func solve() {
|
||||
// Figure out the best place to put the station
|
||||
var bestCount int
|
||||
var best helpers.Coordinate
|
||||
var bestAngles map[float64][]helpers.Coordinate
|
||||
for _, wrk := range field {
|
||||
angles := make(map[float64][]helpers.Coordinate)
|
||||
var count int
|
||||
for _, tgt := range field {
|
||||
if wrk == tgt {
|
||||
continue
|
||||
}
|
||||
a := wrk.Angle(tgt)
|
||||
if _, ok := angles[a]; !ok {
|
||||
count++
|
||||
}
|
||||
angles[a] = append(angles[a], tgt)
|
||||
}
|
||||
if count > bestCount {
|
||||
bestCount = count
|
||||
best = wrk
|
||||
bestAngles = angles
|
||||
}
|
||||
}
|
||||
fmt.Println("Part 1:", best, bestCount)
|
||||
|
||||
var angleSlice []float64
|
||||
for k := range bestAngles {
|
||||
angleSlice = append(angleSlice, k)
|
||||
}
|
||||
sort.Float64s(angleSlice)
|
||||
// Now start vaporizing
|
||||
var hitCount int
|
||||
var c200 helpers.Coordinate
|
||||
for k := range bestAngles {
|
||||
sort.Slice(bestAngles[k], func(i, j int) bool {
|
||||
return bestAngles[k][i].Distance(best) < bestAngles[k][j].Distance(best)
|
||||
})
|
||||
}
|
||||
|
||||
for len(bestAngles) > 0 {
|
||||
for _, v := range angleSlice {
|
||||
if roids, ok := bestAngles[v]; ok {
|
||||
// Destroy the first asteroid in the list
|
||||
hitCount++
|
||||
if hitCount == 200 {
|
||||
c200 = roids[0]
|
||||
res := (c200.X*100 + c200.Y)
|
||||
fmt.Println("Part 2:", c200, res)
|
||||
return
|
||||
}
|
||||
if len(roids) > 1 {
|
||||
bestAngles[v] = roids[1:]
|
||||
} else {
|
||||
delete(bestAngles, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
5
2019/day10/testinput1
Normal file
5
2019/day10/testinput1
Normal file
@ -0,0 +1,5 @@
|
||||
.#..#
|
||||
.....
|
||||
#####
|
||||
....#
|
||||
...##
|
10
2019/day10/testinput2
Normal file
10
2019/day10/testinput2
Normal file
@ -0,0 +1,10 @@
|
||||
......#.#.
|
||||
#..#.#....
|
||||
..#######.
|
||||
.#.#.###..
|
||||
.#..#.....
|
||||
..#....#.#
|
||||
#..#....#.
|
||||
.##.#..###
|
||||
##...#..#.
|
||||
.#....####
|
10
2019/day10/testinput3
Normal file
10
2019/day10/testinput3
Normal file
@ -0,0 +1,10 @@
|
||||
#.#...#.#.
|
||||
.###....#.
|
||||
.#....#...
|
||||
##.#.#.#.#
|
||||
....#.#.#.
|
||||
.##..###.#
|
||||
..#...##..
|
||||
..##....##
|
||||
......#...
|
||||
.####.###.
|
10
2019/day10/testinput4
Normal file
10
2019/day10/testinput4
Normal file
@ -0,0 +1,10 @@
|
||||
.#..#..###
|
||||
####.###.#
|
||||
....###.#.
|
||||
..###.##.#
|
||||
##.##.#.#.
|
||||
....###..#
|
||||
..#.#..#.#
|
||||
#..#.#.###
|
||||
.##...##.#
|
||||
.....#.#..
|
20
2019/day10/testinput5
Normal file
20
2019/day10/testinput5
Normal file
@ -0,0 +1,20 @@
|
||||
.#..##.###...#######
|
||||
##.############..##.
|
||||
.#.######.########.#
|
||||
.###.#######.####.#.
|
||||
#####.##.#.##.###.##
|
||||
..#####..#.#########
|
||||
####################
|
||||
#.####....###.#.#.##
|
||||
##.#################
|
||||
#####.##.###..####..
|
||||
..######..##.#######
|
||||
####.##.####...##..#
|
||||
.#####..#.######.###
|
||||
##...#.##########...
|
||||
#.##########.#######
|
||||
.####.#.###.###.#.##
|
||||
....##.##.###..#####
|
||||
.#.#.###########.###
|
||||
#.#.#.#####.####.###
|
||||
###.##.####.##.#..##
|
37
helpers/coordinate.go
Normal file
37
helpers/coordinate.go
Normal file
@ -0,0 +1,37 @@
|
||||
package aoc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Coordinate struct {
|
||||
X, Y int
|
||||
}
|
||||
|
||||
func CoordinateFromString(str string) *Coordinate {
|
||||
c := Coordinate{}
|
||||
r := strings.NewReader(str)
|
||||
_, err := fmt.Fscanf(r, "[%d, %d]", c.X, c.Y)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &c
|
||||
}
|
||||
|
||||
func (c Coordinate) Angle(t Coordinate) float64 {
|
||||
ret := math.Atan2(float64(t.X-c.X), float64(c.Y-t.Y)) * 180 / math.Pi
|
||||
if ret < 0 {
|
||||
ret = ret + 360
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func (c Coordinate) String() string {
|
||||
return fmt.Sprintf("[%d, %d]", c.X, c.Y)
|
||||
}
|
||||
|
||||
func (c Coordinate) Distance(t Coordinate) int {
|
||||
return AbsInt(c.X-t.X) + AbsInt(c.Y-t.Y)
|
||||
}
|
@ -27,6 +27,13 @@ const (
|
||||
MIN_INT = -MAX_INT - 1
|
||||
)
|
||||
|
||||
func AbsInt(i int) int {
|
||||
if i < 0 {
|
||||
return i * -1
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
||||
func ArgIsSet(a string) bool {
|
||||
for i := range os.Args {
|
||||
if os.Args[i] == a || strings.HasPrefix(os.Args[i], a+"=") {
|
||||
|
Loading…
Reference in New Issue
Block a user