From 771d4adb80fb27dd6ee633af9c4ad3887a74922e Mon Sep 17 00:00:00 2001 From: Jake Charman Date: Mon, 8 Dec 2025 15:05:15 +0000 Subject: [PATCH] 2025 Day 4 --- 2025/Day-04/day04.go | 101 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 2025/Day-04/day04.go diff --git a/2025/Day-04/day04.go b/2025/Day-04/day04.go new file mode 100644 index 0000000..52da36e --- /dev/null +++ b/2025/Day-04/day04.go @@ -0,0 +1,101 @@ +package main + +import ( + "fmt" + "os" + "strings" +) + +func readFile(f string) [][]string { + file, err := os.ReadFile(f) + if err != nil { + panic(err) + } + ret := [][]string{} + for _, line := range strings.Split(string(file), "\n") { + ret = append(ret, strings.Split(line, "")) + } + return ret +} + + +func lookAround(l [][]string, y int, x int) int { + yToCheck := []int{(y-1), y, (y+1)} + xToCheck := []int{(x-1), x, (x+1)} + numNearby := 0 + for _, curY := range yToCheck { + if curY < 0 || curY > (len(l)-1) { + continue + } + for _, curX := range xToCheck { + if curX < 0 || curX > (len(l[curY])-1) { + continue + } + if curX == x && curY == y { + continue + } + if l[curY][curX] == "@" { + numNearby++ + } + } + } + return numNearby +} + +func removeRolls (l [][]string, toRemove [][]int) [][]string { + for _, r := range toRemove { + l[r[0]][r[1]] = "x" + } + return l +} + +func runForklift (l [][]string) (int,[][]string) { + rollsToRemove := [][]int{} + numReachable := 0 + for y := range l { + for x := range l[y] { + if l[y][x] != "@"{ + continue + } else if lookAround(l, y, x) < 4 { + numReachable++ + rollsToRemove = append(rollsToRemove, []int{y,x}) + } + } + } + return numReachable, removeRolls(l, rollsToRemove) +} + +func partOne() (int) { + input := readFile("input.txt") + numReachable := 0 + for y := range input { + for x := range input[y] { + if input[y][x] == "."{ + continue + } else if lookAround(input, y, x) < 4 { + numReachable++ + } + } + } + return numReachable +} + +func partTwo() int { + input := readFile("input.txt") + num := 0 + numReachable := -1 + for numReachable != 0 { + if numReachable != -1 { + num += numReachable + } + numReachable = 0 + numReachable, input = runForklift(input) + } + num += numReachable + return num +} + +func main() { + fmt.Println(partOne()) + fmt.Println(partTwo()) +}