Compare commits

...

3 Commits

3 changed files with 35 additions and 23 deletions
day-24/internal/one

@ -2,42 +2,28 @@ package one
import (
"bytes"
"cmp"
"slices"
"sort"
"strconv"
"strings"
log "github.com/sirupsen/logrus"
)
func Solve(buf []byte) (int, error) {
r := bytes.NewReader(buf)
initial, wires, expressions, err := parseLines(r)
wires, expressions, err := parseLines(r)
if err != nil {
return 0, err
}
for k, v := range initial {
wires[k] = v
}
wires = calculateWire(expressions, wires)
zWires := []zWire{}
for k, v := range wires {
if strings.HasPrefix(k, "z") {
zWires = append(zWires, zWire{k, v})
}
}
slices.SortFunc(zWires, func(a, b zWire) int {
return cmp.Compare(b.name, a.name)
zWires := filter(wires, func(name string) bool {
return strings.HasPrefix(name, "z")
})
sort.Sort(byName(zWires))
var binStr strings.Builder
for _, zWire := range zWires {
binStr.WriteString(strconv.FormatInt(int64(zWire.value), 2))
binStr.WriteString(strconv.Itoa(zWire.value))
}
log.Debug(binStr.String())
return mustConvBinToDec(binStr.String()), nil
}

@ -13,7 +13,7 @@ const (
target
)
func parseLines(r io.Reader) (map[string]int, map[string]int, []expression, error) {
func parseLines(r io.Reader) (map[string]int, []expression, error) {
initial := make(map[string]int)
wires := make(map[string]int)
expressions := []expression{}
@ -52,10 +52,14 @@ func parseLines(r io.Reader) (map[string]int, map[string]int, []expression, erro
}
if err := scanner.Err(); err != nil {
return nil, nil, nil, err
return nil, nil, err
}
return initial, wires, expressions, nil
for k, v := range initial {
wires[k] = v
}
return wires, expressions, nil
}
func mustConv(s string) int {
@ -82,3 +86,13 @@ func mustConvBinToDec(s string) int {
}
return int(n)
}
func filter(wires map[string]int, fn func(string) bool) []zWire {
var filtered []zWire
for name, value := range wires {
if fn(name) {
filtered = append(filtered, zWire{name, value})
}
}
return filtered
}

@ -2,6 +2,18 @@ package one
const noValue = -1
type byName []zWire
func (b byName) Len() int {
return len(b)
}
func (b byName) Less(i, j int) bool {
return b[j].name < b[i].name
}
func (b byName) Swap(i, j int) {
b[i], b[j] = b[j], b[i]
}
type zWire struct {
name string
value int