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  }