day15, example two
This commit is contained in:
parent
bd45c334b0
commit
6e623b617e
|
@ -2,13 +2,18 @@ package day15
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"slices"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Run() int {
|
func Run() int {
|
||||||
fmt.Println("hello day 15")
|
fmt.Println("hello day 15")
|
||||||
filename := "day15/input"
|
log.Println("hello day 15")
|
||||||
|
filename := "day15/example"
|
||||||
bytes, err := os.ReadFile(filename)
|
bytes, err := os.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprint("error reading file ", filename))
|
panic(fmt.Sprint("error reading file ", filename))
|
||||||
|
@ -19,9 +24,116 @@ func Run() int {
|
||||||
|
|
||||||
result := 0
|
result := 0
|
||||||
|
|
||||||
for _, instruction := range instructions {
|
boxes := make([]Box, 256)
|
||||||
result += ASCIIStringHash(instruction)
|
for i, box := range boxes {
|
||||||
|
box.Focals = make(map[string]int)
|
||||||
|
boxes[i] = box
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, instructionStr := range instructions {
|
||||||
|
i := ReadInstruction(instructionStr)
|
||||||
|
box := boxes[i.Box]
|
||||||
|
box.Act(i)
|
||||||
|
boxes[i.Box] = box
|
||||||
|
|
||||||
|
// result += ASCIIStringHash(instruction)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, box := range boxes {
|
||||||
|
if len(box.Labels) != 0 {
|
||||||
|
log.Printf("%d box %+v final state\n", i, box)
|
||||||
|
}
|
||||||
|
result += (i + 1) * box.FocusingPower()
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
type Box struct {
|
||||||
|
Labels []string
|
||||||
|
Focals map[string]int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Box)Act(i Instruction) {
|
||||||
|
log.Printf("for box %+v instruction \n%s\n", b, i.String())
|
||||||
|
switch i.Action {
|
||||||
|
case Put:
|
||||||
|
_, found := b.Focals[i.Label]
|
||||||
|
if !found {
|
||||||
|
b.Labels = append(b.Labels, i.Label)
|
||||||
|
}
|
||||||
|
b.Focals[i.Label] = i.LensFocal
|
||||||
|
|
||||||
|
case Remove:
|
||||||
|
_, found := b.Focals[i.Label]
|
||||||
|
if !found {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
index := slices.Index(b.Labels, i.Label)
|
||||||
|
delete(b.Focals, i.Label)
|
||||||
|
b.Labels = slices.Delete(b.Labels, index, index+1)
|
||||||
|
}
|
||||||
|
log.Printf("result : %+v\n", b)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Box)FocusingPower() int {
|
||||||
|
result := 0
|
||||||
|
for i, label := range b.Labels {
|
||||||
|
result += (i + 1) * b.Focals[label]
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
type Action rune
|
||||||
|
|
||||||
|
const (
|
||||||
|
Put Action = '='
|
||||||
|
Remove = '-'
|
||||||
|
)
|
||||||
|
|
||||||
|
type Instruction struct {
|
||||||
|
Label string
|
||||||
|
Box int
|
||||||
|
Action Action
|
||||||
|
LensFocal int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Instruction) String() string {
|
||||||
|
operation := ""
|
||||||
|
switch i.Action {
|
||||||
|
case Put:
|
||||||
|
operation = "put into"
|
||||||
|
case Remove:
|
||||||
|
operation = "remove from"
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s\t\t%d of focal %d %s", operation, i.Box, i.LensFocal, i.Label)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadInstruction(str string) Instruction {
|
||||||
|
result := Instruction{}
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`(?P<label>\D+)(?P<operation>[=\-])(?P<focal>\d*)`)
|
||||||
|
// log.Println("in str ", str)
|
||||||
|
fields := re.FindStringSubmatch(str)
|
||||||
|
// log.Printf("in %s found %+v", str, fields)
|
||||||
|
|
||||||
|
operation := fields[2]
|
||||||
|
operationRune := []rune(operation)[0]
|
||||||
|
result.Action = Action(operationRune)
|
||||||
|
|
||||||
|
if operationRune == '=' {
|
||||||
|
focalStr := fields[3]
|
||||||
|
focal, err := strconv.Atoi(focalStr)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprint("error reading focal from ", str))
|
||||||
|
}
|
||||||
|
result.LensFocal = focal
|
||||||
|
}
|
||||||
|
|
||||||
|
result.Label = fields[1]
|
||||||
|
result.Box = ASCIIStringHash(result.Label)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue