2018 Day 3 Complete. Messy, but it works
This commit is contained in:
parent
613364fcd4
commit
036ee59bf7
130
2018/day03/day03.go
Normal file
130
2018/day03/day03.go
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inp := StdinToStringSlice()
|
||||||
|
//part1(inp)
|
||||||
|
part2(inp)
|
||||||
|
}
|
||||||
|
|
||||||
|
var overlaps map[string]bool
|
||||||
|
|
||||||
|
func part1(inp []string) {
|
||||||
|
overlaps = make(map[string]bool)
|
||||||
|
var allClaims []claim
|
||||||
|
for _, v := range inp {
|
||||||
|
c := NewClaim(v)
|
||||||
|
allClaims = append(allClaims, *c)
|
||||||
|
}
|
||||||
|
for _, i := range allClaims {
|
||||||
|
for _, j := range allClaims {
|
||||||
|
if i.ID == j.ID {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
i.findOverlaps(&j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("Overlapping Spots: %d\n", len(overlaps))
|
||||||
|
}
|
||||||
|
|
||||||
|
func part2(inp []string) {
|
||||||
|
var allClaims []claim
|
||||||
|
for _, v := range inp {
|
||||||
|
c := NewClaim(v)
|
||||||
|
allClaims = append(allClaims, *c)
|
||||||
|
}
|
||||||
|
for _, i := range allClaims {
|
||||||
|
var fail bool
|
||||||
|
for _, j := range allClaims {
|
||||||
|
if i.ID == j.ID {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if i.intersects(&j) {
|
||||||
|
fail = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !fail {
|
||||||
|
fmt.Println("Doesn't overlap: " + i.ID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type claim struct {
|
||||||
|
ID string
|
||||||
|
X, Y int
|
||||||
|
Width, Height int
|
||||||
|
Spots []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewClaim(inp string) *claim {
|
||||||
|
parts := strings.Split(inp, " ")
|
||||||
|
pos := strings.Split(strings.Trim(parts[2], ":"), ",")
|
||||||
|
size := strings.Split(parts[3], "x")
|
||||||
|
x, y, w, h := Atoi(pos[0]), Atoi(pos[1]), Atoi(size[0]), Atoi(size[1])
|
||||||
|
var spots []string
|
||||||
|
for i := x; i < (x + w); i++ {
|
||||||
|
for j := y; j < (y + h); j++ {
|
||||||
|
spots = append(spots, fmt.Sprintf("%d;%d", i, j))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &claim{
|
||||||
|
ID: parts[0][1:],
|
||||||
|
X: x,
|
||||||
|
Y: y,
|
||||||
|
Width: w,
|
||||||
|
Height: h,
|
||||||
|
Spots: spots,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *claim) intersects(other *claim) bool {
|
||||||
|
for _, i := range c.Spots {
|
||||||
|
for _, j := range other.Spots {
|
||||||
|
if i == j {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *claim) findOverlaps(other *claim) bool {
|
||||||
|
var ret bool
|
||||||
|
for _, i := range c.Spots {
|
||||||
|
for _, j := range other.Spots {
|
||||||
|
if i == j {
|
||||||
|
overlaps[i] = true
|
||||||
|
ret = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func StdinToStringSlice() []string {
|
||||||
|
var input []string
|
||||||
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
for scanner.Scan() {
|
||||||
|
input = append(input, scanner.Text())
|
||||||
|
}
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
|
||||||
|
func Atoi(i string) int {
|
||||||
|
var ret int
|
||||||
|
var err error
|
||||||
|
if ret, err = strconv.Atoi(i); err != nil {
|
||||||
|
log.Fatal("Invalid Atoi")
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
1
2018/day03/go.mod
Normal file
1
2018/day03/go.mod
Normal file
@ -0,0 +1 @@
|
|||||||
|
module day03
|
1409
2018/day03/input
Normal file
1409
2018/day03/input
Normal file
File diff suppressed because it is too large
Load Diff
3
2018/day03/test-input
Normal file
3
2018/day03/test-input
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#1 @ 1,3: 4x4
|
||||||
|
#2 @ 3,1: 4x4
|
||||||
|
#3 @ 5,5: 2x2
|
Loading…
Reference in New Issue
Block a user