diff --git a/day22/block.go b/day22/block.go index dd8b1db..165f4ac 100644 --- a/day22/block.go +++ b/day22/block.go @@ -7,6 +7,7 @@ import ( "regexp" "strconv" "strings" + "github.com/deckarep/golang-set/v2" ) type XY struct { @@ -20,8 +21,8 @@ type Block struct { Z uint IsSettled bool ZHeight uint - Supports []*Block - SupportedBy []*Block + Supports mapset.Set[*Block] + SupportedBy mapset.Set[*Block] } func (b *Block) String() string { @@ -53,6 +54,9 @@ func ReadBlock(line string, num int) (b Block) { b.Z = uint(min(z1, z2)) b.ZHeight = uint(max(z1, z2)) - b.Z + b.Supports = mapset.NewSet[*Block]() + b.SupportedBy = mapset.NewSet[*Block]() + return } diff --git a/day22/notes.org b/day22/notes.org index 0fae979..35e9641 100644 --- a/day22/notes.org +++ b/day22/notes.org @@ -72,3 +72,5 @@ slices.SortFunc(block.SupportedBy, func(a *Block, b *Block) int { }) block.SupportedBy = slices.Compact(block.SupportedBy) #+end_src +* maybe rewrite with Set? +* should have done that from the start diff --git a/day22/sandSlabs.go b/day22/sandSlabs.go index 2476633..9daf944 100644 --- a/day22/sandSlabs.go +++ b/day22/sandSlabs.go @@ -6,7 +6,7 @@ import ( func Run() int { fmt.Print("oi, hello day 22") - filename := "day22/example" + filename := "day22/input" blocks := ReadBlockFile(filename) byZ := BlocksByZ(blocks) diff --git a/day22/space.go b/day22/space.go index c443790..6e8ce53 100644 --- a/day22/space.go +++ b/day22/space.go @@ -1,11 +1,8 @@ package day22 import ( - // "fmt" - "cmp" "log" "slices" - // "time" ) type Space struct { @@ -29,8 +26,8 @@ func (s *Space) AgainCountFreeBlocks() (result int) { for _, block := range row { thisSupports := block.Supports canDisintegrate := true - for _, blockThisSupports := range thisSupports { - if len(blockThisSupports.SupportedBy) == 1 { + for blockThisSupports := range thisSupports.Iter() { + if blockThisSupports.SupportedBy.Cardinality() == 1 { // we cannot disintigrate this block canDisintegrate = false } @@ -49,8 +46,8 @@ func (s *Space) InitialCollectGoodToDisintegrate() (result []Block) { for _, row := range s.SettledOnZ { for _, block := range row { allBlocks[block] = struct{}{} - if len(block.SupportedBy) == 1 { - onlySupport := block.SupportedBy[0] + if block.SupportedBy.Cardinality() == 1 { + onlySupport, _ := block.SupportedBy.Pop() log.Printf("in block %+v. only support is %+v", block, onlySupport) log.Printf("should be NOT OK to remove %+v", onlySupport) delete(allBlocks, onlySupport) @@ -189,8 +186,9 @@ func (s *Space) SettleBlock(block *Block) (hasMoved bool) { } for _, settledUnderblock := range underZBlocks { - settledUnderblock.Supports = append(settledUnderblock.Supports, block) - block.SupportedBy = append(block.SupportedBy, settledUnderblock) + settledUnderblock.Supports.Add(block) + block.SupportedBy.Add(settledUnderblock) + } block.Z = underZMax + 1 @@ -199,11 +197,6 @@ func (s *Space) SettleBlock(block *Block) (hasMoved bool) { s.SettledOnZ[block.Z] = append(s.SettledOnZ[block.Z], block) // fmt.Printf(">> after settring block %s. supported by %+v\n\n", block, block.SupportedBy) - slices.SortFunc(block.SupportedBy, func(a *Block, b *Block) int { - return cmp.Compare(a.NameNum, b.NameNum) - }) - block.SupportedBy = slices.Compact(block.SupportedBy) - // time.Sleep(500 * time.Millisecond) hasMoved = initialZ != block.Z // if hasMoved { diff --git a/go.mod b/go.mod index 6c21a56..9f796c3 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,10 @@ module sunshine.industries/aoc2023 go 1.21.4 -require github.com/tidwall/pinhole v0.0.0-20210130162507-d8644a7c3d19 +require ( + github.com/deckarep/golang-set/v2 v2.5.0 + github.com/tidwall/pinhole v0.0.0-20210130162507-d8644a7c3d19 +) require ( github.com/fogleman/gg v1.3.0 // indirect diff --git a/go.sum b/go.sum index f788e65..660527a 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/deckarep/golang-set/v2 v2.5.0 h1:hn6cEZtQ0h3J8kFrHR/NrzyOoTnjgW1+FmNJzQ7y/sA= +github.com/deckarep/golang-set/v2 v2.5.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=