package main import ( "bufio" "errors" "fmt" "os" "strconv" "strings" ) func check(err error) { if err != nil { panic(err) } } type beam int type beams struct { b map[beam]struct{} } func (b *beams) add(pos beam) { b.b[pos] = {} } func main() { file, err := os.Open("five.txt") check(err) defer file.Close() scanner := bufio.NewScanner(file) scanner.Scan() text := scanner.Text() start := strings.IndexRune(text, 'S') beams.add(beam(start)) 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 } } potentialNFresh := 0 for _, r := range db.ranges { potentialNFresh += r.nInRange() } fmt.Printf( "N raw %d and consolidated %d. %d potential fresh ingredients.\n", nRaw, len(db.ranges), potentialNFresh, ) }