diff options
Diffstat (limited to '2024/04/puzzles.go')
| -rw-r--r-- | 2024/04/puzzles.go | 88 | 
1 files changed, 88 insertions, 0 deletions
| diff --git a/2024/04/puzzles.go b/2024/04/puzzles.go new file mode 100644 index 0000000..eca88a2 --- /dev/null +++ b/2024/04/puzzles.go @@ -0,0 +1,88 @@ +package main + +import ( +	"bufio" +	"fmt" +	"log" +	"os" +) + +func main() { +	f, err := os.Open("input") +	if err != nil { +		log.Fatal(err) +	} +	defer f.Close() + +	sc := bufio.NewScanner(f) +	fmt.Println(xmasCnt(parseInput(sc))) +} + +func parseInput(sc *bufio.Scanner) [][]rune { +	var data [][]rune +	for sc.Scan() { +		row := make([]rune, 0, 140) +		for _, ch := range sc.Text() { +			row = append(row, ch) +		} +		data = append(data, row) +	} +	return data +} + +// START PART 1 +func xmasCnt(data [][]rune) int { +	cnt := 0 +	for i := range data { +		for j := range data[i] { +			coords := [...][8]int{ +				{i, j, i+1, j, i+2, j, i+3, j},       // Vertical;   top-down +				{i, j, i-1, j, i-2, j, i-3, j},       // Vertical;   down-top +				{i, j, i, j+1, i, j+2, i, j+3},       // Horizontal; left-right +				{i, j, i, j-1, i, j-2, i, j-3},       // Horizontal; left-right +				{i, j, i-1, j+1, i-2, j+2, i-3, j+3}, // Diagonal; bl-tr +				{i, j, i+1, j+1, i+2, j+2, i+3, j+3}, // Diagonal; tl-br +				{i, j, i+1, j-1, i+2, j-2, i+3, j-3}, // Diagonal; tr-bl +				{i, j, i-1, j-1, i-2, j-2, i-3, j-3}, // Diagonal; br-tl +			} +			for _, x := range coords { +				if x[0] >= 0 && x[0] < len(data) && +				x[2] >= 0 && x[2] < len(data) && +				x[4] >= 0 && x[4] < len(data) && +				x[6] >= 0 && x[6] < len(data) && +				x[1] >= 0 && x[1] < len(data[0]) && +				x[3] >= 0 && x[3] < len(data[0]) && +				x[5] >= 0 && x[5] < len(data[0]) && +				x[7] >= 0 && x[7] < len(data[0]) && +				data[x[0]][x[1]] == 'X' && +				data[x[2]][x[3]] == 'M' && +				data[x[4]][x[5]] == 'A' && +				data[x[6]][x[7]] == 'S' { +					cnt++ +				} +			} +		} +	} +	return cnt +} +// END PART 1 START PART 2 +func xmasCnt(data [][]rune) int { +	cnt := 0 +	for i := range data { +		for j := range data[i] { +			if data[i][j] != 'A' || +			i == 0 || i == len(data) - 1 || +			j == 0 || j == len(data[0]) - 1 { +				continue +			} +			x1 := []rune{data[i-1][j-1], data[i+1][j+1]} +			x2 := []rune{data[i+1][j-1], data[i-1][j+1]} +			if (((x1[0] == 'S' && x1[1] == 'M') || (x1[0] == 'M' && x1[1] == 'S')) && +			    ((x2[0] == 'S' && x2[1] == 'M') || (x2[0] == 'M' && x2[1] == 'S'))) { +				cnt++ +			} +		} +	} +	return cnt +} +// END PART 2
\ No newline at end of file |