day22, rewrite with Set

This commit is contained in:
efim 2023-12-22 13:01:58 +00:00
parent 29528f23ac
commit c3acf211c3
6 changed files with 22 additions and 18 deletions

View File

@ -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
}

View File

@ -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

View File

@ -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)

View File

@ -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 {

5
go.mod
View File

@ -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

2
go.sum
View File

@ -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=