From 1cac95e4f954c663458528b71c1571ee265cedfd Mon Sep 17 00:00:00 2001 From: alexchao26 Date: Sun, 29 Nov 2020 20:03:29 -0500 Subject: [PATCH] 2018 day06 solution, patch 2020 scripts missing flag.Parse() --- 2018/day06/input.txt | 50 +++++++++++++ 2018/day06/main.go | 132 +++++++++++++++++++++++++++++++++++ 2018/day06/main_test.go | 44 ++++++++++++ 2020/day01/main.go | 1 + 2020/day02/main.go | 1 + 2020/day03/main.go | 1 + 2020/day04/main.go | 1 + 2020/day05/main.go | 1 + 2020/day06/main.go | 1 + 2020/day07/main.go | 1 + 2020/day08/main.go | 1 + 2020/day09/main.go | 1 + 2020/day10/main.go | 1 + 2020/day11/main.go | 1 + 2020/day12/main.go | 1 + 2020/day13/main.go | 1 + 2020/day14/main.go | 1 + 2020/day15/main.go | 1 + 2020/day16/main.go | 1 + 2020/day17/main.go | 1 + 2020/day18/main.go | 1 + 2020/day19/main.go | 1 + 2020/day20/main.go | 1 + 2020/day21/main.go | 1 + 2020/day22/main.go | 1 + 2020/day23/main.go | 1 + 2020/day24/main.go | 1 + 2020/day25/main.go | 1 + scripts/template/template.go | 1 + util/Distance.go | 25 +++++++ util/StrToInt.go | 14 ++++ 31 files changed, 291 insertions(+) create mode 100755 2018/day06/input.txt create mode 100644 2018/day06/main.go create mode 100644 2018/day06/main_test.go create mode 100644 util/Distance.go create mode 100644 util/StrToInt.go diff --git a/2018/day06/input.txt b/2018/day06/input.txt new file mode 100755 index 0000000..8fbb08e --- /dev/null +++ b/2018/day06/input.txt @@ -0,0 +1,50 @@ +275, 276 +176, 108 +270, 134 +192, 224 +252, 104 +240, 271 +144, 220 +341, 303 +344, 166 +142, 347 +207, 135 +142, 353 +343, 74 +90, 210 +82, 236 +124, 295 +41, 226 +298, 109 +276, 314 +50, 303 +131, 42 +119, 335 +275, 125 +113, 289 +347, 230 +192, 329 +158, 316 +154, 356 +171, 350 +165, 59 +257, 129 +306, 55 +334, 203 +55, 63 +268, 198 +44, 103 +230, 199 +41, 181 +357, 328 +331, 85 +256, 290 +168, 290 +353, 77 +81, 328 +136, 316 +138, 213 +352, 271 +139, 222 +139, 318 +194, 239 \ No newline at end of file diff --git a/2018/day06/main.go b/2018/day06/main.go new file mode 100644 index 0000000..d165768 --- /dev/null +++ b/2018/day06/main.go @@ -0,0 +1,132 @@ +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) + + if part == 1 { + ans := part1(util.ReadFile("./input.txt")) + fmt.Println("Output:", ans) + } else { + ans := part2(util.ReadFile("./input.txt"), 10000) + fmt.Println("Output:", ans) + } +} + +func part1(input string) int { + coords := parseInputCoords(input) + + boundLeft, boundRight, boundTop, boundBottom := getBounds(coords) + + // maps coordinates to the number (count) of cells that they are closest too + coordsToMinDistanceCounts := map[[2]int]int{} + + for r := boundTop; r <= boundBottom; r++ { + for c := boundLeft; c <= boundRight; c++ { + bestManhattan := math.MaxInt16 + var coordsToBest [2]int + distCounts := map[int]int{} // dedeupe equidistant cells + for _, coord := range coords { + man := util.ManhattanDistance(r, c, coord[0], coord[1]) + if man <= bestManhattan { + bestManhattan = man + coordsToBest = coord + distCounts[bestManhattan]++ + } + } + + // do not increment anything if there were two equidistant coords + if distCounts[bestManhattan] == 1 { + coordsToMinDistanceCounts[coordsToBest]++ + } + } + } + + var largest int + for coord, val := range coordsToMinDistanceCounts { + // exclude edges + if coord[0] == boundTop || coord[0] == boundBottom { + continue + } + if coord[1] == boundLeft || coord[1] == boundRight { + continue + } + + if val > largest { + largest = val + } + } + return largest +} + +func part2(input string, dist int) int { + coords := parseInputCoords(input) + + boundLeft, boundRight, boundTop, boundBottom := getBounds(coords) + + coordsToTotalDist := map[[2]int]int{} + var area int + for r := boundTop; r <= boundBottom; r++ { + for c := boundLeft; c <= boundRight; c++ { + point := [2]int{r, c} + for _, coord := range coords { + coordsToTotalDist[point] += util.ManhattanDistance(point[0], point[1], coord[0], coord[1]) + } + if coordsToTotalDist[point] < dist { + area++ + } + } + } + + return area +} + +func parseInputCoords(input string) [][2]int { + lines := strings.Split(input, "\n") + coords := [][2]int{} // [row, col] + for _, l := range lines { + c := strings.Split(l, ", ") + if len(c) == 2 { + coords = append(coords, [2]int{ + util.StrToInt(c[0]), + util.StrToInt(c[1]), + }) + } + } + return coords +} + +func getBounds(coords [][2]int) (left int, right int, top int, bottom int) { + var ( + boundLeft = math.MaxInt16 + boundRight = -math.MaxInt16 + boundTop = math.MaxInt16 + boundBottom = -math.MaxInt16 + ) + for _, c := range coords { + if c[0] < boundTop { + boundTop = c[0] + } + if c[0] > boundBottom { + boundBottom = c[0] + } + if c[1] < boundLeft { + boundLeft = c[1] + } + if c[1] > boundRight { + boundRight = c[1] + } + } + return boundLeft, boundRight, boundTop, boundBottom +} diff --git a/2018/day06/main_test.go b/2018/day06/main_test.go new file mode 100644 index 0000000..21dc627 --- /dev/null +++ b/2018/day06/main_test.go @@ -0,0 +1,44 @@ +package main + +import ( + "testing" + + "github.com/alexchao26/advent-of-code-go/util" +) + +var arg1 = `1, 1 +1, 6 +8, 3 +3, 4 +5, 5 +8, 9 +` + +func TestPart1(t *testing.T) { + // Examples + want := 17 + got := part1(arg1) + if got != want { + t.Errorf("arg1: wanted %d, got %d", want, got) + } + + // Run actual problem input + want = 5333 + got = part1(util.ReadFile("input.txt")) + if got != want { + t.Errorf("actual AOC input, wanted %d, got %d", want, got) + } +} + +func TestPart2(t *testing.T) { + // Examples + distArg := 32 + want := 16 + got := part2(arg1, distArg) + if got != want { + t.Errorf("part2(arg1, %v): want %v, got %v", distArg, want, got) + } + + // Run actual problem input + // part2(util.ReadFile("input.txt")) +} diff --git a/2020/day01/main.go b/2020/day01/main.go index 5ec7c02..6058282 100644 --- a/2020/day01/main.go +++ b/2020/day01/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day02/main.go b/2020/day02/main.go index 5ec7c02..6058282 100644 --- a/2020/day02/main.go +++ b/2020/day02/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day03/main.go b/2020/day03/main.go index 5ec7c02..6058282 100644 --- a/2020/day03/main.go +++ b/2020/day03/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day04/main.go b/2020/day04/main.go index 5ec7c02..6058282 100644 --- a/2020/day04/main.go +++ b/2020/day04/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day05/main.go b/2020/day05/main.go index 5ec7c02..6058282 100644 --- a/2020/day05/main.go +++ b/2020/day05/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day06/main.go b/2020/day06/main.go index 5ec7c02..6058282 100644 --- a/2020/day06/main.go +++ b/2020/day06/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day07/main.go b/2020/day07/main.go index 5ec7c02..6058282 100644 --- a/2020/day07/main.go +++ b/2020/day07/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day08/main.go b/2020/day08/main.go index 5ec7c02..6058282 100644 --- a/2020/day08/main.go +++ b/2020/day08/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day09/main.go b/2020/day09/main.go index 5ec7c02..6058282 100644 --- a/2020/day09/main.go +++ b/2020/day09/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day10/main.go b/2020/day10/main.go index 5ec7c02..6058282 100644 --- a/2020/day10/main.go +++ b/2020/day10/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day11/main.go b/2020/day11/main.go index 5ec7c02..6058282 100644 --- a/2020/day11/main.go +++ b/2020/day11/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day12/main.go b/2020/day12/main.go index 5ec7c02..6058282 100644 --- a/2020/day12/main.go +++ b/2020/day12/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day13/main.go b/2020/day13/main.go index 5ec7c02..6058282 100644 --- a/2020/day13/main.go +++ b/2020/day13/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day14/main.go b/2020/day14/main.go index 5ec7c02..6058282 100644 --- a/2020/day14/main.go +++ b/2020/day14/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day15/main.go b/2020/day15/main.go index 5ec7c02..6058282 100644 --- a/2020/day15/main.go +++ b/2020/day15/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day16/main.go b/2020/day16/main.go index 5ec7c02..6058282 100644 --- a/2020/day16/main.go +++ b/2020/day16/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day17/main.go b/2020/day17/main.go index 5ec7c02..6058282 100644 --- a/2020/day17/main.go +++ b/2020/day17/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day18/main.go b/2020/day18/main.go index 5ec7c02..6058282 100644 --- a/2020/day18/main.go +++ b/2020/day18/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day19/main.go b/2020/day19/main.go index 5ec7c02..6058282 100644 --- a/2020/day19/main.go +++ b/2020/day19/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day20/main.go b/2020/day20/main.go index 5ec7c02..6058282 100644 --- a/2020/day20/main.go +++ b/2020/day20/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day21/main.go b/2020/day21/main.go index 5ec7c02..6058282 100644 --- a/2020/day21/main.go +++ b/2020/day21/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day22/main.go b/2020/day22/main.go index 5ec7c02..6058282 100644 --- a/2020/day22/main.go +++ b/2020/day22/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day23/main.go b/2020/day23/main.go index 5ec7c02..6058282 100644 --- a/2020/day23/main.go +++ b/2020/day23/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day24/main.go b/2020/day24/main.go index 5ec7c02..6058282 100644 --- a/2020/day24/main.go +++ b/2020/day24/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/2020/day25/main.go b/2020/day25/main.go index 5ec7c02..6058282 100644 --- a/2020/day25/main.go +++ b/2020/day25/main.go @@ -10,6 +10,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/scripts/template/template.go b/scripts/template/template.go index 21f8471..d7bbe2f 100644 --- a/scripts/template/template.go +++ b/scripts/template/template.go @@ -50,6 +50,7 @@ import ( func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") + flag.Parse() fmt.Println("Running part", part) if part == 1 { diff --git a/util/Distance.go b/util/Distance.go new file mode 100644 index 0000000..1b979f9 --- /dev/null +++ b/util/Distance.go @@ -0,0 +1,25 @@ +package util + +import ( + "math" +) + +func PythagoreanDistance(x1, y1, x2, y2 int) float64 { + xDiff := float64(x1 - x2) + yDiff := float64(y1 - y2) + + sumOfSquares := math.Pow(xDiff, 2) + math.Pow(yDiff, 2) + return math.Sqrt(sumOfSquares) +} + +func ManhattanDistance(x1, y1, x2, y2 int) int { + xDiff := x1 - x2 + yDiff := y1 - y2 + if xDiff < 0 { + xDiff *= -1 + } + if yDiff < 0 { + yDiff *= -1 + } + return xDiff + yDiff +} diff --git a/util/StrToInt.go b/util/StrToInt.go new file mode 100644 index 0000000..5d22064 --- /dev/null +++ b/util/StrToInt.go @@ -0,0 +1,14 @@ +package util + +import ( + "fmt" + "strconv" +) + +func StrToInt(in string) int { + num, err := strconv.Atoi(in) + if err != nil { + panic(fmt.Sprintf("converting string to number: %s", err)) + } + return num +}