95 lines
1.7 KiB
Go
95 lines
1.7 KiB
Go
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
|
|
}
|