From 6dd91762e4720cf25b18e670ce311ef60b0563ab Mon Sep 17 00:00:00 2001 From: Pierre Jeanjean Date: Mon, 5 Dec 2022 10:36:40 +0100 Subject: [PATCH] Day 5 --- day05/common/crane.go | 85 +++++++++++++++++++++++++++++++++++++++++++ day05/ex1/main.go | 24 ++++++++++++ day05/ex2/main.go | 27 ++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 day05/common/crane.go create mode 100644 day05/ex1/main.go create mode 100644 day05/ex2/main.go diff --git a/day05/common/crane.go b/day05/common/crane.go new file mode 100644 index 0000000..a65febb --- /dev/null +++ b/day05/common/crane.go @@ -0,0 +1,85 @@ +package common + +import ( + "bufio" + "strconv" + "strings" +) + +type Stack []byte + +func (stack *Stack) Append(crate byte) { + *stack = append(Stack{crate}, *stack...) +} + +func (stack *Stack) Push(crate byte) { + *stack = append(*stack, crate) +} + +func (stack *Stack) Pop() byte { + last := len(*stack) - 1 + top := (*stack)[last] + *stack = (*stack)[:last] + return top +} + +func (stack *Stack) Peek() byte { + last := len(*stack) - 1 + top := (*stack)[last] + return top +} + +type Movement struct { + n int + start int + end int +} + +func (movement Movement) GetN() int { + return movement.n +} + +func (movement Movement) GetStart() int { + return movement.start +} + +func (movement Movement) GetEnd() int { + return movement.end +} + +func Parse(scanner bufio.Scanner) ([]Stack, []Movement) { + stacks := []Stack{} + + scanner.Scan() + line := scanner.Text() + + nStacks := len(line) / 4 + 1 + + for i := 0; i < nStacks; i++ { + stacks = append(stacks, Stack{}) + } + + for line[:3] != " 1 " { + for i := 0; i < nStacks; i++ { + if line[1+4*i] != ' ' { + stacks[i].Append(line[1+4*i]) + } + } + scanner.Scan() + line = scanner.Text() + } + + scanner.Scan() + + movements := []Movement{} + + for scanner.Scan() { + splittedLine := strings.Split(scanner.Text(), " ") + n, _ := strconv.Atoi(splittedLine[1]) + start, _ := strconv.Atoi(splittedLine[3]) + end, _ := strconv.Atoi(splittedLine[5]) + movements = append(movements, Movement{n, start, end}) + } + + return stacks, movements +} diff --git a/day05/ex1/main.go b/day05/ex1/main.go new file mode 100644 index 0000000..f2d8d81 --- /dev/null +++ b/day05/ex1/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "aoc2022/day05/common" +) + +func main() { + stacks, movements := common.Parse(*bufio.NewScanner(os.Stdin)) + + for _, movement := range(movements) { + for i := 0; i < movement.GetN(); i++ { + top := stacks[movement.GetStart() - 1].Pop() + stacks[movement.GetEnd() - 1].Push(top) + } + } + + for _, stack := range(stacks) { + fmt.Print(string(stack.Peek())) + } + fmt.Println() +} diff --git a/day05/ex2/main.go b/day05/ex2/main.go new file mode 100644 index 0000000..7b4257c --- /dev/null +++ b/day05/ex2/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "aoc2022/day05/common" +) + +func main() { + stacks, movements := common.Parse(*bufio.NewScanner(os.Stdin)) + + for _, movement := range(movements) { + top := []byte{} + for i := 0; i < movement.GetN(); i++ { + top = append(top, stacks[movement.GetStart() - 1].Pop()) + } + for i := len(top) - 1; i >= 0; i-- { + stacks[movement.GetEnd() - 1].Push(top[i]) + } + } + + for _, stack := range(stacks) { + fmt.Print(string(stack.Peek())) + } + fmt.Println() +}