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 }