This commit is contained in:
2022-12-05 10:36:40 +01:00
parent 8b9a8e53ed
commit 6dd91762e4
3 changed files with 136 additions and 0 deletions

85
day05/common/crane.go Normal file
View File

@@ -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
}

24
day05/ex1/main.go Normal file
View File

@@ -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()
}

27
day05/ex2/main.go Normal file
View File

@@ -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()
}