mirror of
https://github.com/RussellChamp/advent-of-code-2021.git
synced 2026-10-28 06:02:31 +00:00
113 lines
2.4 KiB
Go
113 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)
|
||
|
|
}
|