Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "math"
- )
- type Point struct {
- X int
- Y int
- }
- func (p Point) String() string {
- return fmt.Sprintf("[%d,%d]", p.X, p.Y)
- }
- type Route struct {
- From Point
- To Point
- }
- func (r Route) Diagonal() bool {
- return math.Abs(float64(r.From.X)-float64(r.To.X)) == math.Abs(float64(r.From.Y)-float64(r.To.Y))
- }
- func (r Route) Draw() []Point {
- f := func(i int, j int) (min int, max int) {
- if i > j {
- return j, i
- }
- return i, j
- }
- p := make([]Point, 0)
- // horizontal
- if r.From.Y == r.To.Y {
- min, max := f(r.From.X, r.To.X) //direction doesn't matter
- for i := min; i <= max; i++ {
- p = append(p, Point{i, r.From.Y})
- }
- }
- // vertical
- if r.From.X == r.To.X {
- min, max := f(r.From.Y, r.To.Y) //direction doesn't matter
- for i := min; i <= max; i++ {
- p = append(p, Point{r.From.X, i})
- }
- }
- // diagonal
- if r.Diagonal() {
- // there are 4 cases, 4 diagonal.
- // always start from the lower x, direction doesn't matter
- // and simplify the cases to 2
- if r.From.X > r.To.X {
- r.From, r.To = r.To, r.From
- }
- for i := 0; i <= r.To.X-r.From.X; i++ {
- if r.From.Y > r.To.Y {
- p = append(p, Point{r.From.X + i, r.From.Y - i})
- } else {
- p = append(p, Point{r.From.X + i, r.From.Y + i})
- }
- }
- }
- return p
- }
- func PartOne(values []Route) int {
- m := make(map[string]int)
- for _, v := range values {
- if v.Diagonal() {
- continue
- }
- points := v.Draw()
- for _, p := range points {
- if _, ok := m[p.String()]; ok {
- m[p.String()]++
- continue
- }
- m[p.String()] = 1
- }
- }
- for k, v := range m {
- if v == 1 {
- delete(m, k)
- }
- }
- return len(m)
- }
- func PartTwo(values []Route) int {
- m := make(map[string]int)
- for _, v := range values {
- points := v.Draw()
- for _, p := range points {
- if _, ok := m[p.String()]; ok {
- m[p.String()]++
- continue
- }
- m[p.String()] = 1
- }
- }
- for k, v := range m {
- if v == 1 {
- delete(m, k)
- }
- }
- return len(m)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement