From 0cb12b95ef11fe283731e862e3953f27eeea8757 Mon Sep 17 00:00:00 2001 From: omagdy Date: Thu, 12 Dec 2024 18:31:50 +0200 Subject: Day 11 done. --- 2024/go/src/day08/main.go | 139 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 2024/go/src/day08/main.go (limited to '2024/go/src/day08/main.go') 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)) +} -- cgit v1.2.3