diff --git a/day05/common/crane.go b/day05/common/crane.go index a65febb..6b78482 100644 --- a/day05/common/crane.go +++ b/day05/common/crane.go @@ -16,11 +16,15 @@ func (stack *Stack) Push(crate byte) { *stack = append(*stack, crate) } -func (stack *Stack) Pop() byte { +func (stack *Stack) Pop() (byte, bool) { last := len(*stack) - 1 - top := (*stack)[last] - *stack = (*stack)[:last] - return top + if last >= 0 { + top := (*stack)[last] + *stack = (*stack)[:last] + return top, true + } else { + return 0, false + } } func (stack *Stack) Peek() byte { diff --git a/day05/ex1/main.go b/day05/ex1/main.go index f2d8d81..545a5f7 100644 --- a/day05/ex1/main.go +++ b/day05/ex1/main.go @@ -12,7 +12,7 @@ func main() { for _, movement := range(movements) { for i := 0; i < movement.GetN(); i++ { - top := stacks[movement.GetStart() - 1].Pop() + top, _ := stacks[movement.GetStart() - 1].Pop() stacks[movement.GetEnd() - 1].Push(top) } } diff --git a/day05/ex2/main.go b/day05/ex2/main.go index 7b4257c..1c7869b 100644 --- a/day05/ex2/main.go +++ b/day05/ex2/main.go @@ -11,12 +11,13 @@ func main() { stacks, movements := common.Parse(*bufio.NewScanner(os.Stdin)) for _, movement := range(movements) { - top := []byte{} + topStack := common.Stack{} for i := 0; i < movement.GetN(); i++ { - top = append(top, stacks[movement.GetStart() - 1].Pop()) + top, _ := stacks[movement.GetStart() - 1].Pop() + topStack.Push(top) } - for i := len(top) - 1; i >= 0; i-- { - stacks[movement.GetEnd() - 1].Push(top[i]) + for top, left := topStack.Pop(); left; top, left = topStack.Pop() { + stacks[movement.GetEnd() - 1].Push(top) } }