From 92e0fe693cdca3b15fb3c0e9b97738fdac0df8ba Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Sun, 26 Feb 2023 18:06:19 +0100 Subject: fixup --- 2022/01/calories/elfs.go | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 2022/01/elfs.go | 40 --------------------------- 2022/01/main.go | 26 ++---------------- cmd/aocli/gen.go | 42 ++++++++++++++++++++++++++-- 4 files changed, 113 insertions(+), 66 deletions(-) create mode 100644 2022/01/calories/elfs.go delete mode 100644 2022/01/elfs.go diff --git a/2022/01/calories/elfs.go b/2022/01/calories/elfs.go new file mode 100644 index 0000000..2011fc8 --- /dev/null +++ b/2022/01/calories/elfs.go @@ -0,0 +1,71 @@ +package calories + +import ( + "context" + "strconv" +) + +type solver func(ctx context.Context, data []int) ([]int, error) + +var ( + Reader = readCaloriesInts + Solvers = []solver{partOne, partTwo} +) + +func partOne(ctx context.Context, data []int) ([]int, error) { + return biggestElf(data), nil +} + +func partTwo(ctx context.Context, data []int) ([]int, error) { + return []int{sum(biggestElf(data))}, nil +} + +func readCaloriesInts(line string) (int, error) { + if len(line) == 0 { + return -1, nil + } + if i, err := strconv.Atoi(line); err != nil { + return 0, err + } else { + return i, nil + } +} + +func biggestElf(data []int) []int { + topThree := make([]int, 3) + push := func(i int, a int) { + tmp := topThree[i] + topThree[i] = a + carry := tmp + for i++; i < len(topThree); i++ { + tmp = topThree[i] + topThree[i] = carry + carry = tmp + } + } + Elf := 0 + for i := 0; i < len(data); i++ { + if data[i] > 0 { + Elf = Elf + data[i] + } + if data[i] < 0 || i == len(data)-1 { + for j := 0; j < len(topThree); j++ { + if topThree[j] < Elf { + push(j, Elf) + break + } + } + Elf = 0 + continue + } + } + return topThree +} + +func sum(array []int) int { + s := 0 + for _, val := range array { + s += val + } + return s +} diff --git a/2022/01/elfs.go b/2022/01/elfs.go deleted file mode 100644 index b13dbd3..0000000 --- a/2022/01/elfs.go +++ /dev/null @@ -1,40 +0,0 @@ -package main - -func biggestElf(data []int) []int { - topThree := make([]int, 3) - push := func(i int, a int) { - tmp := topThree[i] - topThree[i] = a - carry := tmp - for i++; i < len(topThree); i++ { - tmp = topThree[i] - topThree[i] = carry - carry = tmp - } - } - Elf := 0 - for i := 0; i < len(data); i++ { - if data[i] > 0 { - Elf = Elf + data[i] - } - if data[i] < 0 || i == len(data)-1 { - for j := 0; j < len(topThree); j++ { - if topThree[j] < Elf { - push(j, Elf) - break - } - } - Elf = 0 - continue - } - } - return topThree -} - -func sum(array []int) int { - s := 0 - for _, val := range array { - s += val - } - return s -} diff --git a/2022/01/main.go b/2022/01/main.go index 3b8ac4c..51d5750 100644 --- a/2022/01/main.go +++ b/2022/01/main.go @@ -2,38 +2,18 @@ package main import ( "context" - "strconv" + "mvinkio.online/aoc/2022/01/calories" "mvinkio.online/aoc/aoc" ) -func readCaloriesInts(line string) (int, error) { - if len(line) == 0 { - return -1, nil - } - if i, err := strconv.Atoi(line); err != nil { - return 0, err - } else { - return i, nil - } -} - -func PartOne(ctx context.Context, data []int) ([]int, error) { - return biggestElf(data), nil -} - -func PartTwo(ctx context.Context, data []int) ([]int, error) { - return []int{sum(biggestElf(data))}, nil -} - // Boilerplate func main() { aoc.RunDay( context.TODO(), aoc.NewScanCloser("2022/01/input.txt"), - aoc.ReadByLine(readCaloriesInts), - PartOne, - PartTwo, + aoc.ReadByLine(calories.Reader), + calories.Solvers..., ) } diff --git a/cmd/aocli/gen.go b/cmd/aocli/gen.go index c8251a6..7320894 100644 --- a/cmd/aocli/gen.go +++ b/cmd/aocli/gen.go @@ -2,14 +2,50 @@ package main import ( "fmt" + "strconv" + "strings" "github.com/spf13/cobra" ) +var templateStr string = ` +` + var genCmd = &cobra.Command{ Use: "gen", - Short: "Generate a new key pair", - Run: func(cmd *cobra.Command, args []string) { - fmt.Println(args) + Short: "Generate a new boilerplate entrypoint for a day of Advent of Code", + RunE: func(cmd *cobra.Command, args []string) error { + year, day := "", "" + if len(args) == 1 { + parts := strings.SplitN(args[0], "/", 2) + if len(parts) == 2 { + year = parts[0] + day = parts[1] + } + } else { + return fmt.Errorf("Expected one argument in format %q", "/") + } + + if year == "" || day == "" { + return fmt.Errorf("Expected one argument in format %q", "/") + } + + _, err := strconv.Atoi(year) + if err != nil { + return fmt.Errorf("Couldn't parse year integer: %q", year) + } + + dayInt, err := strconv.Atoi(day) + if err != nil { + return fmt.Errorf("Couldn't parse day integer: %q", day) + } + + if dayInt < 1 || dayInt > 25 { + return fmt.Errorf("Day must be between 1 and 25, got %d", dayInt) + } + + dayStr := fmt.Sprintf("%02d", dayInt) + fmt.Println(dayStr) + return nil }, } -- cgit v1.2.3