Advent of Code Solutions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
1.7 KiB

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