Compare commits

...

3 Commits

3 changed files with 35 additions and 23 deletions

View File

@ -2,42 +2,28 @@ package one
import ( import (
"bytes" "bytes"
"cmp" "sort"
"slices"
"strconv" "strconv"
"strings" "strings"
log "github.com/sirupsen/logrus"
) )
func Solve(buf []byte) (int, error) { func Solve(buf []byte) (int, error) {
r := bytes.NewReader(buf) r := bytes.NewReader(buf)
initial, wires, expressions, err := parseLines(r) wires, expressions, err := parseLines(r)
if err != nil { if err != nil {
return 0, err return 0, err
} }
for k, v := range initial {
wires[k] = v
}
wires = calculateWire(expressions, wires) wires = calculateWire(expressions, wires)
zWires := filter(wires, func(name string) bool {
zWires := []zWire{} return strings.HasPrefix(name, "z")
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)
}) })
sort.Sort(byName(zWires))
var binStr strings.Builder var binStr strings.Builder
for _, zWire := range zWires { 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 return mustConvBinToDec(binStr.String()), nil
} }

View File

@ -13,7 +13,7 @@ const (
target 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) initial := make(map[string]int)
wires := make(map[string]int) wires := make(map[string]int)
expressions := []expression{} 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 { 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 { func mustConv(s string) int {
@ -82,3 +86,13 @@ func mustConvBinToDec(s string) int {
} }
return int(n) 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
}

View File

@ -2,6 +2,18 @@ package one
const noValue = -1 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 { type zWire struct {
name string name string
value int value int