From ca81bb3b92131466021d87be51941ccfe3471f3b Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Fri, 17 Dec 2021 13:06:03 -0600 Subject: [PATCH] 2021 Day 17 Complete --- 2021/day17/input | 1 + 2021/day17/main.go | 62 ++++++++++++++++++++++++++++++++++++++++++++ 2021/day17/testinput | 1 + helpers/helpers.go | 53 +++++++++++++++++++++++++------------ 4 files changed, 101 insertions(+), 16 deletions(-) create mode 100644 2021/day17/input create mode 100644 2021/day17/main.go create mode 100644 2021/day17/testinput diff --git a/2021/day17/input b/2021/day17/input new file mode 100644 index 0000000..ba5668c --- /dev/null +++ b/2021/day17/input @@ -0,0 +1 @@ +target area: x=277..318, y=-92..-53 diff --git a/2021/day17/main.go b/2021/day17/main.go new file mode 100644 index 0000000..0cc515a --- /dev/null +++ b/2021/day17/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "fmt" + + h "git.bullercodeworks.com/brian/adventofcode/helpers" +) + +// Target Area +var x1, y1, x2, y2 int + +func main() { + inp := h.StdinToString() + fmt.Sscanf(inp, "target area: x=%d..%d, y=%d..%d", &x1, &x2, &y1, &y2) + + var maxy int + r := make(map[h.Coordinate]bool) + b := 500 + + for x := b * -1; x < b; x++ { + for y := b * -1; y < b; y++ { + v := h.Coordinate{X: x, Y: y} + if m, ok := testForHit(h.Coordinate{}, v); ok { + if m > maxy { + maxy = m + } + r[v] = true + } + } + } + fmt.Println("Maximum Peak:", maxy) + fmt.Println("Valid Velocities:", len(r)) +} + +func testForHit(pos h.Coordinate, vel h.Coordinate) (int, bool) { + var maxy int + for { + pos.X += vel.X + pos.Y += vel.Y + if pos.Y > maxy { + maxy = pos.Y + } + if pos.X >= x1 && pos.X <= x2 && pos.Y >= y1 && pos.Y <= y2 { + return maxy, true + } + if vel.X == 0 && vel.Y < y1 { + return maxy, false + } + if vel.X > 0 { + vel.X-- + } + if vel.X < 0 { + vel.X++ + } + vel.Y-- + } +} + +type xy struct { + x int + y int +} diff --git a/2021/day17/testinput b/2021/day17/testinput new file mode 100644 index 0000000..a07e02d --- /dev/null +++ b/2021/day17/testinput @@ -0,0 +1 @@ +target area: x=20..30, y=-10..-5 diff --git a/helpers/helpers.go b/helpers/helpers.go index e97df9a..eda7a3e 100644 --- a/helpers/helpers.go +++ b/helpers/helpers.go @@ -108,6 +108,16 @@ func OptArgNumber(i int, def string) string { return def } +// StdinToString reads from stdin and returns a string +func StdinToString() string { + var input string + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + input += scanner.Text() + } + return input +} + // StdinToIntSlice reads from stdin and returns it as an int slice func StdinToIntSlice() []int { var ret []int @@ -148,16 +158,6 @@ func Itoa(i int) string { return strconv.Itoa(i) } -// StdinToString reads from stdin and returns a string -func StdinToString() string { - var input string - scanner := bufio.NewScanner(os.Stdin) - for scanner.Scan() { - input += scanner.Text() - } - return input -} - // FileToStringSlice takes a file and returns it as a slice of strings func FileToStringSlice(fn string) []string { return strings.Split(string(FileToBytes(fn)), "\n") @@ -358,16 +358,37 @@ func IsPrime(value int) bool { return value > 1 } -func Min(v1, v2 int) int { +func Min(v1, v2 int, vrest ...int) int { + min := v2 if v1 < v2 { - return v1 + min = v1 } - return v2 + for i := range vrest { + if vrest[i] < min { + min = vrest[i] + } + } + return min } -func Max(v1, v2 int) int { +func Max(v1, v2 int, vrest ...int) int { + max := v2 if v1 > v2 { - return v1 + max = v1 } - return v2 + for i := range vrest { + if vrest[i] > max { + max = vrest[i] + } + } + return max +} + +// Sum adds up all of the numbers from l to h +func Sum(l, h int) int { + var ret int + for i := Min(l, h); i <= Max(l, h); i++ { + ret = ret + i + } + return ret }