package main import ( "bufio" "fmt" "os" ) const FILE_PATH = "./input.txt" //const FILE_PATH = "./sample.txt" func LoadInput(filename string) ([]string, error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() var lines []string scanner := bufio.NewScanner(file) for scanner.Scan() { lines = append(lines, scanner.Text()) } if err := scanner.Err(); err != nil { return nil, err } return lines, nil } type structuredInput = []string func TransformInput(lines []string) structuredInput { return lines } const PART1_SEARCH_STRING = "XMAS" func SearchStringCount(input structuredInput, search_string string, s_x int, s_y int) int { var x = s_x var y = s_y var i = 0 var result = 0 var error = false for m := -1; m <= 1; m++ { for n := -1; n <= 1; n++ { if m == 0 && n == 0 { continue } x = s_x - m y = s_y - n error = false for i = 0; i < len(search_string); i++ { if y+n < 0 || y+n >= len(input) || x+m < 0 || x+m >= len(input[y+n]) { error = true break } x += m y += n if input[y][x] != search_string[i] { error = true break } } if !error { result++ } } } return result } func Part1(input structuredInput) int { var result = 0 for y := 0; y < len(input); y++ { for x := 0; x < len(input[y]); x++ { if input[y][x] == PART1_SEARCH_STRING[0] { result += SearchStringCount(input, PART1_SEARCH_STRING, x, y) } } } return result } func Part2(input structuredInput) int { var result = 0 for y := 1; y < len(input)-1; y++ { for x := 1; x < len(input[y])-1; x++ { if input[y][x] == 'A' { if input[y-1][x-1]+input[y+1][x+1] == 'M'+'S' && input[y+1][x-1]+input[y-1][x+1] == 'M'+'S' { result++ } } } } return result } func main() { input, err := LoadInput(FILE_PATH) if err != nil { fmt.Println("Error loading input:", err) return } structuredInput := TransformInput(input) fmt.Println("Structured Input:", structuredInput) fmt.Println("Solution Part 1: ", Part1(structuredInput)) fmt.Println("Solution Part 2: ", Part2(structuredInput)) }