|
|
|
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]
|
|
|
|
}
|