66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
|
package common
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"unicode"
|
||
|
)
|
||
|
|
||
|
func ReadFile(filename string) ([]string, error) {
|
||
|
file, err := os.Open(filename)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("unable to open %q; %w", filename, err)
|
||
|
}
|
||
|
defer file.Close()
|
||
|
|
||
|
scanner := bufio.NewScanner(file)
|
||
|
var lines []string
|
||
|
|
||
|
for scanner.Scan() {
|
||
|
lines = append(lines, scanner.Text())
|
||
|
}
|
||
|
|
||
|
if err := scanner.Err(); err != nil {
|
||
|
return nil, fmt.Errorf("error scanning %q; %w", filename, err)
|
||
|
}
|
||
|
|
||
|
return lines, nil
|
||
|
}
|
||
|
|
||
|
func ParseIntList(line string) ([]int, error) {
|
||
|
var values []int
|
||
|
digitString := ""
|
||
|
|
||
|
addValue := func(digit string) error {
|
||
|
if len(digit) > 0 {
|
||
|
value, err := strconv.Atoi(digit)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("unable to parse %q to int; %w", digit, err)
|
||
|
}
|
||
|
values = append(values, value)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
for i, v := range line {
|
||
|
if unicode.IsDigit(v) {
|
||
|
digitString = digitString + string(v)
|
||
|
if i == len(line)-1 {
|
||
|
if err := addValue(digitString); err != nil {
|
||
|
return nil, fmt.Errorf("unable to add %q to the list of ints; %w", digitString, err)
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if err := addValue(digitString); err != nil {
|
||
|
return nil, fmt.Errorf("unable to add %q to the list of ints; %w", digitString, err)
|
||
|
}
|
||
|
digitString = ""
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return values, nil
|
||
|
}
|