Reformat day 1
parent
e1fed75ced
commit
953045e9fa
146
day1/main.go
146
day1/main.go
|
@ -10,6 +10,79 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if len(os.Args) != 2 {
|
||||||
|
fmt.Fprintf(os.Stderr, "Usage: %s inputfile\n", os.Args[0])
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
filename := os.Args[1]
|
||||||
|
inputFile, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("failed to open input file: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
defer inputFile.Close()
|
||||||
|
|
||||||
|
inputFileBytes, err := io.ReadAll(inputFile)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("failed to read input file: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
input := string(inputFileBytes)
|
||||||
|
inputLines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
|
||||||
|
fmt.Printf("Part 1: %d\n", part1(inputLines))
|
||||||
|
fmt.Printf("Part 2: %d\n", part2(inputLines))
|
||||||
|
}
|
||||||
|
|
||||||
|
func part1(input []string) int {
|
||||||
|
digits := []string{
|
||||||
|
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := solve(input, digits, strconv.Atoi)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func part2(input []string) int {
|
||||||
|
digits := []string{
|
||||||
|
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
|
||||||
|
}
|
||||||
|
|
||||||
|
words := []string{
|
||||||
|
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
|
||||||
|
}
|
||||||
|
|
||||||
|
allPossible := make([]string, len(digits), len(digits)+len(words))
|
||||||
|
copy(allPossible, digits)
|
||||||
|
allPossible = append(allPossible, words...)
|
||||||
|
|
||||||
|
result, err := solve(input, allPossible, func(s string) (int, error) {
|
||||||
|
n, err := strconv.Atoi(s)
|
||||||
|
if err == nil {
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
idx := slices.Index(words, s)
|
||||||
|
if idx != -1 {
|
||||||
|
return idx, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, errors.New("invalid digit")
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// filterToMatches find all overlapping matches of the stringset "valid" in "line"
|
// filterToMatches find all overlapping matches of the stringset "valid" in "line"
|
||||||
func filterToMatches(line string, valid []string) []string {
|
func filterToMatches(line string, valid []string) []string {
|
||||||
type match struct {
|
type match struct {
|
||||||
|
@ -100,76 +173,3 @@ func solve(input []string, validNumbers []string, convert func(string) (int, err
|
||||||
|
|
||||||
return total, nil
|
return total, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func part1(input []string) int {
|
|
||||||
digits := []string{
|
|
||||||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := solve(input, digits, strconv.Atoi)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func part2(input []string) int {
|
|
||||||
digits := []string{
|
|
||||||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
|
|
||||||
}
|
|
||||||
|
|
||||||
words := []string{
|
|
||||||
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
|
|
||||||
}
|
|
||||||
|
|
||||||
allPossible := make([]string, len(digits), len(digits)+len(words))
|
|
||||||
copy(allPossible, digits)
|
|
||||||
allPossible = append(allPossible, words...)
|
|
||||||
|
|
||||||
result, err := solve(input, allPossible, func(s string) (int, error) {
|
|
||||||
n, err := strconv.Atoi(s)
|
|
||||||
if err == nil {
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
idx := slices.Index(words, s)
|
|
||||||
if idx != -1 {
|
|
||||||
return idx, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0, errors.New("invalid digit")
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
if len(os.Args) != 2 {
|
|
||||||
fmt.Fprintf(os.Stderr, "Usage: %s inputfile\n", os.Args[0])
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
filename := os.Args[1]
|
|
||||||
inputFile, err := os.Open(filename)
|
|
||||||
if err != nil {
|
|
||||||
panic(fmt.Sprintf("failed to open input file: %s", err))
|
|
||||||
}
|
|
||||||
|
|
||||||
defer inputFile.Close()
|
|
||||||
|
|
||||||
inputFileBytes, err := io.ReadAll(inputFile)
|
|
||||||
if err != nil {
|
|
||||||
panic(fmt.Sprintf("failed to read input file: %s", err))
|
|
||||||
}
|
|
||||||
|
|
||||||
input := string(inputFileBytes)
|
|
||||||
inputLines := strings.Split(strings.TrimSpace(input), "\n")
|
|
||||||
|
|
||||||
fmt.Printf("Part 1: %d\n", part1(inputLines))
|
|
||||||
fmt.Printf("Part 2: %d\n", part2(inputLines))
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue