Files
adventofcode/2022/go/day05/day05.go
2023-11-16 10:48:53 +00:00

94 lines
1.8 KiB
Go

package day05
import (
"fmt"
"strings"
"github.com/philhanna/stack"
)
func Part1(input string) (result string) {
result = ""
var stacks [9]stack.Stack[string]
var lineNo int
for i := 0; i < 9; i++ {
stacks[i] = stack.NewStack[string]()
}
lines := strings.Split(input, "\n")
for n, line := range lines {
if line == " 1 2 3 4 5 6 7 8 9 " {
lineNo = n + 2
break
}
for i, r := range line {
if r != ' ' && r != '[' && r != ']' {
stacks[i/4].Push(string(r))
}
}
}
for i := 0; i < 9; i++ {
stacks[i].Reverse()
}
var quantity, from, to int
for _, line := range lines[lineNo:] {
fmt.Sscanf(line, "move %d from %d to %d", &quantity, &from, &to)
for i := 0; i < quantity; i++ {
value, _ := (stacks[from-1]).Pop()
stacks[to-1].Push(value)
}
}
for i := 0; i < 9; i++ {
item, _ := stacks[i].Peek()
result = result + item
}
return
}
func Part2(input string) (result string) {
result = ""
var stacks [9]stack.Stack[string]
tmp := stack.NewStack[string]()
var lineNo int
for i := 0; i < 9; i++ {
stacks[i] = stack.NewStack[string]()
}
lines := strings.Split(input, "\n")
for n, line := range lines {
if line == " 1 2 3 4 5 6 7 8 9 " {
lineNo = n + 2
break
}
for i, r := range line {
if r != ' ' && r != '[' && r != ']' {
stacks[i/4].Push(string(r))
}
}
}
for i := 0; i < 9; i++ {
stacks[i].Reverse()
}
var quantity, from, to int
for _, line := range lines[lineNo:] {
fmt.Sscanf(line, "move %d from %d to %d", &quantity, &from, &to)
for i := 0; i < quantity; i++ {
value, _ := (stacks[from-1]).Pop()
tmp.Push(value)
}
for i := 0; i < quantity; i++ {
value, _ := tmp.Pop()
stacks[to-1].Push(value)
}
}
for i := 0; i < 9; i++ {
item, _ := stacks[i].Peek()
result = result + item
}
return
}