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
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
|
|
}
|