Files
2021-12-28 10:44:39 -05:00

114 lines
2.4 KiB
Go

/* Day 17: Trick Shot */
// This question is written very strange. Skipping for now
package main
import (
"AoC2021/utils/args"
"AoC2021/utils/log"
"AoC2021/utils/timer"
"bufio"
"os"
"regexp"
"strconv"
)
func check(e error) {
if e != nil {
log.Println(log.DEBUG, "Oh snap!")
panic(e)
}
}
const XMIN = 20
const XMAX = 30
const YMIN = -10
const YMAX = -5
func main() {
argMap := args.Parse(os.Args)
log.SetLogLevelFromArgs(argMap)
selectedPart, partSpecified := argMap["part"]
log.Println(log.NORMAL, "--- Day 17: Trick Shot ---")
timer.Start()
if !partSpecified || selectedPart == "" || selectedPart == "1" {
part1()
timer.Tick()
log.Println(log.NORMAL)
}
if !partSpecified || selectedPart == "" || selectedPart == "2" {
part2()
timer.Tick()
log.Println(log.NORMAL)
}
}
func part1() {
log.Println(log.NORMAL, "* Part 1 *")
log.Println(log.NORMAL, " Goal: How high can you make the probe go while still reaching the target area?")
log.Println(log.NORMAL, " Answer: What is the highest y position it reaches on this trajectory?")
x1, x2, y1, y2 := parseInputFile()
drawGrid(x1, x2, y1, y2)
log.Printf(log.NORMAL, "Read values from input. x: %d..%d, y: %d..%d\n", x1, x2, y1, y2)
log.Printf(log.NORMAL, "The solution is %d\n", 42)
}
func part2() {
log.Println(log.NORMAL, "* Part 2 *")
log.Println(log.NORMAL, " Goal: ")
log.Println(log.NORMAL, " Answer: ")
}
func parseInputFile() (int, int, int, int) {
input, err := os.Open("./input.txt")
check(err)
defer input.Close()
scanner := bufio.NewScanner(input)
if !scanner.Scan() {
panic("failed to load input data")
}
r, _ := regexp.Compile("target area: x=(-?[0-9]+)..(-?[0-9]+), y=(-?[0-9]+)..(-?[0-9]+)")
matches := r.FindStringSubmatch(scanner.Text())
if len(matches) != 5 {
panic("failed to parse input data")
}
x1, x2, y1, y2 := 0, 0, 0, 0
x1, err = strconv.Atoi(matches[1])
check(err)
x2, err = strconv.Atoi(matches[2])
check(err)
y1, err = strconv.Atoi(matches[3])
check(err)
y2, err = strconv.Atoi(matches[2])
check(err)
return x1, x2, y1, y2
}
func drawGrid(x1, x2, y1, y2 int) {
for y := y1; y <= y2; y++ {
for x := x1; x <= x2; x++ {
switch {
case x == 0 && y == 0:
log.Printf(log.NORMAL, "S")
case x >= XMIN && x <= XMAX && y >= YMIN && y <= YMAX:
log.Printf(log.NORMAL, "T")
default:
log.Printf(log.NORMAL, ".")
}
}
log.Println(log.NORMAL)
}
log.Println(log.NORMAL)
}