This commit is contained in:
Karl Spickermann 2021-12-17 18:24:42 +01:00
parent d7099480b7
commit 0b5f23ee88
4 changed files with 253 additions and 0 deletions

139
src/day17/day17.go Normal file
View File

@ -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
}

1
src/day17/day17Input.txt Normal file
View File

@ -0,0 +1 @@
target area: x=128..160, y=-142..-88

1
src/day17/day17Test.txt Normal file
View File

@ -0,0 +1 @@
target area: x=20..30, y=-10..-5

View File

@ -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