This commit is contained in:
David 2021-12-13 19:02:42 -05:00
parent c09e706d42
commit 6b2abb3ebc
1 changed files with 143 additions and 0 deletions

143
13/main.go Normal file
View File

@ -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")
}
}