diff --git a/2017/day06/day06.go b/2017/day06/day06.go new file mode 100644 index 0000000..c7caa12 --- /dev/null +++ b/2017/day06/day06.go @@ -0,0 +1,81 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +func main() { + inp := StdinToString() + pts := strings.Split(inp, "\t") + var bnks []int + for i := range pts { + bnks = append(bnks, Atoi(pts[i])) + } + process(bnks) +} + +func process(bnks []int) { + var states []string + var dupe bool + var dupeIdx int + for !dupe { + balance(bnks) + newBnks := fmt.Sprint(bnks) + for i := range states { + if states[i] == newBnks { + dupeIdx = i + dupe = true + break + } + } + states = append(states, newBnks) + if dupe { + break + } + } + fmt.Println("= Part 1 =") + fmt.Println("Duplicate at step:", len(states)) + fmt.Println("= Part 2 =") + fmt.Println("Loop size:", len(states)-dupeIdx-1) +} + +func balance(bnks []int) { + var max int + for i := range bnks { + if bnks[i] > bnks[max] { + max = i + } + } + // bnks[max] should be the highest, let's redistribute it + var dist, idx int + dist, bnks[max], idx = bnks[max], 0, (max+1)%len(bnks) + for dist > 0 { + bnks[idx]++ + idx = (idx + 1) % len(bnks) + dist-- + } + // Should be balanced now +} + +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 +} diff --git a/2017/day06/input b/2017/day06/input new file mode 100644 index 0000000..b16e11b --- /dev/null +++ b/2017/day06/input @@ -0,0 +1 @@ +4 10 4 1 8 4 9 14 5 1 14 15 0 15 3 5 diff --git a/2017/day06/testinput b/2017/day06/testinput new file mode 100644 index 0000000..fa9ed7e --- /dev/null +++ b/2017/day06/testinput @@ -0,0 +1 @@ +0 2 7 0