From 4c8fe1b3abe36694587bda4b271eb276f5b3e706 Mon Sep 17 00:00:00 2001 From: Markus Witt Date: Tue, 6 Dec 2022 15:20:43 +0100 Subject: [PATCH] feat: solve 05 --- 05.go | 171 +++++++++++++++++ 05_test.go | 31 ++++ input/202205 | 511 +++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 1 + 4 files changed, 714 insertions(+) create mode 100644 05.go create mode 100644 05_test.go create mode 100644 input/202205 diff --git a/05.go b/05.go new file mode 100644 index 0000000..2c2b44f --- /dev/null +++ b/05.go @@ -0,0 +1,171 @@ +package main + +import ( + "fmt" + "log" + "strconv" + "strings" +) + +type AOC202205Crate []rune +type AOC202205Crates []AOC202205Crate + +func AOC202205ParseCrates(input string) (AOC202205Crates, error) { + rtn := AOC202205Crates{} + + lines := strings.Split(input, "\n") + maxStack := len(lines) + boxLine := lines[maxStack-1] + for i := 0; i < len(boxLine); i++ { + if boxLine[i] == ' ' { + continue + } + rtn = append(rtn, AOC202205Crate{}) + } + + for row := maxStack - 2; row >= 0; row-- { + for column, char := range lines[row] { + if 'A' <= char && char <= 'Z' { + col := (column - 1) / 4 + rtn[col] = append(rtn[col], char) + } + } + } + + return rtn, nil +} + +func (crates AOC202205Crates) AOC202205ApplyCommands(commands []AOC202205Command) (AOC202205Crates, error) { + for _, cmd := range commands { + if len(crates[cmd.src-1]) < cmd.count { + return crates, fmt.Errorf("can't move %d crates from %d to %d: %d has only %d elements", cmd.count, cmd.src, cmd.dst, cmd.src, len(crates[cmd.src-1])) + } + for i := 0; i < cmd.count; i++ { + sLen := len(crates[cmd.src-1]) + sData := crates[cmd.src-1][sLen-1] + crates[cmd.src-1] = crates[cmd.src-1][:sLen-1] + crates[cmd.dst-1] = append(crates[cmd.dst-1], sData) + } + } + + return crates, nil +} + +func (crates AOC202205Crates) AOC202205ApplyCommands2(commands []AOC202205Command) (AOC202205Crates, error) { + for _, cmd := range commands { + if len(crates[cmd.src-1]) < cmd.count { + return crates, fmt.Errorf("can't move %d crates from %d to %d: %d has only %d elements", cmd.count, cmd.src, cmd.dst, cmd.src, len(crates[cmd.src-1])) + } + sLen := len(crates[cmd.src-1]) + sData := crates[cmd.src-1][sLen-cmd.count:] + crates[cmd.src-1] = crates[cmd.src-1][:sLen-cmd.count] + for _, char := range sData { + crates[cmd.dst-1] = append(crates[cmd.dst-1], char) + } + } + + return crates, nil +} + +func (crates AOC202205Crates) AOC202205GetTop() string { + var out string + for _, crate := range crates { + out += string(crate[len(crate)-1]) + } + + return out +} + +type AOC202205Command struct { + src int + dst int + count int +} + +func AOC202205ParseCommands(input string) ([]AOC202205Command, error) { + rtn := []AOC202205Command{} + + for _, line := range strings.Split(input, "\n") { + parts := strings.Split(line, " ") + src, err := strconv.Atoi(parts[3]) + if err != nil { + return rtn, fmt.Errorf("can't convert %s to int: %v", parts[3], err) + } + dst, err := strconv.Atoi(parts[5]) + if err != nil { + return rtn, fmt.Errorf("can't convert %s to int: %v", parts[5], err) + } + count, err := strconv.Atoi(parts[1]) + if err != nil { + return rtn, fmt.Errorf("can't convert %s to int: %v", parts[1], err) + } + + rtn = append(rtn, AOC202205Command{ + src: src, + dst: dst, + count: count, + }) + } + + return rtn, nil +} + +func AOC2022051Wrapper(input string) (string, error) { + stateCommand := strings.Split(input, "\n\n") + crates, err := AOC202205ParseCrates(stateCommand[0]) + if err != nil { + return "", fmt.Errorf("can't parse crates: %v", err) + } + + commands, err := AOC202205ParseCommands(stateCommand[1]) + if err != nil { + return "", fmt.Errorf("can't parse commands: %v", err) + } + + crates, err = crates.AOC202205ApplyCommands(commands) + if err != nil { + return "", fmt.Errorf("can't apply commands: %v", err) + } + + return crates.AOC202205GetTop(), nil +} + +func AOC2022051(input string) (int, error) { + out, err := AOC2022051Wrapper(input) + if err != nil { + return 0, err + } + log.Printf("AOC2022 05/1: %s", out) + + return 0, nil +} + +func AOC2022052Wrapper(input string) (string, error) { + stateCommand := strings.Split(input, "\n\n") + crates, err := AOC202205ParseCrates(stateCommand[0]) + if err != nil { + return "", fmt.Errorf("can't parse crates: %v", err) + } + + commands, err := AOC202205ParseCommands(stateCommand[1]) + if err != nil { + return "", fmt.Errorf("can't parse commands: %v", err) + } + + crates, err = crates.AOC202205ApplyCommands2(commands) + if err != nil { + return "", fmt.Errorf("can't apply commands: %v", err) + } + + return crates.AOC202205GetTop(), nil +} + +func AOC2022052(input string) (int, error) { + out, err := AOC2022052Wrapper(input) + if err != nil { + return 0, err + } + log.Printf("AOC2022 05/2: %s", out) + + return 0, nil +} diff --git a/05_test.go b/05_test.go new file mode 100644 index 0000000..7c1c332 --- /dev/null +++ b/05_test.go @@ -0,0 +1,31 @@ +package main + +import "testing" + +func TestAOC2022051(t *testing.T) { + test := struct { + input string + output string + }{ + input: ` + [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2`, + output: "CMZ", + } + + got, err := AOC2022051Wrapper(test.input) + if err != nil { + t.Fatalf("AOC2022051() err: %v", err) + } + + if got != test.output { + t.Errorf("AOC2022051() missmatch:\nwant: %s\ngot: %s", test.output, got) + } +} diff --git a/input/202205 b/input/202205 new file mode 100644 index 0000000..a31f595 --- /dev/null +++ b/input/202205 @@ -0,0 +1,511 @@ + [H] [W] [B] + [D] [B] [L] [G] [N] +[P] [J] [T] [M] [R] [D] +[V] [F] [V] [F] [Z] [B] [C] +[Z] [V] [S] [G] [H] [C] [Q] [R] +[W] [W] [L] [J] [B] [V] [P] [B] [Z] +[D] [S] [M] [S] [Z] [W] [J] [T] [G] +[T] [L] [Z] [R] [C] [Q] [V] [P] [H] + 1 2 3 4 5 6 7 8 9 + +move 3 from 2 to 9 +move 1 from 1 to 6 +move 6 from 6 to 7 +move 13 from 7 to 6 +move 2 from 4 to 5 +move 1 from 4 to 3 +move 5 from 9 to 8 +move 1 from 8 to 5 +move 3 from 1 to 6 +move 2 from 1 to 8 +move 1 from 2 to 1 +move 1 from 9 to 3 +move 2 from 9 to 8 +move 2 from 5 to 9 +move 4 from 5 to 4 +move 10 from 8 to 4 +move 5 from 6 to 2 +move 5 from 5 to 9 +move 7 from 3 to 7 +move 1 from 9 to 8 +move 1 from 1 to 9 +move 1 from 7 to 3 +move 3 from 8 to 9 +move 8 from 6 to 7 +move 3 from 9 to 4 +move 3 from 2 to 6 +move 6 from 6 to 3 +move 10 from 7 to 9 +move 1 from 7 to 5 +move 1 from 5 to 7 +move 2 from 3 to 6 +move 8 from 4 to 2 +move 7 from 4 to 3 +move 5 from 2 to 3 +move 2 from 4 to 6 +move 6 from 2 to 8 +move 14 from 9 to 1 +move 6 from 3 to 2 +move 7 from 3 to 7 +move 4 from 2 to 3 +move 1 from 6 to 5 +move 3 from 6 to 5 +move 2 from 2 to 4 +move 3 from 1 to 2 +move 2 from 4 to 1 +move 3 from 5 to 6 +move 1 from 9 to 6 +move 1 from 2 to 6 +move 7 from 7 to 4 +move 5 from 8 to 1 +move 11 from 3 to 5 +move 2 from 2 to 5 +move 8 from 5 to 1 +move 4 from 7 to 2 +move 2 from 6 to 8 +move 3 from 2 to 4 +move 1 from 8 to 3 +move 1 from 3 to 2 +move 11 from 1 to 8 +move 4 from 6 to 5 +move 1 from 4 to 1 +move 2 from 6 to 4 +move 14 from 1 to 9 +move 1 from 1 to 6 +move 1 from 1 to 9 +move 10 from 4 to 3 +move 3 from 3 to 2 +move 8 from 8 to 9 +move 1 from 4 to 5 +move 8 from 5 to 8 +move 10 from 9 to 5 +move 5 from 3 to 2 +move 1 from 3 to 7 +move 1 from 2 to 5 +move 6 from 2 to 3 +move 7 from 3 to 5 +move 1 from 6 to 9 +move 2 from 5 to 9 +move 4 from 2 to 9 +move 1 from 2 to 1 +move 1 from 1 to 5 +move 1 from 7 to 4 +move 17 from 9 to 1 +move 4 from 1 to 5 +move 9 from 5 to 8 +move 21 from 8 to 6 +move 1 from 4 to 6 +move 3 from 5 to 1 +move 10 from 1 to 5 +move 12 from 5 to 3 +move 3 from 3 to 6 +move 5 from 5 to 7 +move 5 from 5 to 9 +move 5 from 7 to 5 +move 2 from 5 to 7 +move 1 from 8 to 5 +move 1 from 7 to 3 +move 3 from 1 to 7 +move 11 from 6 to 5 +move 1 from 7 to 3 +move 5 from 9 to 7 +move 8 from 3 to 6 +move 4 from 9 to 6 +move 3 from 1 to 6 +move 1 from 9 to 5 +move 6 from 5 to 1 +move 1 from 1 to 6 +move 3 from 1 to 3 +move 2 from 1 to 2 +move 19 from 6 to 1 +move 2 from 5 to 9 +move 5 from 3 to 1 +move 1 from 5 to 6 +move 5 from 6 to 7 +move 3 from 7 to 9 +move 6 from 5 to 9 +move 1 from 5 to 6 +move 4 from 6 to 9 +move 2 from 2 to 1 +move 1 from 3 to 2 +move 1 from 2 to 7 +move 7 from 7 to 6 +move 21 from 1 to 3 +move 2 from 7 to 8 +move 7 from 3 to 2 +move 2 from 7 to 9 +move 8 from 3 to 8 +move 4 from 3 to 1 +move 6 from 1 to 9 +move 7 from 2 to 9 +move 1 from 3 to 6 +move 1 from 8 to 7 +move 1 from 1 to 6 +move 12 from 6 to 9 +move 1 from 3 to 6 +move 1 from 7 to 5 +move 1 from 1 to 9 +move 1 from 5 to 9 +move 39 from 9 to 4 +move 3 from 9 to 6 +move 1 from 9 to 6 +move 7 from 8 to 4 +move 1 from 9 to 8 +move 44 from 4 to 1 +move 1 from 6 to 3 +move 28 from 1 to 8 +move 15 from 8 to 1 +move 1 from 3 to 2 +move 11 from 1 to 5 +move 1 from 4 to 7 +move 1 from 4 to 5 +move 16 from 1 to 6 +move 1 from 2 to 6 +move 12 from 8 to 2 +move 1 from 7 to 4 +move 3 from 2 to 4 +move 7 from 2 to 4 +move 4 from 1 to 6 +move 10 from 5 to 6 +move 1 from 1 to 5 +move 3 from 5 to 9 +move 3 from 8 to 7 +move 1 from 2 to 3 +move 1 from 2 to 4 +move 3 from 7 to 4 +move 30 from 6 to 8 +move 1 from 3 to 7 +move 20 from 8 to 4 +move 1 from 7 to 3 +move 1 from 9 to 8 +move 25 from 4 to 6 +move 1 from 3 to 5 +move 8 from 8 to 5 +move 3 from 8 to 4 +move 2 from 9 to 5 +move 2 from 5 to 2 +move 21 from 6 to 4 +move 2 from 2 to 6 +move 28 from 4 to 5 +move 1 from 8 to 6 +move 5 from 4 to 8 +move 3 from 6 to 7 +move 15 from 5 to 2 +move 3 from 7 to 6 +move 1 from 4 to 3 +move 17 from 5 to 1 +move 1 from 3 to 4 +move 1 from 4 to 8 +move 4 from 2 to 4 +move 4 from 4 to 1 +move 5 from 6 to 8 +move 11 from 8 to 3 +move 4 from 6 to 7 +move 5 from 3 to 2 +move 4 from 3 to 1 +move 25 from 1 to 7 +move 3 from 6 to 7 +move 8 from 2 to 3 +move 11 from 7 to 2 +move 2 from 2 to 7 +move 16 from 2 to 6 +move 1 from 2 to 8 +move 1 from 7 to 6 +move 1 from 5 to 2 +move 16 from 6 to 2 +move 3 from 5 to 7 +move 6 from 2 to 8 +move 1 from 5 to 4 +move 1 from 4 to 3 +move 4 from 8 to 9 +move 4 from 3 to 9 +move 2 from 6 to 2 +move 6 from 2 to 4 +move 1 from 9 to 7 +move 1 from 2 to 8 +move 7 from 3 to 6 +move 4 from 2 to 6 +move 2 from 9 to 5 +move 1 from 2 to 4 +move 6 from 6 to 9 +move 2 from 5 to 1 +move 1 from 1 to 4 +move 1 from 9 to 4 +move 2 from 7 to 6 +move 1 from 2 to 5 +move 1 from 5 to 9 +move 4 from 8 to 1 +move 7 from 9 to 8 +move 3 from 1 to 7 +move 1 from 8 to 3 +move 4 from 9 to 6 +move 6 from 8 to 1 +move 6 from 1 to 2 +move 1 from 1 to 9 +move 1 from 1 to 7 +move 21 from 7 to 5 +move 11 from 5 to 3 +move 1 from 9 to 5 +move 1 from 2 to 8 +move 5 from 7 to 5 +move 10 from 3 to 9 +move 1 from 8 to 5 +move 8 from 4 to 2 +move 1 from 3 to 4 +move 2 from 7 to 3 +move 5 from 5 to 3 +move 5 from 9 to 8 +move 10 from 6 to 2 +move 1 from 6 to 4 +move 1 from 9 to 4 +move 4 from 9 to 3 +move 19 from 2 to 5 +move 2 from 4 to 5 +move 11 from 5 to 1 +move 15 from 5 to 2 +move 4 from 8 to 1 +move 12 from 1 to 5 +move 1 from 8 to 1 +move 1 from 4 to 8 +move 3 from 1 to 3 +move 8 from 5 to 4 +move 7 from 3 to 9 +move 4 from 3 to 5 +move 4 from 4 to 1 +move 3 from 9 to 3 +move 2 from 4 to 1 +move 4 from 3 to 8 +move 4 from 2 to 3 +move 1 from 9 to 5 +move 4 from 8 to 6 +move 2 from 4 to 3 +move 1 from 4 to 5 +move 5 from 3 to 4 +move 3 from 3 to 6 +move 5 from 1 to 6 +move 2 from 4 to 6 +move 1 from 9 to 2 +move 7 from 6 to 3 +move 1 from 8 to 9 +move 2 from 1 to 4 +move 2 from 4 to 7 +move 4 from 6 to 4 +move 5 from 3 to 7 +move 1 from 7 to 2 +move 3 from 6 to 7 +move 1 from 4 to 5 +move 4 from 2 to 6 +move 3 from 6 to 9 +move 1 from 6 to 5 +move 1 from 9 to 2 +move 5 from 9 to 3 +move 11 from 5 to 1 +move 3 from 7 to 8 +move 2 from 8 to 9 +move 4 from 5 to 1 +move 10 from 2 to 7 +move 5 from 3 to 7 +move 1 from 9 to 3 +move 6 from 1 to 7 +move 22 from 7 to 9 +move 3 from 2 to 4 +move 4 from 5 to 3 +move 1 from 8 to 4 +move 5 from 4 to 7 +move 19 from 9 to 8 +move 2 from 1 to 5 +move 2 from 4 to 5 +move 2 from 4 to 9 +move 4 from 9 to 2 +move 4 from 7 to 3 +move 5 from 7 to 5 +move 7 from 3 to 7 +move 2 from 8 to 4 +move 3 from 4 to 7 +move 12 from 8 to 1 +move 4 from 3 to 7 +move 1 from 3 to 6 +move 1 from 6 to 1 +move 1 from 5 to 9 +move 3 from 9 to 3 +move 2 from 2 to 4 +move 3 from 8 to 3 +move 2 from 4 to 7 +move 7 from 5 to 1 +move 2 from 8 to 3 +move 8 from 7 to 9 +move 2 from 9 to 7 +move 3 from 9 to 5 +move 11 from 1 to 2 +move 5 from 3 to 8 +move 16 from 1 to 5 +move 1 from 9 to 8 +move 3 from 3 to 2 +move 6 from 2 to 6 +move 6 from 7 to 4 +move 2 from 5 to 2 +move 6 from 4 to 9 +move 11 from 5 to 7 +move 2 from 6 to 5 +move 9 from 5 to 1 +move 2 from 8 to 5 +move 13 from 7 to 4 +move 6 from 1 to 5 +move 10 from 2 to 9 +move 1 from 4 to 5 +move 4 from 6 to 9 +move 3 from 2 to 4 +move 2 from 8 to 2 +move 15 from 4 to 5 +move 1 from 2 to 8 +move 1 from 2 to 3 +move 2 from 8 to 7 +move 3 from 7 to 1 +move 1 from 7 to 8 +move 3 from 5 to 9 +move 1 from 7 to 1 +move 21 from 5 to 2 +move 3 from 9 to 1 +move 5 from 1 to 4 +move 1 from 3 to 4 +move 1 from 8 to 5 +move 1 from 8 to 9 +move 1 from 5 to 3 +move 5 from 2 to 5 +move 5 from 5 to 3 +move 7 from 9 to 2 +move 3 from 3 to 6 +move 2 from 1 to 4 +move 1 from 3 to 4 +move 2 from 3 to 2 +move 25 from 2 to 1 +move 11 from 9 to 2 +move 9 from 2 to 8 +move 4 from 9 to 5 +move 6 from 4 to 3 +move 3 from 3 to 5 +move 9 from 8 to 2 +move 3 from 4 to 3 +move 1 from 9 to 4 +move 4 from 3 to 8 +move 2 from 8 to 1 +move 3 from 5 to 9 +move 2 from 8 to 1 +move 4 from 2 to 9 +move 6 from 9 to 4 +move 1 from 9 to 2 +move 1 from 6 to 4 +move 3 from 4 to 3 +move 2 from 3 to 9 +move 3 from 1 to 9 +move 2 from 2 to 7 +move 2 from 7 to 2 +move 2 from 3 to 2 +move 5 from 9 to 7 +move 2 from 7 to 2 +move 28 from 1 to 7 +move 1 from 1 to 9 +move 10 from 2 to 5 +move 1 from 9 to 5 +move 14 from 7 to 1 +move 6 from 1 to 6 +move 12 from 7 to 9 +move 6 from 1 to 5 +move 1 from 3 to 8 +move 4 from 7 to 1 +move 4 from 4 to 8 +move 4 from 6 to 1 +move 1 from 2 to 8 +move 1 from 2 to 1 +move 1 from 6 to 1 +move 5 from 9 to 8 +move 16 from 5 to 7 +move 2 from 7 to 1 +move 6 from 8 to 1 +move 2 from 9 to 4 +move 2 from 1 to 3 +move 1 from 6 to 8 +move 2 from 5 to 3 +move 3 from 5 to 7 +move 4 from 8 to 7 +move 4 from 9 to 8 +move 6 from 8 to 6 +move 10 from 7 to 8 +move 1 from 9 to 1 +move 11 from 7 to 6 +move 2 from 3 to 9 +move 1 from 3 to 4 +move 4 from 1 to 2 +move 3 from 2 to 3 +move 1 from 9 to 1 +move 3 from 4 to 2 +move 9 from 6 to 4 +move 2 from 3 to 5 +move 8 from 4 to 9 +move 4 from 1 to 8 +move 3 from 8 to 2 +move 2 from 2 to 6 +move 1 from 7 to 2 +move 11 from 6 to 5 +move 7 from 8 to 6 +move 7 from 5 to 8 +move 5 from 8 to 5 +move 1 from 2 to 5 +move 3 from 5 to 7 +move 8 from 5 to 6 +move 2 from 4 to 5 +move 1 from 7 to 9 +move 2 from 3 to 8 +move 3 from 8 to 5 +move 13 from 6 to 2 +move 2 from 8 to 5 +move 5 from 1 to 9 +move 3 from 6 to 4 +move 5 from 5 to 8 +move 1 from 5 to 4 +move 4 from 1 to 4 +move 1 from 7 to 2 +move 12 from 9 to 7 +move 2 from 9 to 1 +move 3 from 8 to 3 +move 1 from 5 to 4 +move 3 from 8 to 9 +move 2 from 4 to 7 +move 4 from 9 to 5 +move 5 from 4 to 9 +move 3 from 9 to 2 +move 1 from 9 to 4 +move 1 from 9 to 3 +move 12 from 7 to 4 +move 1 from 4 to 8 +move 1 from 8 to 1 +move 1 from 5 to 4 +move 2 from 3 to 5 +move 11 from 2 to 3 +move 4 from 5 to 7 +move 7 from 7 to 2 +move 1 from 1 to 9 +move 1 from 8 to 3 +move 1 from 9 to 1 +move 2 from 1 to 5 +move 2 from 5 to 4 +move 1 from 8 to 1 +move 2 from 5 to 8 +move 5 from 1 to 9 +move 11 from 3 to 9 +move 1 from 3 to 6 +move 1 from 6 to 3 +move 3 from 3 to 6 +move 3 from 2 to 6 +move 13 from 9 to 7 +move 2 from 6 to 1 +move 8 from 4 to 9 +move 7 from 4 to 2 +move 2 from 8 to 6 +move 1 from 1 to 9 +move 5 from 2 to 1 +move 2 from 1 to 3 +move 10 from 2 to 8 +move 3 from 9 to 3 +move 1 from 7 to 4 +move 6 from 7 to 5 \ No newline at end of file diff --git a/main.go b/main.go index d32a09a..9cc4bf6 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ func main() { 2: {AOC2022021, AOC2022022}, 3: {AOC2022031, AOC2022032}, 4: {AOC2022041, AOC2022042}, + 5: {AOC2022051, AOC2022052}, } for day := range tasks {