aoc2015/aoclib/aoclib.go
2020-12-21 21:12:33 +01:00

81 lines
1.5 KiB
Go

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) 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,
)
}
}