Add 2021-05 in Golang
Signed-off-by: AKU <tom@tdpain.net>
This commit is contained in:
parent
8c345dee47
commit
d7abf0fe17
2 changed files with 137 additions and 1 deletions
136
challenges/2021/05-hydrothermalVenture/go/challenge.go
Normal file
136
challenges/2021/05-hydrothermalVenture/go/challenge.go
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
package challenge
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/codemicro/adventOfCode/lib/aocgo"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Point struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
func pointFromString(input string) (*Point, error) {
|
||||||
|
sp := strings.Split(input, ",")
|
||||||
|
x, err := strconv.Atoi(sp[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
y, err := strconv.Atoi(sp[1])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Point{x: x, y: y}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Line [2]*Point
|
||||||
|
|
||||||
|
func parse(instr string) ([]Line, error) {
|
||||||
|
var o []Line
|
||||||
|
for _, line := range strings.Split(strings.TrimSpace(instr), "\n") {
|
||||||
|
sp := strings.Split(line, " -> ")
|
||||||
|
p1, err := pointFromString(sp[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
p2, err := pointFromString(sp[1])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
o = append(o, Line{p1, p2})
|
||||||
|
}
|
||||||
|
return o, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDiagonalLines(lines []Line) []Line {
|
||||||
|
var n int
|
||||||
|
for _, line := range lines {
|
||||||
|
if line[0].x == line[1].x || line[0].y == line[1].y {
|
||||||
|
lines[n] = line
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines[:n]
|
||||||
|
}
|
||||||
|
|
||||||
|
func iteratePoints(line Line) chan *Point {
|
||||||
|
|
||||||
|
p1 := line[0]
|
||||||
|
p2 := line[1]
|
||||||
|
|
||||||
|
delta_x := p2.x - p1.x
|
||||||
|
delta_y := p2.y - p1.y
|
||||||
|
|
||||||
|
var xStep, yStep int
|
||||||
|
|
||||||
|
if delta_x > 0 {
|
||||||
|
xStep = 1
|
||||||
|
} else if delta_x < 0 {
|
||||||
|
xStep = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
if delta_y > 0 {
|
||||||
|
yStep = 1
|
||||||
|
} else if delta_y < 0 {
|
||||||
|
yStep = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
c := make(chan *Point)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
c <- p1
|
||||||
|
lastPoint := *p1
|
||||||
|
for lastPoint != *p2 {
|
||||||
|
np := &Point{
|
||||||
|
x: lastPoint.x + xStep,
|
||||||
|
y: lastPoint.y + yStep,
|
||||||
|
}
|
||||||
|
c <- np
|
||||||
|
lastPoint = *np
|
||||||
|
}
|
||||||
|
close(c)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func countOverlappingPoints(lines []Line) int {
|
||||||
|
areas := make(map[Point]int)
|
||||||
|
for _, line := range lines {
|
||||||
|
for point := range iteratePoints(line) {
|
||||||
|
t := *point
|
||||||
|
areas[t] = areas[t] + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var numberOverlaps int
|
||||||
|
for _, n := range areas {
|
||||||
|
if n > 1 {
|
||||||
|
numberOverlaps += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return numberOverlaps
|
||||||
|
}
|
||||||
|
|
||||||
|
type Challenge struct {
|
||||||
|
aocgo.BaseChallenge
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Challenge) One(instr string) (interface{}, error) {
|
||||||
|
lines, err := parse(instr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
lines = removeDiagonalLines(lines)
|
||||||
|
return countOverlappingPoints(lines), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Challenge) Two(instr string) (interface{}, error) {
|
||||||
|
lines, err := parse(instr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return countOverlappingPoints(lines), nil
|
||||||
|
}
|
|
@ -14,7 +14,7 @@ Solutions to the [2021 Advent of Code](https://adventofcode.com/2021).
|
||||||
| 02 - Dive! | Complete | [Python](02-dive/py), [Go](02-dive/go) | Have this set of instructions and do something sensible with it. |
|
| 02 - Dive! | Complete | [Python](02-dive/py), [Go](02-dive/go) | Have this set of instructions and do something sensible with it. |
|
||||||
| 03 - Binary Diagnostic | Complete | [Python](03-binaryDiagnostic/py), [Nim](03-binaryDiagnostic/nim) | Bit twiddling aplenty! |
|
| 03 - Binary Diagnostic | Complete | [Python](03-binaryDiagnostic/py), [Nim](03-binaryDiagnostic/nim) | Bit twiddling aplenty! |
|
||||||
| 04 - Giant Squid | Complete | [Python](04-giantSquid/py) | B-I-N-G-O, B-I-N-G-O, B-I-N-G-O and Bingo was his name-o! |
|
| 04 - Giant Squid | Complete | [Python](04-giantSquid/py) | B-I-N-G-O, B-I-N-G-O, B-I-N-G-O and Bingo was his name-o! |
|
||||||
| 05 - Hydrothermal Venture | Complete | [Python](05-hydrothermalVenture/py) | Pointy. |
|
| 05 - Hydrothermal Venture | Complete | [Python](05-hydrothermalVenture/py), [Go](05-hydrothermalVenture/go) | Pointy. |
|
||||||
|
|
||||||
<!-- PARSE END -->
|
<!-- PARSE END -->
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue