diff --git a/internal/2015/DayFourteen/code.go b/internal/2015/DayFourteen/code.go new file mode 100644 index 0000000..2cf17d5 --- /dev/null +++ b/internal/2015/DayFourteen/code.go @@ -0,0 +1,63 @@ +package dayfourteen + +import ( + "advent-of-code/internal/registry" + "os" + "regexp" + "strconv" + "strings" +) + +func init() { + registry.Register("2015D14", ParseInput, PartOne, PartTwo) +} + +type Reindeer struct { + Speed int + FlyTime int + RestTime int + CycleTime int +} + +func ParseInput(filepath string) []string { + content, _ := os.ReadFile(filepath) + return strings.Split(string(content), "\n") +} + +func calculateMaxDistance(data []string, time int) int { + maxDistance := 0 + pattern := regexp.MustCompile(`\w+ can fly (\d+) km/s for (\d+) seconds, but then must rest for (\d+) seconds\.`) + + for _, line := range data { + matches := pattern.FindStringSubmatch(line) + var reindeer Reindeer + reindeer.Speed, _ = strconv.Atoi(matches[1]) + reindeer.FlyTime, _ = strconv.Atoi(matches[2]) + reindeer.RestTime, _ = strconv.Atoi(matches[3]) + reindeer.CycleTime = reindeer.FlyTime + reindeer.RestTime + + fullCycles := time / reindeer.CycleTime + distance := fullCycles * reindeer.Speed * reindeer.FlyTime + + remainingTime := time % reindeer.CycleTime + if remainingTime > reindeer.FlyTime { + distance += reindeer.Speed * reindeer.FlyTime + } else { + distance += reindeer.Speed * remainingTime + } + + if distance > maxDistance { + maxDistance = distance + } + } + + return maxDistance +} + +func PartOne(data []string) int { + return calculateMaxDistance(data, 2503) +} + +func PartTwo(data []string) int { + return 0 +}