Day 17
This commit is contained in:
parent
d7099480b7
commit
0b5f23ee88
|
@ -0,0 +1,139 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"AOC2021/src/helper"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type checkHitFunc func(int, [2]int) (bool, int)
|
||||
|
||||
type targetArea struct {
|
||||
xValues [2]int
|
||||
yValues [2]int
|
||||
}
|
||||
|
||||
func main() {
|
||||
args := os.Args[1:]
|
||||
input, err := helper.GetInput(args[0])
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
coordinateString := strings.Split(input[0], ": ")[1]
|
||||
coordinateString = helper.RemoveCharactersFromString(coordinateString, "yx=")
|
||||
coordinateStringSplit := strings.Split(coordinateString, ", ")
|
||||
xValues, _ := helper.MapToNumber(strings.Split(coordinateStringSplit[0], ".."))
|
||||
yValues, _ := helper.MapToNumber(strings.Split(coordinateStringSplit[1], ".."))
|
||||
area := targetArea{xValues: [2]int{xValues[0], xValues[1]}, yValues: [2]int{yValues[0], yValues[1]}}
|
||||
fmt.Println(area)
|
||||
hitFunctionUpward := getcheckHitFunction(changeVelocityUpward, true)
|
||||
hitFunctionForward := getcheckHitFunction(changeVelocityForward, false)
|
||||
|
||||
//Part 1
|
||||
highestY, maxHeight := getHighestPossibleVelocityWhichStillHits(area.yValues, hitFunctionUpward)
|
||||
fmt.Printf("Highest Y: %d Max Height: %d \n", highestY, maxHeight)
|
||||
|
||||
testPointsString, err := helper.GetInput("day17TestPart2Points.txt")
|
||||
var testPoints [][2]int
|
||||
for _, pointString := range testPointsString {
|
||||
testPointIntArray, _ := helper.MapToNumber(strings.Split(pointString,","))
|
||||
testPoints = append(testPoints, [2]int{testPointIntArray[0],testPointIntArray[1]})
|
||||
}
|
||||
//Part 2
|
||||
possibleYs := getAllPossibleVelocitiesWhichStillHits(area.yValues, hitFunctionUpward, highestY, yValues[0])
|
||||
possibleXs := getAllPossibleVelocitiesWhichStillHits(area.xValues, hitFunctionForward, xValues[1], 1)
|
||||
fmt.Println(possibleXs)
|
||||
fmt.Println(possibleYs)
|
||||
sum := 0
|
||||
for _, possibleY := range possibleYs {
|
||||
for _, possibleX := range possibleXs {
|
||||
if checkHitXAndY(possibleX,possibleY, &area){
|
||||
sum +=1
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(sum)
|
||||
|
||||
}
|
||||
|
||||
func getHighestPossibleVelocityWhichStillHits(target [2]int, checkHitFunc checkHitFunc) (int, int) {
|
||||
hit := true
|
||||
max := 0
|
||||
n := 1000
|
||||
for {
|
||||
hit, max = checkHitFunc(n, target)
|
||||
if hit {
|
||||
return n, max
|
||||
}
|
||||
n--
|
||||
}
|
||||
}
|
||||
|
||||
func getAllPossibleVelocitiesWhichStillHits(target [2]int, checkHitFunc checkHitFunc, highestVelocity int, lowestVelocity int) (hits []int) {
|
||||
n := highestVelocity
|
||||
for n >= lowestVelocity {
|
||||
hit, _ := checkHitFunc(n, target)
|
||||
if hit {
|
||||
hits = append(hits, n)
|
||||
}
|
||||
n--
|
||||
}
|
||||
return hits
|
||||
}
|
||||
|
||||
func getcheckHitFunction(velocityChangeFunction func(*int), lowBorder bool) checkHitFunc {
|
||||
var whileFunc func(int, [2]int, int) bool
|
||||
if lowBorder {
|
||||
whileFunc = func(n int,target [2]int, velcoity int) bool{
|
||||
return n > target[0]
|
||||
}
|
||||
}else {
|
||||
whileFunc = func(n int,target [2]int, velocity int) bool{
|
||||
return n < target[1] && velocity != 0
|
||||
}
|
||||
}
|
||||
return func(velocity int, target [2]int) (bool, int) {
|
||||
n := 0
|
||||
max := 0
|
||||
for whileFunc(n,target,velocity) {
|
||||
n += velocity
|
||||
if n > max {
|
||||
max = n
|
||||
}
|
||||
velocityChangeFunction(&velocity)
|
||||
if n >= target[0] && n <= target[1] {
|
||||
return true, max
|
||||
}
|
||||
}
|
||||
return false, max
|
||||
}
|
||||
}
|
||||
|
||||
func changeVelocityUpward(velocity *int) {
|
||||
*velocity -= 1
|
||||
}
|
||||
|
||||
func changeVelocityForward(velocity *int) {
|
||||
if *velocity > 0 {
|
||||
*velocity -= 1
|
||||
}
|
||||
if *velocity < 0 {
|
||||
*velocity += 1
|
||||
}
|
||||
}
|
||||
|
||||
func checkHitXAndY(forward int, upward int, area *targetArea) bool {
|
||||
x := 0
|
||||
y := 0
|
||||
for x <= area.xValues[1] && y >= area.yValues[0] {
|
||||
x += forward
|
||||
y += upward
|
||||
changeVelocityUpward(&upward)
|
||||
changeVelocityForward(&forward)
|
||||
if x <= area.xValues[1] && y >= area.yValues[0] && x >= area.xValues[0] && y <= area.yValues[1] {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
target area: x=128..160, y=-142..-88
|
|
@ -0,0 +1 @@
|
|||
target area: x=20..30, y=-10..-5
|
|
@ -0,0 +1,112 @@
|
|||
23,-10
|
||||
25,-9
|
||||
27,-5
|
||||
29,-6
|
||||
22,-6
|
||||
21,-7
|
||||
9,0
|
||||
27,-7
|
||||
24,-5
|
||||
25,-7
|
||||
26,-6
|
||||
25,-5
|
||||
6,8
|
||||
11,-2
|
||||
20,-5
|
||||
29,-10
|
||||
6,3
|
||||
28,-7
|
||||
8,0
|
||||
30,-6
|
||||
29,-8
|
||||
20,-10
|
||||
6,7
|
||||
6,4
|
||||
6,1
|
||||
14,-4
|
||||
21,-6
|
||||
26,-10
|
||||
7,-1
|
||||
7,7
|
||||
8,-1
|
||||
21,-9
|
||||
6,2
|
||||
20,-7
|
||||
30,-10
|
||||
14,-3
|
||||
20,-8
|
||||
13,-2
|
||||
7,3
|
||||
28,-8
|
||||
29,-9
|
||||
15,-3
|
||||
22,-5
|
||||
26,-8
|
||||
25,-8
|
||||
25,-6
|
||||
15,-4
|
||||
9,-2
|
||||
15,-2
|
||||
12,-2
|
||||
28,-9
|
||||
12,-3
|
||||
24,-6
|
||||
23,-7
|
||||
25,-10
|
||||
7,8
|
||||
11,-3
|
||||
26,-7
|
||||
7,1
|
||||
23,-9
|
||||
6,0
|
||||
22,-10
|
||||
27,-6
|
||||
8,1
|
||||
22,-8
|
||||
13,-4
|
||||
7,6
|
||||
28,-6
|
||||
11,-4
|
||||
12,-4
|
||||
26,-9
|
||||
7,4
|
||||
24,-10
|
||||
23,-8
|
||||
30,-8
|
||||
7,0
|
||||
9,-1
|
||||
10,-1
|
||||
26,-5
|
||||
22,-9
|
||||
6,5
|
||||
7,5
|
||||
23,-6
|
||||
28,-10
|
||||
10,-2
|
||||
11,-1
|
||||
20,-9
|
||||
14,-2
|
||||
29,-7
|
||||
13,-3
|
||||
23,-5
|
||||
24,-8
|
||||
27,-9
|
||||
30,-7
|
||||
28,-5
|
||||
21,-10
|
||||
7,9
|
||||
6,6
|
||||
21,-5
|
||||
27,-10
|
||||
7,2
|
||||
30,-9
|
||||
21,-8
|
||||
22,-7
|
||||
24,-9
|
||||
20,-6
|
||||
6,9
|
||||
29,-5
|
||||
8,-2
|
||||
27,-8
|
||||
30,-5
|
||||
24,-7
|
Loading…
Reference in New Issue