diff --git a/13/main.go b/13/main.go new file mode 100644 index 0000000..f17e87d --- /dev/null +++ b/13/main.go @@ -0,0 +1,143 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" + "time" +) + +func mustAtoi(line string) int { + i, _ := strconv.Atoi(line) + return i +} + +func main() { + start := time.Now() + partOne() + duration := time.Since(start) + partTwo() + duration2 := time.Since(start) + fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration) +} + +func makeScanner(test bool) *bufio.Scanner { + var f *os.File + if test { + f, _ = os.Open("inputs/testinput") + } else { + f, _ = os.Open("inputs/input") + } + reader := bufio.NewReader(f) + return bufio.NewScanner(reader) +} + +type point struct { + x int + y int +} + +func partOne() { + scanner := makeScanner(false) + + // parse points + points := make(map[point]struct{}, 0) + for scanner.Scan() { + line := scanner.Text() + if line == "" { + break + } + p := strings.Split(line, ",") + points[point{ + x: mustAtoi(p[0]), + y: mustAtoi(p[1]), + }] = struct{}{} + } + + // make first fold + scanner.Scan() + f := strings.Split(scanner.Text(), "=") + orientation := strings.Split(f[0], " ")[2] + crease := mustAtoi(f[1]) + if orientation == "y" { + for p := range points { + if p.y > crease { + delete(points, p) + points[point{x: p.x, y: p.y - ((p.y - crease) * 2)}] = struct{}{} + } + } + } + if orientation == "x" { + for p := range points { + if p.x > crease { + delete(points, p) + points[point{x: p.x - ((p.x - crease) * 2), y: p.y}] = struct{}{} + } + } + } + fmt.Println(len(points)) +} + +func partTwo() { + scanner := makeScanner(false) + + // parse points + points := make(map[point]struct{}, 0) + for scanner.Scan() { + line := scanner.Text() + if line == "" { + break + } + p := strings.Split(line, ",") + points[point{ + x: mustAtoi(p[0]), + y: mustAtoi(p[1]), + }] = struct{}{} + } + // do folds + for scanner.Scan() { + line := scanner.Text() + f := strings.Split(line, "=") + orientation := strings.Split(f[0], " ")[2] + crease := mustAtoi(f[1]) + if orientation == "y" { + for p := range points { + if p.y > crease { + delete(points, p) + points[point{x: p.x, y: p.y - ((p.y - crease) * 2)}] = struct{}{} + } + } + } + if orientation == "x" { + for p := range points { + if p.x > crease { + delete(points, p) + points[point{x: p.x - ((p.x - crease) * 2), y: p.y}] = struct{}{} + } + } + } + } + // find outer bounds of letters + maxy, maxx := 0, 0 + for p := range points { + if p.y > maxy { + maxy = p.y + } + if p.x > maxx { + maxx = p.x + } + } + // print letters + for y := 0; y <= maxy; y++ { + for x := 0; x <= maxx; x++ { + if _, ok := points[point{x: x, y: y}]; ok { + fmt.Printf("#") + } else { + fmt.Printf(" ") + } + } + fmt.Printf("\n") + } +}