package main import ( "fmt" "os" "strings" ) type coord struct { x int y int } func check(e error) { if e != nil { panic(e) } } func generateMap(lines [][]byte) map[byte][]coord { output := make(map[byte][]coord) for y, line := range lines { for x, char := range line { if char == 46 { continue } new_coord := coord{x: x, y: y} output[char] = append(output[char], new_coord) } } return output } func parseInput() [][]byte { raw_data, err := os.ReadFile("input.txt") check(err) data := string(raw_data[:]) lines := strings.Split(data, "\n") output := make([][]byte, len(lines)-1) for n, line := range lines { if len(line) > 0 { output[n] = []byte(line) } } return output } func part1(input [][]byte, charmap map[byte][]coord) { counter := 0 for _, coords := range charmap { for n1, coord1 := range coords { for n2, coord2 := range coords { if n1 == n2 { continue } newY := coord1.y + (coord1.y - coord2.y) newX := coord1.x + (coord1.x - coord2.x) if newY < 0 || newY >= len(input) { continue } if newX < 0 || newX >= len(input[0]) { continue } if input[newY][newX] != '#' { input[newY][newX] = '#' counter += 1 } } } } // for _, line := range input { // for _, char := range line { // fmt.Print(string(char), " ") // } // fmt.Println() // } fmt.Println(counter) } func main() { input := parseInput() things := generateMap(input) fmt.Println("Part 1:") part1(input, things) }