Forgot a file
This commit is contained in:
parent
c40e8ce7bb
commit
069d03004d
94
2020/day20/tile.go
Normal file
94
2020/day20/tile.go
Normal file
@ -0,0 +1,94 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
type Tile struct {
|
||||
Num int
|
||||
Data [][]bool
|
||||
Neighbors map[h.Coordinate]*Tile
|
||||
}
|
||||
|
||||
func NewTile(num int, lines []string) *Tile {
|
||||
t := Tile{
|
||||
Num: num,
|
||||
Neighbors: make(map[h.Coordinate]*Tile),
|
||||
}
|
||||
for y := range lines {
|
||||
var lineData []bool
|
||||
for x := range lines[y] {
|
||||
lineData = append(lineData, lines[y][x] == '#')
|
||||
}
|
||||
t.Data = append(t.Data, lineData)
|
||||
}
|
||||
return &t
|
||||
}
|
||||
|
||||
func (t *Tile) Rotate() {
|
||||
t.Data = RotateMap(t.Data)
|
||||
}
|
||||
|
||||
func (t *Tile) Flip() {
|
||||
t.Data = FlipMap(t.Data)
|
||||
}
|
||||
|
||||
func (t *Tile) IsEastNeighbor(wrk *Tile) bool {
|
||||
size := len(t.Data)
|
||||
for y := range t.Data {
|
||||
if t.Data[y][size-1] != wrk.Data[y][0] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (t *Tile) IsSouthNeighbor(wrk *Tile) bool {
|
||||
size := len(t.Data)
|
||||
for x := range t.Data[size-1] {
|
||||
if t.Data[size-1][x] != wrk.Data[0][x] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (t *Tile) IsNeighbor(wrk *Tile, canChange bool) bool {
|
||||
for _, c := range []h.Coordinate{N, E, S, W} {
|
||||
if _, ok := t.Neighbors[c]; ok {
|
||||
continue
|
||||
}
|
||||
for i := 0; i < 8; i++ {
|
||||
if c == E && t.IsEastNeighbor(wrk) {
|
||||
t.Neighbors[E] = wrk
|
||||
wrk.Neighbors[W] = t
|
||||
return true
|
||||
}
|
||||
if c == W && wrk.IsEastNeighbor(t) {
|
||||
t.Neighbors[W] = wrk
|
||||
wrk.Neighbors[E] = t
|
||||
return true
|
||||
}
|
||||
if c == S && t.IsSouthNeighbor(wrk) {
|
||||
t.Neighbors[S] = wrk
|
||||
wrk.Neighbors[N] = t
|
||||
return true
|
||||
}
|
||||
if c == N && wrk.IsSouthNeighbor(t) {
|
||||
t.Neighbors[N] = wrk
|
||||
wrk.Neighbors[S] = t
|
||||
return true
|
||||
}
|
||||
if !canChange {
|
||||
break
|
||||
}
|
||||
if i&1 == 0 {
|
||||
wrk.Flip()
|
||||
} else {
|
||||
wrk.Flip()
|
||||
wrk.Rotate()
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
Loading…
Reference in New Issue
Block a user