Day 5
This commit is contained in:
85
day05/common/crane.go
Normal file
85
day05/common/crane.go
Normal 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
24
day05/ex1/main.go
Normal 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
27
day05/ex2/main.go
Normal 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()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user