aoc2015/aoclib/aoclib.go
Stefan Harmuth b3d99b6975 day10
2020-12-26 06:54:51 +01:00

100 lines
1.9 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) 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,
)
}
}