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 }