diff --git a/2016/day06/main.go b/2016/day06/main.go new file mode 100644 index 0000000..abac5e5 --- /dev/null +++ b/2016/day06/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "flag" + "fmt" + "math" + "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 := signalsAndNoise(util.ReadFile("./input.txt"), part) + fmt.Println("Output:", ans) +} + +func signalsAndNoise(input string, part int) string { + var grid [][]string + for _, line := range strings.Split(input, "\n") { + grid = append(grid, strings.Split(line, "")) + } + + var indexMaps []map[string]int + for col := 0; col < len(grid[0]); col++ { + indexMaps = append(indexMaps, map[string]int{}) + for row := 0; row < len(grid); row++ { + char := grid[row][col] + indexMaps[col][char]++ + } + } + + var mostVersion string // part 1 + var leastVersion string // part 2 + for col := 0; col < len(indexMaps); col++ { + var ( + mostChar string + mostLen int + leastChar string + leastLen int = math.MaxInt32 + ) + for k, count := range indexMaps[col] { + if count > mostLen { + mostLen = count + mostChar = k + } + if count < leastLen { + leastLen = count + leastChar = k + } + } + mostVersion += mostChar + leastVersion += leastChar + } + if part == 1 { + return mostVersion + } + return leastVersion +} diff --git a/2016/day06/main_test.go b/2016/day06/main_test.go new file mode 100644 index 0000000..daebf5c --- /dev/null +++ b/2016/day06/main_test.go @@ -0,0 +1,45 @@ +package main + +import ( + "testing" + + "github.com/alexchao26/advent-of-code-go/util" +) + +var example = `eedadn +drvtee +eandsr +raavrd +atevrs +tsrnev +sdttsa +rasrtv +nssdts +ntnada +svetve +tesnvt +vntsnd +vrdear +dvrsen +enarar` + +func Test_signalsAndNoise(t *testing.T) { + tests := []struct { + name string + input string + part int + want string + }{ + {"example", example, 1, "easter"}, + {"actual", util.ReadFile("input.txt"), 1, "afwlyyyq"}, + {"example", example, 2, "advent"}, + {"actual", util.ReadFile("input.txt"), 2, "bhkzekao"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := signalsAndNoise(tt.input, tt.part); got != tt.want { + t.Errorf("signalsAndNoise() = %v, want %v", got, tt.want) + } + }) + } +}