111 lines
2.0 KiB
Go
111 lines
2.0 KiB
Go
package main
|
|
|
|
type Day4Offset struct {
|
|
x int
|
|
y int
|
|
}
|
|
|
|
func Day4IsWordValid(lines []string, x int, y int, table []Day4Offset, word string) bool {
|
|
for i, offset := range table {
|
|
y := y + offset.y
|
|
if y < 0 {
|
|
return false
|
|
}
|
|
if y >= len(lines) {
|
|
return false
|
|
}
|
|
|
|
x := x + offset.x
|
|
if x < 0 {
|
|
return false
|
|
}
|
|
if x >= len(lines[y]) {
|
|
return false
|
|
}
|
|
|
|
if lines[y][x] != word[i] {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func Day4Part1(lines []string) error {
|
|
offsetTables := [][]Day4Offset{
|
|
[]Day4Offset{
|
|
Day4Offset{ x: 0, y: 0, },
|
|
Day4Offset{ x: 1, y: 0, },
|
|
Day4Offset{ x: 2, y: 0, },
|
|
Day4Offset{ x: 3, y: 0, },
|
|
},
|
|
[]Day4Offset{
|
|
Day4Offset{ x: 0, y: 0, },
|
|
Day4Offset{ x: 0, y: 1, },
|
|
Day4Offset{ x: 0, y: 2, },
|
|
Day4Offset{ x: 0, y: 3, },
|
|
},
|
|
[]Day4Offset{
|
|
Day4Offset{ x: 0, y: 0, },
|
|
Day4Offset{ x: 1, y: 1, },
|
|
Day4Offset{ x: 2, y: 2, },
|
|
Day4Offset{ x: 3, y: 3, },
|
|
},
|
|
[]Day4Offset{
|
|
Day4Offset{ x: 0, y: 0, },
|
|
Day4Offset{ x: -1, y: 1, },
|
|
Day4Offset{ x: -2, y: 2, },
|
|
Day4Offset{ x: -3, y: 3, },
|
|
},
|
|
}
|
|
|
|
answer := 0
|
|
for y := range len(lines) {
|
|
for x := range len(lines[y]) {
|
|
for _, table := range offsetTables {
|
|
if Day4IsWordValid(lines, x, y, table, "XMAS") {
|
|
answer += 1
|
|
}
|
|
|
|
if Day4IsWordValid(lines, x, y, table, "SAMX") {
|
|
answer += 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
println(answer)
|
|
|
|
return nil
|
|
}
|
|
|
|
func Day4Part2(lines []string) error {
|
|
table1 := []Day4Offset{
|
|
Day4Offset{ x: 0, y: 0, },
|
|
Day4Offset{ x: 1, y: 1, },
|
|
Day4Offset{ x: 2, y: 2, },
|
|
}
|
|
|
|
table2 := []Day4Offset{
|
|
Day4Offset{ x: 2, y: 0, },
|
|
Day4Offset{ x: 1, y: 1, },
|
|
Day4Offset{ x: 0, y: 2, },
|
|
}
|
|
|
|
answer := 0
|
|
for y := range len(lines) {
|
|
for x := range len(lines[y]) {
|
|
diagonal1 := Day4IsWordValid(lines, x, y, table1, "MAS") || Day4IsWordValid(lines, x, y, table1, "SAM")
|
|
diagonal2 := Day4IsWordValid(lines, x, y, table2, "MAS") || Day4IsWordValid(lines, x, y, table2, "SAM")
|
|
|
|
if diagonal1 && diagonal2 {
|
|
answer += 1
|
|
}
|
|
}
|
|
}
|
|
|
|
println(answer)
|
|
|
|
return nil
|
|
}
|