diff --git a/2025/seven/seven.go b/2025/seven/seven.go index c849bc9..b5f9dcd 100644 --- a/2025/seven/seven.go +++ b/2025/seven/seven.go @@ -2,10 +2,8 @@ package main import ( "bufio" - "errors" "fmt" "os" - "strconv" "strings" ) @@ -15,18 +13,27 @@ func check(err error) { } } -type beam int type beams struct { - b map[beam]struct{} + list map[int]int } -func (b *beams) add(pos beam) { - b.b[pos] = {} +func newBeams() beams { + var b beams + b.list = make(map[int]int) + return b +} + +func (b *beams) add(pos int) { + b.list[pos]++ +} + +func (b *beams) del(pos int) { + delete(b.list, pos) } func main() { - file, err := os.Open("five.txt") + file, err := os.Open("seven.txt") check(err) defer file.Close() @@ -36,35 +43,24 @@ func main() { text := scanner.Text() start := strings.IndexRune(text, 'S') - beams.add(beam(start)) + beamSet := make(map[int]int) + beamSet[start] = 1 for scanner.Scan() { - } - db, err := parse(scanner) - - check(err) - - nRaw := len(db.ranges) - - for { - before, after := db.collapse() - - fmt.Printf("Collapsed %d to %d ranges\n", before, after) - - if before == after { - break + text := scanner.Text() + for beam, nways := range beamSet { + if text[beam] == '^' { + beamSet[beam-1] += nways + beamSet[beam+1] += nways + delete(beamSet, beam) + } } } - potentialNFresh := 0 - for _, r := range db.ranges { - potentialNFresh += r.nInRange() + timelines := 0 + for _, nways := range beamSet { + timelines += nways } - fmt.Printf( - "N raw %d and consolidated %d. %d potential fresh ingredients.\n", - nRaw, - len(db.ranges), - potentialNFresh, - ) + fmt.Printf("N splits: %d\n", timelines) }