Advent of Code Day 2 in Golang: Slicing and Dicing Reports

Edit

Published on December 02, 2024

Author: Meet Rajesh Gor

#go #aoc #advent-of-code #aoc-2024

Introduction

So, this is day 2 of the Advent of Code 2024 in Golang, and we will be exploring my approach and solution for the same. The problem was not as easy but was pretty simple after implemented and found correct.

You can check out my solutions here on GitHub.

Part 1

We have been given some lines called reports, and each report has a bunch of levels. and the requirement of the report is that it needs to be either strictly increasing or decreasing by a factor of at least 1 or at most 3.

This means if the first two elements are increasing even by one, the other subsequent elements in that report should be increasing (by 1, 2, or 3) levels, and there cannot be any change (i.e. 0 change in two adjacent numbers, or two adjacent numbers cannot be same)


plaintext
7 6 4 2 1
1 2 7 8 9
9 7 6 2 1
1 3 2 4 5
8 6 4 4 1
1 3 6 7 9

go
func SplitLevels(lines []string) [][]int {
	reportLevels := [][]int{}
	for i, reportLine := range lines {
		reportLevels = append(reportLevels, []int{})
		for _, levelStr := range strings.Split(reportLine, " ") {
			level, err := strconv.Atoi(levelStr)
			if err != nil {
				log.Fatal(err)
			}
			reportLevels[i] = append(reportLevels[i], level)
		}
	}
	return reportLevels
}

Once we have constructed the reports and levels, we move ahead in actually analyzing the patterns within the levels in the individual reports.

For that:


go
func IsSafe(report []int) (bool) {
	prevDiff := report[1] - report[0]
	isIcreasing := prevDiff > 0
	if prevDiff == 0 || prevDiff > 3 || prevDiff < -3 {
		return false
	}

	for i := 2; i < len(report); i++ {
		currDiff := report[i] - report[i-1]
		if isIcreasing {
			if currDiff <= 0 || currDiff > 3 {
				return false
			}
		} else {
			if currDiff >= 0 || currDiff < -3 {
				return false
			}
		}
	}
	return true
}

Part 2

For part two, we need to do a few things, we need to compute if the report is safe or not, and if that is unsafe, we can almost remove one element from the report to make it safe.

For that the approach is:


go
func RemoveAndCheck(report []int, index int) bool {
	if index > len(report)-1 || index < 0 {
		return false
	}
	reportNew := append([]int{}, report[:index]...)
	reportNew = append(reportNew, report[index+1:]...)
	safe, _ := IsSafe(reportNew)
	fmt.Println(safe, report)
	return safe
}

func RemoveLevels(report []int) bool {
	safe, unsafeIndex := IsSafe(report)
	if safe {
		return true
	} else {
		if RemoveAndCheck(report, unsafeIndex) {
			return true
		}
		if RemoveAndCheck(report, unsafeIndex-1) {
			return true
		}
		if RemoveAndCheck(report, unsafeIndex+1) {
			return true
		}
		return false
	}
}

You can check out my solutions here on GitHub.

Conclusion

So that was it, a pretty simple problem for day 2 of the advent of code 2024 in Golang. Hope you enjoyed this walkthrough of the day one puzzle in the Advent of Code 2024 in Golang.

Let me know if you have any other interesting solutions, or if you have anything to share about this, any feedback, questions, or suggestions are welcome.

Thank you for reading, and I will see you tomorrow for day 3

Happy Coding :)