From aa678bf4ff34ee4d1fd402be358b4933f9bf78b8 Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Wed, 6 Dec 2017 06:47:52 -0600 Subject: [PATCH] 2017 Day 06 Complete! --- 2017/day06/day06.go | 81 ++++++++++++++++++++++++++++++++++++++++++++ 2017/day06/input | 1 + 2017/day06/testinput | 1 + 3 files changed, 83 insertions(+) create mode 100644 2017/day06/day06.go create mode 100644 2017/day06/input create mode 100644 2017/day06/testinput 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