summaryrefslogtreecommitdiff
path: root/2024/go/src/day08
diff options
context:
space:
mode:
authoromagdy <omar.professional8777@gmail.com>2024-12-12 18:31:50 +0200
committeromagdy <omar.professional8777@gmail.com>2024-12-12 18:31:50 +0200
commit0cb12b95ef11fe283731e862e3953f27eeea8757 (patch)
tree66d54e44b821073ddf6381bf9b3d9d55b3d86c31 /2024/go/src/day08
parent93cc02c058f39d370472dfe7d667ae7a2f6396b3 (diff)
downloadaoc-0cb12b95ef11fe283731e862e3953f27eeea8757.tar.xz
aoc-0cb12b95ef11fe283731e862e3953f27eeea8757.zip
Day 11 done.
Diffstat (limited to '2024/go/src/day08')
-rw-r--r--2024/go/src/day08/main.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/2024/go/src/day08/main.go b/2024/go/src/day08/main.go
new file mode 100644
index 0000000..d3bce0c
--- /dev/null
+++ b/2024/go/src/day08/main.go
@@ -0,0 +1,139 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "strings"
+)
+
+func FileRead(path string) string {
+ file, err := os.ReadFile(path)
+ if err != nil {
+ fmt.Println("Couldn't Read file: ", err)
+ }
+ return string(file)
+
+}
+
+type Grid = [][]rune
+
+func printGrid(grid [][]rune) {
+ for _, row := range grid {
+ for _, cell := range row {
+ fmt.Print(string(cell))
+ }
+ fmt.Println()
+ }
+}
+
+func parseInput(data string) Grid {
+ lines := strings.Split(data, "\n")
+
+ var grid Grid
+
+ for _, line := range lines {
+ if len(line) > 0 {
+ runes := []rune(line)
+ grid = append(grid, runes)
+ }
+ }
+ return grid
+}
+
+func inBounds(x, y, n, m int) bool {
+ return x >= 0 && x < n && y >= 0 && y < m
+}
+
+type Point = [2]int
+type Points = [][2]int
+
+func getPosMap(grid *Grid) map[rune]Points {
+ n, m := len(*grid), len((*grid)[0])
+ antinodes := make(map[rune]Points)
+ for i := 0; i < n; i++ {
+ for j := 0; j < m; j++ {
+ curPos := Point{i, j}
+ curRune := (*grid)[i][j]
+ if curRune != '.' {
+ antinodes[curRune] = append(antinodes[curRune], curPos)
+ }
+ }
+ }
+ return antinodes
+}
+
+func isValidAntenna(grid *Grid, i, j int) bool {
+ n, m := len(*grid), len((*grid)[0])
+ if inBounds(i, j, n, m) {
+ return true
+ }
+ return false
+}
+
+func solve_part_one(data string) int {
+ grid := parseInput(data)
+ antennas := getPosMap(&grid)
+ antinodes := make(map[Point]struct{})
+ for _, val := range antennas {
+ for i := 0; i < len(val); i++ {
+ curPosI := val[i]
+ for j := i + 1; j < len(val); j++ {
+ curPosJ := val[j]
+ diffOne := [2]int{curPosI[0] - curPosJ[0], curPosI[1] - curPosJ[1]}
+ diffTwo := [2]int{curPosJ[0] - curPosI[0], curPosJ[1] - curPosI[1]}
+ firstAntennaPos := [2]int{curPosI[0] + diffOne[0], curPosI[1] + diffOne[1]}
+ secondAntennaPos := [2]int{curPosJ[0] + diffTwo[0], curPosJ[1] + diffTwo[1]}
+ if isValidAntenna(&grid, firstAntennaPos[0], firstAntennaPos[1]) {
+ antinodes[firstAntennaPos] = struct{}{}
+ }
+ if isValidAntenna(&grid, secondAntennaPos[0], secondAntennaPos[1]) {
+ antinodes[secondAntennaPos] = struct{}{}
+ }
+ }
+ }
+ }
+ return len(antinodes)
+}
+
+func solve_part_two(data string) int {
+ grid := parseInput(data)
+ antennas := getPosMap(&grid)
+ cnt := 0
+ for _, val := range antennas {
+ for i := 0; i < len(val); i++ {
+ curPosI := val[i]
+ for j := i + 1; j < len(val); j++ {
+ curPosJ := val[j]
+ diffOne := [2]int{curPosI[0] - curPosJ[0], curPosI[1] - curPosJ[1]}
+ diffTwo := [2]int{curPosJ[0] - curPosI[0], curPosJ[1] - curPosI[1]}
+ firstAntennaPos := [2]int{curPosI[0] + diffOne[0], curPosI[1] + diffOne[1]}
+ secondAntennaPos := [2]int{curPosJ[0] + diffTwo[0], curPosJ[1] + diffTwo[1]}
+ for isValidAntenna(&grid, firstAntennaPos[0], firstAntennaPos[1]) {
+ grid[firstAntennaPos[0]][firstAntennaPos[1]] = '#'
+ firstAntennaPos = [2]int{firstAntennaPos[0] + diffOne[0], firstAntennaPos[1] + diffOne[1]}
+ }
+ for isValidAntenna(&grid, secondAntennaPos[0], secondAntennaPos[1]) {
+ grid[secondAntennaPos[0]][secondAntennaPos[1]] = '#'
+ secondAntennaPos = [2]int{secondAntennaPos[0] + diffTwo[0], secondAntennaPos[1] + diffTwo[1]}
+ }
+ }
+ }
+ }
+ for i := 0; i < len(grid); i++ {
+ for j := 0; j < len(grid); j++ {
+ if grid[i][j] != '.' {
+ cnt++
+ }
+ }
+ }
+ return cnt
+}
+
+func main() {
+ test := FileRead("../input/day08.test")
+ prod := FileRead("../input/day08.prod")
+ fmt.Println("Part_1 test: ", solve_part_one(test))
+ fmt.Println("Part_1 prod: ", solve_part_one(prod))
+ fmt.Println("Part_2 test: ", solve_part_two(test))
+ fmt.Println("Part_2 prod: ", solve_part_two(prod))
+}