87 lines
1.7 KiB
Go
87 lines
1.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
var progs string
|
||
|
length := 16
|
||
|
iters := 1000000000
|
||
|
if len(os.Args) > 1 {
|
||
|
length = Atoi(os.Args[1])
|
||
|
}
|
||
|
for i := 0; i < length; i++ {
|
||
|
progs += string('a' + i)
|
||
|
}
|
||
|
inp := StdinToString()
|
||
|
moves := strings.Split(inp, ",")
|
||
|
for i := 0; i < iters; i++ {
|
||
|
if i%(iters/100) == 0 {
|
||
|
// Clear the screen
|
||
|
fmt.Print("\033[H\033[2J")
|
||
|
// Percent Complete
|
||
|
fResult := ((float64(i) / float64(iters)) * 100)
|
||
|
sResult2 := strconv.FormatFloat(fResult, 'f', 2, 64)
|
||
|
fmt.Println(sResult2)
|
||
|
}
|
||
|
progs = doDance(progs, moves)
|
||
|
}
|
||
|
fmt.Println(progs)
|
||
|
}
|
||
|
|
||
|
func doDance(progs string, moves []string) string {
|
||
|
for _, v := range moves {
|
||
|
switch v[0] {
|
||
|
case 's':
|
||
|
progs = Spin(progs, Atoi(v[1:]))
|
||
|
case 'p':
|
||
|
pts := strings.Split(v[1:], "/")
|
||
|
progs = Partner(progs, pts[0], pts[1])
|
||
|
case 'x':
|
||
|
pts := strings.Split(v[1:], "/")
|
||
|
progs = Exchange(progs, Atoi(pts[0]), Atoi(pts[1]))
|
||
|
}
|
||
|
}
|
||
|
return progs
|
||
|
}
|
||
|
|
||
|
func Spin(progs string, cnt int) string {
|
||
|
stSpin := len(progs) - cnt
|
||
|
return progs[stSpin:] + progs[:stSpin]
|
||
|
}
|
||
|
|
||
|
func Exchange(progs string, i1, i2 int) string {
|
||
|
if i1 > i2 {
|
||
|
i1, i2 = i2, i1
|
||
|
}
|
||
|
return progs[:i1] + string(progs[i2]) + progs[i1+1:i2] + string(progs[i1]) + progs[i2+1:]
|
||
|
}
|
||
|
|
||
|
func Partner(progs string, p1, p2 string) string {
|
||
|
return Exchange(progs, strings.Index(progs, p1), strings.Index(progs, p2))
|
||
|
}
|
||
|
|
||
|
func StdinToString() string {
|
||
|
var input string
|
||
|
scanner := bufio.NewScanner(os.Stdin)
|
||
|
for scanner.Scan() {
|
||
|
input = scanner.Text()
|
||
|
}
|
||
|
return input
|
||
|
}
|
||
|
|
||
|
func Atoi(i string) int {
|
||
|
var ret int
|
||
|
var err error
|
||
|
if ret, err = strconv.Atoi(i); err != nil {
|
||
|
log.Fatal("Invalid Atoi")
|
||
|
}
|
||
|
return ret
|
||
|
}
|