package adventoc2024 import ( "bufio" "io" ) type Day4 struct{} func (d Day4) Part1(r io.Reader) string { wordsearch := make([][]rune, 0) s := bufio.NewScanner(r) var sum int for s.Scan() { line := []rune(s.Text()) wordsearch = append(wordsearch, line) } search := make([]rune, 4) for startx := range wordsearch { for starty := range wordsearch[startx] { for dx := -1; dx < 2; dx++ { for dy := -1; dy < 2; dy++ { for i := 0; i < 4; i++ { x := startx + dx*i y := starty + dy*i search[i] = runeAt(wordsearch, x, y) } if string(search) == "XMAS" { sum++ } } } } } return printi(sum) } func (d Day4) Part2(r io.Reader) string { wordsearch := make([][]rune, 0) s := bufio.NewScanner(r) var sum int for s.Scan() { line := []rune(s.Text()) wordsearch = append(wordsearch, line) } s1 := make([]rune, 3) s2 := make([]rune, 3) for startx := range wordsearch { for starty := range wordsearch[startx] { toptobottom := [][]int{ {-1, -1}, {0, 0}, {1, 1}, } for i, transpose := range toptobottom { x, y := startx+transpose[0], starty+transpose[1] s1[i] = runeAt(wordsearch, x, y) } bottomtotop := [][]int{ {-1, 1}, {0, 0}, {1, -1}, } for i, transpose := range bottomtotop { x, y := startx+transpose[0], starty+transpose[1] s2[i] = runeAt(wordsearch, x, y) } if str1, str2 := string(s1), string(s2); (str1 == "SAM" || str1 == "MAS") && (str2 == "SAM" || str2 == "MAS") { sum++ } } } return printi(sum) } func runeAt(r [][]rune, x, y int) rune { if x >= len(r) || x < 0 { return rune(0) } if y >= len(r[x]) || y < 0 { return rune(0) } return r[x][y] }