day22, example
This commit is contained in:
parent
3ede691333
commit
2b3c7f4ca6
|
@ -21,6 +21,7 @@ type Block struct {
|
|||
IsSettled bool
|
||||
ZHeight uint
|
||||
Supports []*Block
|
||||
SupportedBy []*Block
|
||||
}
|
||||
|
||||
func (b *Block) String() string {
|
||||
|
|
|
@ -6,5 +6,13 @@ import (
|
|||
|
||||
func Run() int {
|
||||
fmt.Print("oi, hello day 22")
|
||||
return 0
|
||||
filename := "day22/example"
|
||||
blocks := ReadBlockFile(filename)
|
||||
byZ := BlocksByZ(blocks)
|
||||
|
||||
space := NewSpace(byZ)
|
||||
space.SettleAll()
|
||||
|
||||
result := space.CountFreeBlocks()
|
||||
return result
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package day22
|
||||
|
||||
import "log"
|
||||
|
||||
type Space struct {
|
||||
MaxZ uint
|
||||
SettledOnZ [][]*Block
|
||||
|
@ -10,15 +12,44 @@ type Space struct {
|
|||
func NewSpace(blocksByZ [][]*Block) Space {
|
||||
return Space{
|
||||
UnsettledByZ: blocksByZ,
|
||||
MaxZ: uint(len(blocksByZ)),
|
||||
MaxZ: uint(len(blocksByZ) - 1),
|
||||
MaxSettledOnXY: make(map[XY]*Block),
|
||||
SettledOnZ: make([][]*Block, len(blocksByZ)),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Space)CountFreeBlocks() (result int) {
|
||||
allBlocks := make(map[*Block]any)
|
||||
|
||||
for _, row := range s.SettledOnZ {
|
||||
for _, block := range row {
|
||||
allBlocks[block] = struct{}{}
|
||||
if len(block.SupportedBy) == 1 {
|
||||
log.Printf("in block %+v. only support is %+v", block, block.SupportedBy)
|
||||
log.Printf("should be NOT OK to remove %+v", block.SupportedBy)
|
||||
delete(allBlocks, block.SupportedBy[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
result = len(allBlocks)
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Space)SettleAll() {
|
||||
for i := uint(1); i <= s.MaxZ; i++ {
|
||||
s.SettleZ(i)
|
||||
}
|
||||
}
|
||||
|
||||
// settle all blocks in Z, remove Z from UnsettledByZ
|
||||
func (s *Space)SettleZ(z uint) {
|
||||
blocksToSettle := s.UnsettledByZ[int(z)]
|
||||
|
||||
for _, block := range blocksToSettle {
|
||||
s.SettleBlock(block)
|
||||
}
|
||||
|
||||
s.UnsettledByZ[int(z)] = nil
|
||||
}
|
||||
|
||||
// for the block:
|
||||
|
@ -35,10 +66,11 @@ func (s *Space)SettleBlock(block *Block) {
|
|||
underBlock, found := s.MaxSettledOnXY[xy]
|
||||
// if block.NameNum
|
||||
if found {
|
||||
if underBlock.Z > underZMax {
|
||||
underBlockMaxZ := underBlock.Z + underBlock.ZHeight
|
||||
if underBlockMaxZ > underZMax {
|
||||
underZBlocks = []*Block{underBlock}
|
||||
underZMax = underBlock.Z
|
||||
} else if underBlock.Z == underZMax {
|
||||
underZMax = underBlockMaxZ
|
||||
} else if underBlockMaxZ == underZMax {
|
||||
underZBlocks = append(underZBlocks, underBlock)
|
||||
}
|
||||
}
|
||||
|
@ -47,6 +79,7 @@ func (s *Space)SettleBlock(block *Block) {
|
|||
|
||||
for _, settledUnderblock := range underZBlocks {
|
||||
settledUnderblock.Supports = append(settledUnderblock.Supports, block)
|
||||
block.SupportedBy = append(block.SupportedBy, settledUnderblock)
|
||||
}
|
||||
|
||||
block.Z = underZMax + 1
|
||||
|
|
|
@ -62,3 +62,26 @@ func TestSpaceSettleThirdOnTopFirst(t *testing.T) {
|
|||
// and that overlaps 1-1, 0-2 AND 0-0, 0-2
|
||||
t.Logf("other blocks should not supt %+v", block3.Supports)
|
||||
}
|
||||
|
||||
func TestSpaceExampleSettleAll(t *testing.T) {
|
||||
filename := "example"
|
||||
blocks := ReadBlockFile(filename)
|
||||
byZ := BlocksByZ(blocks)
|
||||
|
||||
space := NewSpace(byZ)
|
||||
space.SettleAll()
|
||||
|
||||
t.Logf("settled space %+v", space)
|
||||
|
||||
// maybe i can check via console.
|
||||
i := 2
|
||||
t.Logf("level %d is : %+v", i, space.SettledOnZ[i])
|
||||
// it looks ok for the example.
|
||||
// let's hope?
|
||||
|
||||
t.Logf("for example, free blocks amount is %d", space.CountFreeBlocks())
|
||||
// oh, i need 'supported'?
|
||||
// how do i need to count the task question
|
||||
// i guess we can start with set of all blocks, then?
|
||||
// run over all, if some block is only supported by some underBlock - remove that underblock
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue