71 lines
926 B
Go
71 lines
926 B
Go
|
|
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,
|
||
|
|
)
|
||
|
|
}
|