101 lines
2.0 KiB
Go
101 lines
2.0 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"AOC2021/src/helper"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type foldingInfo struct {
|
||
|
alignment string
|
||
|
length int
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
args := os.Args[1:]
|
||
|
input, err := helper.GetInput(args[0])
|
||
|
if err != nil {
|
||
|
fmt.Println(err)
|
||
|
}
|
||
|
var points [][2]int
|
||
|
var folds []foldingInfo
|
||
|
for _, row := range input {
|
||
|
if helper.ContainsCharacter(row, ",") {
|
||
|
splitRow, _ := helper.MapToNumber(strings.Split(row, ","))
|
||
|
xValue := splitRow[0]
|
||
|
yValue := splitRow[1]
|
||
|
points = append(points, [2]int{xValue, yValue})
|
||
|
}
|
||
|
if helper.ContainsCharacter(row, "=") {
|
||
|
splitRow := strings.Split(row[10:], "=")
|
||
|
aligment := splitRow[0][1:]
|
||
|
length, _ := strconv.Atoi(splitRow[1])
|
||
|
folds = append(folds, foldingInfo{aligment, length})
|
||
|
}
|
||
|
}
|
||
|
part1(points, folds)
|
||
|
part2(points, folds)
|
||
|
}
|
||
|
|
||
|
func part1(points [][2]int, folds []foldingInfo) {
|
||
|
step1 := foldPaper(points, folds[0])
|
||
|
set := make(map[[2]int]struct{})
|
||
|
for _, point := range step1 {
|
||
|
set[point] = struct{}{}
|
||
|
}
|
||
|
fmt.Println(len(set))
|
||
|
}
|
||
|
func part2(points [][2]int, folds []foldingInfo) {
|
||
|
for _, fold := range folds {
|
||
|
points = foldPaper(points, fold)
|
||
|
}
|
||
|
printPaper(points)
|
||
|
}
|
||
|
|
||
|
func foldPaper(points [][2]int, fold foldingInfo) [][2]int{
|
||
|
var newPaper [][2]int
|
||
|
for _, point := range points {
|
||
|
newPaper = append(newPaper, foldPoint(point, fold))
|
||
|
}
|
||
|
return newPaper
|
||
|
}
|
||
|
|
||
|
func foldPoint(inputPoint [2]int, fold foldingInfo) [2]int {
|
||
|
direction := 1
|
||
|
if fold.alignment == "x" {
|
||
|
direction = 0
|
||
|
}
|
||
|
|
||
|
if inputPoint[direction] > fold.length {
|
||
|
inputPoint[direction] = fold.length - (inputPoint[direction] - fold.length)
|
||
|
}
|
||
|
return inputPoint
|
||
|
}
|
||
|
|
||
|
func printPaper(points [][2]int) {
|
||
|
maxX := 0
|
||
|
maxY := 0
|
||
|
for _, point := range points {
|
||
|
if point[0] > maxX {
|
||
|
maxX = point[0]
|
||
|
}
|
||
|
if point[1] > maxY {
|
||
|
maxY = point[1]
|
||
|
}
|
||
|
}
|
||
|
paper := make([][]rune, maxY+1)
|
||
|
for i := 0; i <= maxY; i++ {
|
||
|
for j := 0; j <= maxX; j++ {
|
||
|
paper[i] = append(paper[i], ' ')
|
||
|
}
|
||
|
}
|
||
|
for _, point := range points {
|
||
|
paper[point[1]][point[0]] = '#'
|
||
|
}
|
||
|
for _, row := range paper {
|
||
|
fmt.Println(string(row))
|
||
|
}
|
||
|
}
|