Dag: 5
SprÄk: Go
type stacks [][]string
func main() {
lines, err := helpers.ReadLines(os.Args[1])
if err != nil {
panic(err)
}
re := regexp.MustCompile("([A-Z]|\\s{4})")
first := true
stacks1 := make(stacks, 0)
stacks2 := make(stacks, 0)
for _, line := range lines {
if strings.Contains(line, "[") {
res := re.FindAllStringSubmatch(line, -1)
if first {
first = false
for range res {
stack := make([]string, 0)
stacks1 = append(stacks1, stack)
}
}
stacks1.getCrates(res)
}
if line == "" {
for _, stack := range stacks1 {
helpers.Reverse(stack)
stack2 := make([]string, len(stack))
copy(stack2, stack)
fmt.Println(stack2)
stacks2 = append(stacks2, stack2)
}
}
if strings.Contains(line, "move") {
stacks1.moveStacks(line, false)
stacks2.moveStacks(line, true)
}
}
for _, stack := range stacks1 {
if len(stack) > 0 {
fmt.Print(stack[len(stack)-1])
}
}
fmt.Println()
for _, stack := range stacks2 {
if len(stack) > 0 {
fmt.Print(stack[len(stack)-1])
}
}
}
func (s *stacks) getCrates(res [][]string) {
for i, val := range res {
str := val[1]
char, _ := utf8.DecodeRuneInString(str)
if unicode.IsLetter(char) {
(*s)[i] = append((*s)[i], str)
}
}
}
func (s *stacks) moveStacks(instruction string, newRobot bool) {
re := regexp.MustCompile("\\d+")
res := re.FindAllStringSubmatch(instruction, -1)
crates, from, to := helpers.GetInt(res[0][0]),
helpers.GetInt(res[1][0])-1,
helpers.GetInt(res[2][0])-1
if !newRobot {
for i := 0; i < crates; i++ {
(*s)[to] = append((*s)[to], (*s)[from][len((*s)[from])-i-1])
}
} else {
(*s)[to] = append((*s)[to], (*s)[from][len((*s)[from])-crates:]...)
}
(*s)[from] = (*s)[from][:len((*s)[from])-crates]
}