From 0e058b5c42ba6b009a949fc412fe5b8d7c12667c Mon Sep 17 00:00:00 2001 From: alexchao26 Date: Thu, 24 Dec 2020 02:06:16 -0500 Subject: [PATCH] 2016-day16: strings.Builder to the rescue --- 2016/day16/main.go | 55 +++++++++++++++++++++++++++++++++++++++++ 2016/day16/main_test.go | 26 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 2016/day16/main.go create mode 100644 2016/day16/main_test.go diff --git a/2016/day16/main.go b/2016/day16/main.go new file mode 100644 index 0000000..c40caa9 --- /dev/null +++ b/2016/day16/main.go @@ -0,0 +1,55 @@ +package main + +import ( + "flag" + "fmt" + "strings" + + "github.com/alexchao26/advent-of-code-go/util" +) + +func main() { + var part int + flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() + fmt.Println("Running part", part) + + ans := dragonChecksum(util.ReadFile("./input.txt"), part) + fmt.Println("Output:", ans) +} + +func dragonChecksum(input string, part int) string { + disk := input + diskLength := 272 + if part == 2 { + diskLength = 35651584 + } + for len(disk) < diskLength { + var sb strings.Builder + sb.WriteString(disk) + sb.WriteByte('0') + for i := len(disk) - 1; i >= 0; i-- { + if disk[i] == '1' { + sb.WriteByte('0') + } else { + sb.WriteByte('1') + } + } + disk = sb.String() + } + + disk = disk[0:diskLength] + for len(disk)%2 == 0 { + var sb strings.Builder + for i := 0; i < len(disk); i += 2 { + if disk[i] == disk[i+1] { + sb.WriteByte('1') + } else { + sb.WriteByte('0') + } + } + disk = sb.String() + } + + return disk +} diff --git a/2016/day16/main_test.go b/2016/day16/main_test.go new file mode 100644 index 0000000..6d8ffda --- /dev/null +++ b/2016/day16/main_test.go @@ -0,0 +1,26 @@ +package main + +import ( + "testing" + + "github.com/alexchao26/advent-of-code-go/util" +) + +func Test_dragonChecksum(t *testing.T) { + tests := []struct { + name string + input string + part int + want string + }{ + {"part1", util.ReadFile("input.txt"), 1, "10010110010011110"}, + {"part2", util.ReadFile("input.txt"), 2, "01101011101100011"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := dragonChecksum(tt.input, tt.part); got != tt.want { + t.Errorf("dragonChecksum() = %v, want %v", got, tt.want) + } + }) + } +}