pgoultiaev/aoc2017

View on GitHub
16/16.go

Summary

Maintainability
A
0 mins
Test Coverage
package main

import (
    "io/ioutil"
    "strconv"
    "strings"
)

func main() {
    buf, err := ioutil.ReadFile("16.txt")
    if err != nil {
        panic(err)
    }

    s := string(buf)
    danceMoves := strings.Split(s, ",")
    var dance = "abcdefghijklmnop"

    partOneDance := solve(dance, danceMoves)
    println(partOneDance)

    partTwoDance := solve2(dance, danceMoves)
    println(partTwoDance)
}

func solve2(dance string, dancemoves []string) string {
    order := map[int]string{}
    initial := dance

    i := 0
    for {
        order[i] = dance
        if i != 0 && dance == initial {
            break
        } else {
            dance = solve(dance, dancemoves)
        }
        i++
    }

    return order[1000000000%i]
}

func solve(d string, dancemoves []string) string {
    dance := strings.Split(d, "")

    for _, move := range dancemoves {
        switch move[0] {
        case 's':
            xprograms, _ := strconv.Atoi(move[1:])
            tail := dance[len(dance)-xprograms:]
            head := dance[:len(dance)-xprograms]
            dance = append(tail, head...)
            //fmt.Printf("SWITCH %s, xprograms: %d, tail:\t%+v\nhead:\t%+v\ndance: %+v", move, xprograms, tail, head, dance)

        case 'x':
            instr := move[1:]
            progs := strings.Split(instr, "/")
            index1, _ := strconv.Atoi(progs[0])
            index2, _ := strconv.Atoi(progs[1])
            prog1 := dance[index1]
            dance[index1] = dance[index2]
            dance[index2] = prog1
            //fmt.Printf("EXCHANGE %s, progs: [%d / %d]\ndance: %+v", instr, index1, index2, dance)

        case 'p':
            instr := move[1:]
            progs := strings.Split(instr, "/")

            var index1, index2 int
            for i, program := range dance {
                if program == progs[0] {
                    index1 = i
                }
                if program == progs[1] {
                    index2 = i
                }
            }

            prog1 := dance[index1]
            dance[index1] = dance[index2]
            dance[index2] = prog1
            //fmt.Printf("PARTNER %s, progs: [%s / %s]\n, dance: %+v", instr, progs[0], progs[1], dance)
        }
    }
    return strings.Join(dance, "")
}