package aoclib import ( "bufio" "fmt" "log" "os" "strconv" "time" ) type Puzzle struct { FromFile string RawInput []string RawInputInt []int } func (p *Puzzle) ReadInputFromFile() { fh, err := os.Open(p.FromFile) if err != nil { log.Fatal("fopen error:", err) } defer fh.Close() p.RawInput = []string{} scanner := bufio.NewScanner(fh) for scanner.Scan() { p.RawInput = append(p.RawInput, scanner.Text()) } if err := scanner.Err(); err != nil { log.Fatal("scanner error:", err) } } func (p *Puzzle) GetInputArray() []string { if len(p.RawInput) == 0 && len(p.FromFile) != 0 { p.ReadInputFromFile() } return p.RawInput } func (p *Puzzle) GetInputArrayInt() []int { if len(p.RawInputInt) == 0 { for _, v := range p.GetInputArray() { value, err := strconv.Atoi(v) if err != nil { log.Fatal("Cannot convert string to int:", v) } else { p.RawInputInt = append(p.RawInputInt, value) } } } return p.RawInputInt } func (p *Puzzle) GetInput2DArrayInt() [][]int { var ret [][]int for _, v := range p.GetInputArray() { var thisIntLine []int for _, c := range v { value, err := strconv.Atoi(string(c)) if err != nil { log.Fatalf("Cannot convert string to int: (%c in %s)", c, v) } else { thisIntLine = append(thisIntLine, value) } } ret = append(ret, thisIntLine) } return ret } func (p Puzzle) Solve(partFunction func(p Puzzle) interface{}, day int, part int, timeit bool, timeitNumber int) { var result interface{} if !timeit { result = partFunction(p) fmt.Printf( "Result for day %d, part %d: %#v\n", day, part, result, ) } else { start := time.Now() for i := 0; i < timeitNumber; i++ { result = partFunction(p) } elapsed := time.Duration(int64(time.Since(start)) / int64(timeitNumber)) fmt.Printf( "Result for day %d, part %d: %#v (avg over %d runs: %s)\n", day, part, result, timeitNumber, elapsed, ) } }