|
|
|
|
@@ -7,12 +7,13 @@ import (
|
|
|
|
|
"slices"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
|
"sync"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func Run() int {
|
|
|
|
|
log.Println("hello day 18")
|
|
|
|
|
log.Println("problem of lagoon bgins")
|
|
|
|
|
filename := "day18/example"
|
|
|
|
|
filename := "day18/input"
|
|
|
|
|
instructions := ReadInstructionas2(filename)
|
|
|
|
|
h, w := calcHeightWidth(instructions)
|
|
|
|
|
log.Printf("read %+v instructions", instructions)
|
|
|
|
|
@@ -210,8 +211,10 @@ type Cell struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type BorderSymbol rune
|
|
|
|
|
// '' always left to right
|
|
|
|
|
const (Vertical BorderSymbol = '|'
|
|
|
|
|
|
|
|
|
|
// ” always left to right
|
|
|
|
|
const (
|
|
|
|
|
Vertical BorderSymbol = '|'
|
|
|
|
|
ToDown BorderSymbol = '7'
|
|
|
|
|
ToUp BorderSymbol = 'J'
|
|
|
|
|
FromUp BorderSymbol = 'F'
|
|
|
|
|
@@ -225,6 +228,7 @@ type Field struct {
|
|
|
|
|
MinRow, MaxRow, MinCol, MaxCol int
|
|
|
|
|
BordersFromLeft map[int]map[int]BorderSymbol
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *Field) confirmCoord(c Coord) {
|
|
|
|
|
// log.Printf("configming coord %+v", c)
|
|
|
|
|
|
|
|
|
|
@@ -337,7 +341,6 @@ func getTurnAsIfGoingFromLeft(directionFrom, directionTo Direction) []BorderSym
|
|
|
|
|
symbol = FromUp
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// panic(fmt.Sprint("got strange from %s to %s", directionFrom.String(), directionTo.String()))
|
|
|
|
|
return []BorderSymbol{symbol}
|
|
|
|
|
}
|
|
|
|
|
@@ -376,14 +379,36 @@ func (f *Field) String() string {
|
|
|
|
|
s += "\""
|
|
|
|
|
return s
|
|
|
|
|
}
|
|
|
|
|
func (f *Field) digInsides() (countInside int) {
|
|
|
|
|
func (f *Field) digInsides() (result int) {
|
|
|
|
|
lineSum := make(chan int)
|
|
|
|
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
|
rowsCount := f.MaxRow - f.MinRow
|
|
|
|
|
wg.Add(rowsCount)
|
|
|
|
|
|
|
|
|
|
done := make(chan bool)
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
wg.Wait()
|
|
|
|
|
close(lineSum)
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
for rowInternalCount := range lineSum {
|
|
|
|
|
result += rowInternalCount
|
|
|
|
|
}
|
|
|
|
|
close(done)
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
for row := f.MinRow; row < f.MaxRow; row++ {
|
|
|
|
|
go func(row int){
|
|
|
|
|
if row%10000 == 0 {
|
|
|
|
|
log.Printf("processed rows %d out of %d", row, f.MaxRow)
|
|
|
|
|
}
|
|
|
|
|
specialBorders := f.BordersFromLeft[row]
|
|
|
|
|
if len(specialBorders) == 0 {
|
|
|
|
|
continue
|
|
|
|
|
wg.Done()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
type BorderItem struct {
|
|
|
|
|
border BorderSymbol
|
|
|
|
|
@@ -431,7 +456,8 @@ func (f *Field) digInsides() (countInside int) {
|
|
|
|
|
// ToBeDug: true,
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
countInside += diff
|
|
|
|
|
lineSum <- diff
|
|
|
|
|
// countInside += diff
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if specialBorder.border == Vertical {
|
|
|
|
|
@@ -440,8 +466,14 @@ func (f *Field) digInsides() (countInside int) {
|
|
|
|
|
|
|
|
|
|
prevBorder = specialBorder
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wg.Done()
|
|
|
|
|
}(row)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
<-done
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// func (f *Field) digInsides() (countInside int) {
|
|
|
|
|
|