2021 - Day 13
This commit is contained in:
parent
1f10b41e89
commit
8d1be969b5
9
2021/13/go.mod
Normal file
9
2021/13/go.mod
Normal file
|
@ -0,0 +1,9 @@
|
|||
module AoC/2021/13
|
||||
|
||||
require AoC/2021/common v0.0.0
|
||||
|
||||
require github.com/joho/godotenv v1.4.0 // indirect
|
||||
|
||||
replace AoC/2021/common v0.0.0 => ../common
|
||||
|
||||
go 1.17
|
2
2021/13/go.sum
Normal file
2
2021/13/go.sum
Normal file
|
@ -0,0 +1,2 @@
|
|||
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
|
||||
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
159
2021/13/main.go
Normal file
159
2021/13/main.go
Normal file
|
@ -0,0 +1,159 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
aoc "AoC/2021/common"
|
||||
"bufio"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type coordinate struct {
|
||||
x int;
|
||||
y int;
|
||||
}
|
||||
|
||||
func printGrid(grid [][]bool) {
|
||||
// Print grind
|
||||
for _, line := range grid {
|
||||
for _, pos := range line {
|
||||
if pos {
|
||||
fmt.Print("#")
|
||||
} else {
|
||||
fmt.Print(".")
|
||||
}
|
||||
}
|
||||
fmt.Print("\n")
|
||||
}
|
||||
}
|
||||
|
||||
func fold(input *bufio.Scanner, once bool) int {
|
||||
height := 0
|
||||
width := 0
|
||||
|
||||
var coords []coordinate
|
||||
|
||||
// Construct initial grid
|
||||
for input.Scan() {
|
||||
line := input.Text()
|
||||
if len(line) == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
c := strings.Split(line, ",")
|
||||
|
||||
x, _ := strconv.Atoi(c[0])
|
||||
y, _ := strconv.Atoi(c[1])
|
||||
|
||||
if x+1 > width {
|
||||
width = x+1
|
||||
}
|
||||
|
||||
if y+1 > height {
|
||||
height = y+1
|
||||
}
|
||||
|
||||
coords = append(coords, coordinate{x,y})
|
||||
}
|
||||
|
||||
grid := make([][]bool, height)
|
||||
for i := range grid {
|
||||
grid[i] = make([]bool, width)
|
||||
}
|
||||
|
||||
for _, c := range coords {
|
||||
grid[c.y][c.x] = true
|
||||
}
|
||||
|
||||
// printGrid(grid)
|
||||
|
||||
// Fold grid
|
||||
for input.Scan() {
|
||||
line := input.Text()
|
||||
|
||||
fmt.Println("Fold", line)
|
||||
instruction := strings.Split(strings.Split(line, " ")[2], "=")
|
||||
|
||||
axis, _ := strconv.Atoi(instruction[1])
|
||||
|
||||
switch instruction[0] {
|
||||
case "x":
|
||||
fmt.Printf("vertical fold along %d\n", axis)
|
||||
for y := range grid {
|
||||
for x := 1; x <= axis; x++ {
|
||||
grid[y][axis-x] = grid[y][axis-x] || grid[y][axis+x]
|
||||
grid[y][axis+x] = false
|
||||
}
|
||||
|
||||
grid[y] = grid[y][:axis]
|
||||
}
|
||||
|
||||
case "y":
|
||||
fmt.Printf("horizontal fold along %d\n", axis)
|
||||
for y := 1; y <= axis; y++ {
|
||||
for x := range grid[y] {
|
||||
grid[axis-y][x] = grid[axis-y][x] || grid[axis+y][x]
|
||||
grid[axis+y][x] = false
|
||||
}
|
||||
}
|
||||
|
||||
grid = grid[:axis]
|
||||
}
|
||||
|
||||
// We only do the first instruction
|
||||
if once {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// For part two the grid forms 8 letters
|
||||
if !once {
|
||||
printGrid(grid)
|
||||
}
|
||||
|
||||
// Count dots
|
||||
sum := 0
|
||||
for y := range grid {
|
||||
for x := range grid[y] {
|
||||
if grid[y][x] {
|
||||
sum++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sum
|
||||
}
|
||||
|
||||
func main() {
|
||||
challenge := aoc.New(2021, 13)
|
||||
|
||||
challenge.Test(`6,10
|
||||
0,14
|
||||
9,10
|
||||
0,3
|
||||
10,4
|
||||
4,11
|
||||
6,0
|
||||
6,12
|
||||
4,1
|
||||
0,13
|
||||
10,12
|
||||
3,4
|
||||
3,0
|
||||
8,4
|
||||
1,10
|
||||
2,14
|
||||
8,10
|
||||
9,0
|
||||
|
||||
fold along y=7
|
||||
fold along x=5`, []int{17, 16})
|
||||
|
||||
challenge.Solution(1, func (input *bufio.Scanner) int {
|
||||
return fold(input, true)
|
||||
})
|
||||
|
||||
challenge.Solution(2, func (input *bufio.Scanner) int {
|
||||
return fold(input, false)
|
||||
})
|
||||
}
|
Loading…
Reference in New Issue
Block a user