You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
2.5 KiB
Go

package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
type FoldAxis bool
const (
Y FoldAxis = false
X FoldAxis = true
)
type Fold struct {
direction FoldAxis
line int
}
func main() {
grid, folds := setUpGrid()
var count int
for i, f := range folds {
grid, count = fold(&grid, f.direction, f.line)
if i == 0 {
fmt.Println(count)
}
}
for y := 0; y < len(grid); y++ {
for x := 0; x < len(grid[0]); x++ {
if grid[y][x] == 1 {
fmt.Print("█")
} else {
fmt.Print(" ")
}
}
fmt.Println()
}
}
func fold(g *[][]int, axis FoldAxis, line int) (grid [][]int, count int) {
count = 0
if axis == Y {
grid = make([][]int, line)
for i := range grid {
grid[i] = make([]int, len((*g)[0]))
}
for i := 1; i+line < len(*g) && line-i >= 0; i++ {
aboveLine, belowLine := (*g)[i+line], (*g)[line-i]
newLine := make([]int, len(aboveLine))
for colNum := range newLine {
if aboveLine[colNum] == 1 || belowLine[colNum] == 1 {
newLine[colNum] = 1
count++
}
}
grid[line-i] = newLine
}
} else if axis == X {
grid = make([][]int, len(*g))
for i := range grid {
grid[i] = make([]int, line)
}
for i1, v := range *g {
for i := 0; i < line; i++ {
if v[i] == 1 || v[len(v)-1-i] == 1 {
grid[i1][i] = 1
count++
} else {
grid[i1][i] = 0
}
}
}
}
return
}
func setUpGrid() (grid [][]int, folds []Fold) {
folds = make([]Fold, 0)
file, err := os.Open("input.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
var maxX, maxY int
dots := make([][]int, 0)
for scanner.Scan() {
line := scanner.Text()
if line == "" {
continue
} else if strings.HasPrefix(line, "fold along x") {
f := Fold{X, 0}
fmt.Sscanf(line, "fold along x=%d", &f.line)
folds = append(folds, f)
} else if strings.HasPrefix(line, "fold along y") {
f := Fold{Y, 0}
fmt.Sscanf(line, "fold along y=%d", &f.line)
folds = append(folds, f)
} else {
dotPoints := strings.Split(line, ",")
dotPointsInt := make([]int, 2)
for i, v := range dotPoints {
num, _ := strconv.Atoi(v)
dotPointsInt[i] = num
if i == 0 && num > maxX {
maxX = num
}
if i == 1 && num > maxY {
maxY = num
}
}
dots = append(dots, dotPointsInt)
}
}
grid = make([][]int, maxY+1)
for i := range grid {
grid[i] = make([]int, maxX+1)
}
for _, v := range dots {
grid[v[1]][v[0]] = 1
}
return
}