2021 Day 21 Complete
This commit is contained in:
@@ -1,7 +1,112 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("vim-go")
|
||||
inp := h.StdinToStringSlice()
|
||||
scanners := parseScanners(inp)
|
||||
foundBeacons := scanners[0].beacons
|
||||
foundScannerPositions := []beacon{{0, 0, 0}}
|
||||
|
||||
remaining := scanners[1:]
|
||||
for len(remaining) > 0 {
|
||||
var wrk scanner
|
||||
wrk, remaining = remaining[0], remaining[1:]
|
||||
s := NewScanner(foundBeacons).getScannerFromOverlap(wrk)
|
||||
if s == nil {
|
||||
remaining = append(remaining, s)
|
||||
} else {
|
||||
foundBeacons = append(foundBeacons, s.beacons...)
|
||||
//foundScannerPositions = append(foundScannerPositions,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func parseScanners(inp []string) []scanner {
|
||||
var scanners []scanner
|
||||
for i := range inp {
|
||||
if strings.HasPrefix(inp[i], "---") {
|
||||
// Find the next empty line
|
||||
end := i
|
||||
for ; end < len(inp); end++ {
|
||||
if inp[end] == "" {
|
||||
break
|
||||
}
|
||||
}
|
||||
// a new scanner
|
||||
wrk, err := NewScannerFromInput(inp[i:end])
|
||||
if err == nil {
|
||||
scanners = append(scanners, wrk)
|
||||
} else {
|
||||
fmt.Println("Error parsing scanners")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
return scanners
|
||||
}
|
||||
|
||||
type scanner struct {
|
||||
number int
|
||||
region map[h.Coordinate]bool
|
||||
beacons []beacon
|
||||
}
|
||||
|
||||
func NewScanner(b []beacon) scanner {
|
||||
return scanner{beacons: b}
|
||||
}
|
||||
|
||||
func NewScannerFromInput(inp []string) (scanner, error) {
|
||||
s := scanner{}
|
||||
r := strings.NewReader(inp[0])
|
||||
_, err := fmt.Fscanf(r, "--- scanner %d ---", &s.number)
|
||||
if err != nil {
|
||||
return s, errors.New("No Scanner ID")
|
||||
}
|
||||
for _, v := range inp[1:] {
|
||||
r = strings.NewReader(v)
|
||||
b := beacon{}
|
||||
_, err := fmt.Fscanf(r, "%d,%d,%d", &b.x, &b.y, &b.z)
|
||||
if err == nil {
|
||||
s.beacons = append(s.beacons, b)
|
||||
}
|
||||
}
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (s scanner) allRotations() [][]beacon {
|
||||
var beacons [][]beacon
|
||||
for i := range s.beacons {
|
||||
beacons = append(beacons, s.beacons[i].allRotations())
|
||||
}
|
||||
return beacons
|
||||
}
|
||||
|
||||
func (s scanner) String() string {
|
||||
return fmt.Sprintf("-- Scanner %d (%d beacons)---", s.number, len(s.beacons))
|
||||
}
|
||||
|
||||
type beacon struct {
|
||||
x, y, z int
|
||||
}
|
||||
|
||||
func (b beacon) allRotations() []beacon {
|
||||
return []beacon{
|
||||
{b.x, b.y, b.z}, {b.x, -b.z, b.y}, {b.x, -b.y, -b.z}, {b.x, b.z, -b.y}, {-b.x, -b.y, b.z},
|
||||
{-b.x, -b.z, -b.y}, {-b.x, b.y, -b.z}, {-b.x, b.z, b.y}, {-b.z, b.x, -b.y}, {b.y, b.x, -b.z},
|
||||
{b.z, b.x, b.y}, {-b.y, b.x, b.z}, {b.z, -b.x, -b.y}, {b.y, -b.x, b.z}, {-b.z, -b.x, b.y},
|
||||
{-b.y, -b.x, -b.z}, {-b.y, -b.z, b.x}, {b.z, -b.y, b.x}, {b.y, b.z, b.x}, {-b.z, b.y, b.x},
|
||||
{b.z, b.y, -b.x}, {-b.y, b.z, -b.x}, {-b.z, -b.y, -b.x}, {b.y, -b.z, -b.x},
|
||||
}
|
||||
}
|
||||
|
||||
func (b beacon) String() string {
|
||||
return fmt.Sprintf("{%d,%d,%d}", b.x, b.y, b.z)
|
||||
}
|
||||
|
Reference in New Issue
Block a user