github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2021/day5/day5.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "log" 7 "os" 8 ) 9 10 func main() { 11 var file, err = os.Open("day5.txt") 12 if err != nil { 13 log.Fatalf("failed to open file: %v\n", err) 14 } 15 defer file.Close() 16 solve(file) 17 } 18 19 type vector2 struct { 20 x, y int 21 } 22 23 type ventLine struct { 24 start, end *vector2 25 } 26 27 func (v *ventLine) isDiagonal() bool { 28 var sameHorizontal = v.start.x == v.end.x 29 var sameVertical = v.start.y == v.end.y 30 return !sameHorizontal && !sameVertical 31 } 32 33 func createVentLine(line string) *ventLine { 34 var x1, y1, x2, y2 int 35 var _, err = fmt.Sscanf(line, "%d,%d -> %d,%d", &x1, &y1, &x2, &y2) 36 if err != nil { 37 log.Fatalf(" Error: %v. Failed to parse line: %s", err, line) 38 } 39 // if x2 < x1 { 40 // var temp = x1 41 // x1 = x2 42 // x2 = temp 43 // } 44 // if y2 < y1 { 45 // var temp = y1 46 // y1 = y2 47 // y2 = temp 48 // } 49 var start, end = &vector2{x1, y1}, &vector2{x2, y2} 50 return &ventLine{start, end} 51 } 52 53 func solve(file *os.File) { 54 var buff = bufio.NewScanner(file) 55 var ventLines = []*ventLine{} 56 for buff.Scan() { 57 var line = buff.Text() 58 var ventLine = createVentLine(line) 59 ventLines = append(ventLines, ventLine) 60 } 61 var countMap = map[vector2]int{} 62 for _, v := range ventLines { 63 // if !v.isDiagonal() { 64 updateCountMapWithLine(v, countMap) 65 // } 66 } 67 var dangerCount = countDangerCoords(countMap) 68 fmt.Printf("Part 1 Solution: %d\n", dangerCount) 69 fmt.Printf("Part 2 Solution: %d\n", 0) 70 } 71 72 func updateCountMapWithLine(vl *ventLine, counts map[vector2]int) { 73 var xEnd, yEnd = false, false 74 for x, y := vl.start.x, vl.start.y; ; { 75 var v = vector2{x, y} 76 fmt.Print() 77 counts[v]++ 78 if xEnd && yEnd { 79 break 80 } 81 82 if vl.start.x < vl.end.x { 83 // increase x until finished 84 if x < vl.end.x { 85 x++ 86 if x == vl.end.x { 87 xEnd = true 88 } 89 } 90 } else if vl.start.x > vl.end.x { 91 if x > vl.end.x { 92 x-- 93 if x == vl.end.x { 94 xEnd = true 95 } 96 } 97 } else { 98 xEnd = true 99 } 100 101 if vl.start.y < vl.end.y { 102 // increase x until finished 103 if y < vl.end.y { 104 y++ 105 if y == vl.end.y { 106 yEnd = true 107 } 108 } 109 } else if vl.start.y > vl.end.y { 110 if y > vl.end.y { 111 y-- 112 if y == vl.end.y { 113 yEnd = true 114 } 115 } 116 } else { 117 yEnd = true 118 } 119 120 } 121 } 122 123 func countDangerCoords(counts map[vector2]int) int { 124 var count = 0 125 for _, v := range counts { 126 if v > 1 { 127 count++ 128 } 129 } 130 return count 131 }