diff --git a/src/day17/day17.go b/src/day17/day17.go new file mode 100644 index 0000000..c9ae61f --- /dev/null +++ b/src/day17/day17.go @@ -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 +} \ No newline at end of file diff --git a/src/day17/day17Input.txt b/src/day17/day17Input.txt new file mode 100644 index 0000000..4d23b50 --- /dev/null +++ b/src/day17/day17Input.txt @@ -0,0 +1 @@ +target area: x=128..160, y=-142..-88 \ No newline at end of file diff --git a/src/day17/day17Test.txt b/src/day17/day17Test.txt new file mode 100644 index 0000000..f40609b --- /dev/null +++ b/src/day17/day17Test.txt @@ -0,0 +1 @@ +target area: x=20..30, y=-10..-5 \ No newline at end of file diff --git a/src/day17/day17TestPart2Points.txt b/src/day17/day17TestPart2Points.txt new file mode 100644 index 0000000..a0eb5c8 --- /dev/null +++ b/src/day17/day17TestPart2Points.txt @@ -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 \ No newline at end of file