From 9b3cd9200ebeba744e532c43cd7dcbba2c0f400a Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Wed, 4 Dec 2024 06:57:27 +0100 Subject: Add solutions for 2024 day 4 --- 2024/04/puzzles.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 2024/04/puzzles.go (limited to '2024/04/puzzles.go') diff --git a/2024/04/puzzles.go b/2024/04/puzzles.go new file mode 100644 index 0000000..eca88a2 --- /dev/null +++ b/2024/04/puzzles.go @@ -0,0 +1,88 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" +) + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatal(err) + } + defer f.Close() + + sc := bufio.NewScanner(f) + fmt.Println(xmasCnt(parseInput(sc))) +} + +func parseInput(sc *bufio.Scanner) [][]rune { + var data [][]rune + for sc.Scan() { + row := make([]rune, 0, 140) + for _, ch := range sc.Text() { + row = append(row, ch) + } + data = append(data, row) + } + return data +} + +// START PART 1 +func xmasCnt(data [][]rune) int { + cnt := 0 + for i := range data { + for j := range data[i] { + coords := [...][8]int{ + {i, j, i+1, j, i+2, j, i+3, j}, // Vertical; top-down + {i, j, i-1, j, i-2, j, i-3, j}, // Vertical; down-top + {i, j, i, j+1, i, j+2, i, j+3}, // Horizontal; left-right + {i, j, i, j-1, i, j-2, i, j-3}, // Horizontal; left-right + {i, j, i-1, j+1, i-2, j+2, i-3, j+3}, // Diagonal; bl-tr + {i, j, i+1, j+1, i+2, j+2, i+3, j+3}, // Diagonal; tl-br + {i, j, i+1, j-1, i+2, j-2, i+3, j-3}, // Diagonal; tr-bl + {i, j, i-1, j-1, i-2, j-2, i-3, j-3}, // Diagonal; br-tl + } + for _, x := range coords { + if x[0] >= 0 && x[0] < len(data) && + x[2] >= 0 && x[2] < len(data) && + x[4] >= 0 && x[4] < len(data) && + x[6] >= 0 && x[6] < len(data) && + x[1] >= 0 && x[1] < len(data[0]) && + x[3] >= 0 && x[3] < len(data[0]) && + x[5] >= 0 && x[5] < len(data[0]) && + x[7] >= 0 && x[7] < len(data[0]) && + data[x[0]][x[1]] == 'X' && + data[x[2]][x[3]] == 'M' && + data[x[4]][x[5]] == 'A' && + data[x[6]][x[7]] == 'S' { + cnt++ + } + } + } + } + return cnt +} +// END PART 1 START PART 2 +func xmasCnt(data [][]rune) int { + cnt := 0 + for i := range data { + for j := range data[i] { + if data[i][j] != 'A' || + i == 0 || i == len(data) - 1 || + j == 0 || j == len(data[0]) - 1 { + continue + } + x1 := []rune{data[i-1][j-1], data[i+1][j+1]} + x2 := []rune{data[i+1][j-1], data[i-1][j+1]} + if (((x1[0] == 'S' && x1[1] == 'M') || (x1[0] == 'M' && x1[1] == 'S')) && + ((x2[0] == 'S' && x2[1] == 'M') || (x2[0] == 'M' && x2[1] == 'S'))) { + cnt++ + } + } + } + return cnt +} +// END PART 2 \ No newline at end of file -- cgit v1.2.3