finish 2023

This commit is contained in:
2024-12-01 08:01:55 +00:00
parent 6753ed26ca
commit 2584df5496
13 changed files with 776 additions and 1 deletions

16
2023/go/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"args": ["16"],
"program": "${fileDirname}"
}
]
}

95
2023/go/day14/day14.go Normal file
View File

@@ -0,0 +1,95 @@
package day14
import (
_ "adventofcode2023/utils"
"adventofcode2023/utils/grid2d"
"adventofcode2023/utils/inputs"
"fmt"
_ "strings"
)
func Part1(input string) int {
grid := inputs.ToGrid2D[rune](input, "\n", "", ' ', func(c string) rune { return rune(c[0])})
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
slide(grid)
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
return score(grid)
}
func Part2(input string) int {
grid := inputs.ToGrid2D[rune](input, "\n", "", ' ', func(c string) rune { return rune(c[0])})
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
x:= 0
for j:=0;j<125;j++ {
for i:=0;i<4;i++ {
slide(grid)
grid = rotate(grid)
}
if score(grid) == 101375 {
fmt.Println(j, j - x)
x = j
}
}
fmt.Println(score(grid))
for j:=999999840+125;j<1000000000;j++ {
for i:=0;i<4;i++ {
slide(grid)
grid = rotate(grid)
}
if score(grid) == 101375 {
fmt.Println(j, j - x)
x = j
}
}
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
return score(grid)
}
func slide(grid *grid2d.Grid[rune]) {
G := grid.Matrix()
R := len(G)
C := len(G[0])
for c:=0;c<C;c++ {
for r:=0;r<R;r++ {
for dr:=0;dr<R;dr++ {
if G[dr][c]=='O' && dr>0 && G[dr-1][c]=='.' {
G[dr][c]='.'
G[dr-1][c] = 'O'
}
}
}
}
}
func rotate(grid *grid2d.Grid[rune]) *grid2d.Grid[rune] {
G := grid.Matrix()
R := len(G)
C := len(G[0])
New := grid2d.NewGrid[rune](R, C, '?')
NG := New.Matrix()
for r:=0;r<R;r++ {
for c:=0;c<C;c++ {
NG[c][R-1-r] = G[r][c]
}
}
return New
}
func score(grid *grid2d.Grid[rune]) int {
ans := 0
G := grid.Matrix()
R := len(G)
C := len(G[0])
for r:=0;r<R;r++ {
for c:=0;c<C;c++ {
if G[r][c]=='O' {
ans += len(G)-r
}
}
}
return ans
}

View File

@@ -0,0 +1,37 @@
package day14
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(
`O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....`)
require.Equal(t, 136, r)
}
func TestPart2(t *testing.T) {
r := Part2(
`O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....`)
require.Equal(t, 64, r)
}

100
2023/go/day14/input.txt Normal file
View File

@@ -0,0 +1,100 @@
O...#.O......#...##....O#.#.OO...O.#OO#.....#O.O.....#......#.OO...O...O..O#O#....#...O..O...O.....O
.OO......O.OO.O.#.#O.O...#.##OO.....#.#O#...OOOOO..##O#O..O#O.##O...#O....O#.#.OO....#.........O.O.O
......O.O.O.....O.#.#.#OO#O#.O...O.#.......#O....#.O.#....OOO...#....O#O.......#......O...O##...O...
O...##O..#....OO.OO....O...O...O#..##.OOO..O..#OO....###....OO.O.O...........O...O..O.....#.#..O.O#.
............#.#.##O.O.#.#OO#........O..O.O..##....O.#..#O..O...O#.#.#.........O...........OO......O.
#.OO........#..#O.#......#....#....#......OO..OO...O#...#...#..##..O#.O......#.#..O..#O#...#..#.O#.O
O.O.##...........O...O..O...O.OO.......##....#...O.....##...#.....OO...O.O#...OO..........O...O..#O.
.O##....#.O#O....O.O.#.#O.O#..OO..##..#OO.#...#......#.#O#.....O...O#.O...#..O.#.#......#.##.O....O.
.........#..#.O..O..O.O...#.#.O...#.OOO.##..#.O.....OO#....O...OOO#.O#....##O..#.O.O.....O.O.O.O..O.
......#O.....OOO###.O..O####O.#.O...............#..O......##O...#.#..###...O....#O...OO.OO.O......O.
#.O....#.O..#O...#...#...O....OOO.#O.#.#..#.....#.#..OO..#OO.......#OO.OOO....O.#O.#.O......####..O.
OOOO...#.OO.#....O...O.O...##....#OO...O.##.O.....###..O........OO..O.O.......#.#...O..#..O.#..O....
OOO..##....O...O.....O#..O.O.#..O..#.#.#..O........O..#OOO.....#....O#OO.#.#.....O..#..O...O..O.#OO#
...##.#.##.#O....O#..O..O.........#.#.#O...O.......O...O#..OOOO....O...O.OO#.O.##...#....O..O.......
....##.###OOO.O...#.......OO....OOO....O.OO#..O.#..OO....OO......O..OO...OOO.OO#...#..OOO..O.###O...
O###O.....O.O.#O#.O.O#O.O###.....O..O........#....#..O#..#.#..O...........#......#OO........O..O####
.#.#.OOO.O.......#O..O.#..O.OO.OO.O..O.#.#...O.O.OO..##..O...#...#O#..O.........O.O..O.O#....O..#O..
.#..#O.#O..#.O.O.O...#OO....#...O....O..O.O...#..#.##O.O..O..#O.....OO##...O#.......O#O.#..........#
#O...#.#OO.O...#O...O...#.#.O#..#.O#.###.#......O..O....#..#.OO..#....O..O.O....#.O.O.O.#..O..OOO..O
O.....#...#.#OOO.OOOO..#O.O.#...O.##..OO..#O...#.....OO#..#.#...O##OO...O.....O..#...#...........O.O
.##.O#.O..#O#.O##.O.#.........##.O......#OO...OO.......#...#O.O#...O..#.#...O..#...#O...O.#....OO.OO
.O#OO.O..#...#..O..O...##.O....###O.....O...#.#OOO...OO...O.......#.#.#.OO....#OO.#..O..........OO..
.....#OO.O..O.O.O...O.O#.#.O...O..#...O##.......#......#O...#.#.#....#..O.O..#..........O..#.#..#O..
...O.O.O.OO...O#..O..OO..O#.#.O.#OO..O.O..OO..O#...#.O#...O.......#..#..O..##..O..#O......O.OO...O.O
#.O....O.O.#...O.....O.....O#......#.#..OO...#.....O.#.#.O...#.#....#....O#.O.#......#OOO.O...O#....
...OOO......#..O..O#.......#....O#OO..#O.#.#...#...O.O..OO..#.O...O..#.....OO..O..#...#.O...O#..O.OO
#OO.OO#.OOO...##............O....O.O..#.##.#.O.........##...#O.O..#................#..O.O.O#O.O#..##
.O.O.O##..#O.O#O...##.#OO#...#.OO#..O...O#...O....O#..OO....O....#...O...#OO.OO#O....#..O..#OO....O.
.OO.#.......#...O...OO..#..OO.O.O.OO#O.O.O...O....O#..#.O.........O..#.O...#.#...O.O......O........O
.O....##..#....#.....O.#...O.O.#....#....OOOO...O.O###.O........O.....O.O..#.##OOO.O.......#.#.O..O.
.#.....O...#.O...#........#...#....#OO.O...O#O........OOO...#.O....OOO#.O.....OO....#.#...#..OO..#..
OO.OO...O..#..#O....O.O....OOOOO.#O.#O.O...#.O....O#.O.O.#O.#...#..O...O.#O.O.#..O....OOO......#.O#.
.O##..OO.....#.OO..#..O..#...#.#........O..OO...#O..O....#..O..O#.....O#..##O..O#.##.#...#.O..O.O.O.
..#...#O.....OO#.....O..#.#O.#.#..#..O.....#...OO.#.....O..O.O##.O.....OOOO.#O.....O.#..O........#.#
.#.#O..O.O..#..O##.....O.OO...##.........O...####..O..O....#O..O.....##........O.#..#.#OO.#..O.##.O#
#...#.O....OO......#O...#O..O#..#O#O.#..#.....OO....OO#..#O....O.O..#.O.#.....O#.O.OO..O#.O.O..O.O#.
OO....OO......#O........#O...#.#..O##....O#..#.#O.O.#....O..O..O.O....O.......#..OOO#.........O....O
O.....#O.OO##......#O##..O..O...##..O..........O..OO.O..#O....O..OOO#OO.##..#....O#..#...O.O.O...O..
.............#.#.#.O...#.#..#......O.#.O..#....#..##....#.##.##.#.O...O.O..#.#.#...OO....O..#O..#..O
.O.#.....O.O..O..##O...OO.#.O....#..#.#...O.O#...#O.O.OO...O..#..OO...O...O...O.....#.O..O#..#.#..OO
.....O..OO......#.#.#.O.##.OO...O..O.#..#...#OO....OOO......O.OO.#.O..O#O...O.#......OO##O.O.#O..O..
O##O.#.#..#..OO.O.........#O.#..O.#.##.O#..OOOO..#....O...O.........O..O..###...O...O.#.....O..##.O.
..O...#O#O.O...O.#..#O.......OO...........#...#..##.O......#..O.O.#OO.OO.#O....#.O.....O..#..#.#..#.
O#..O..##O#....O..OOO..OO...#O..O.O...O#O...OO.O##.O#O..#......OO##O.##...OOO.O..#....O##O..#......#
..#O...O..O.O...#..O.O...#O.....O.O......##OO#..O......#..O.#.O......OO.#O........O.....OO...O...O.O
........OO.#.OO..O......#...#...#..OOOO.OO.#....O.OO...O.##.....O.O....#O.#.OO..##.##..#.#O#.OO...O#
....#......#O.OO.....OOO....OO..O.O.O....##..O..O.O#.O....O.#O.#O.....O..O........#O.....O.O.....O#.
#.O#.O#......##.....O.#O...###...##....#O#.#.#....OO...O..#.O....O..#..#..O..........O......#.O.O...
.O.#..O#.OO....O.#...#O....#....OO......#O.O..#O..........O.#..#...#OOO........#.#.........O.#..O...
#OO.OO..O..O.O.#O.O.....O.##..#.O#..#.O....#........#.OOO#.#.....#.#.......O#..##..#.OO....O#O#.....
.......#O.O....#.OOO..OO...O...#....O..#.#....OO..O....O.#.O.#O#..O#.#.O..O......##...OO..#....O.#..
.O..O#.#OO.O.O.O.##...O..O.O..O.##O...#.O..O..O..O..O.....O...#..OO#O..O###...#...#....O##.OO...#...
#O....#...##..O..#...#OO.O.O.#......O...O.#.#O..O...O....OOO..O.O..O...O.OO...O...#..O....O#.###....
....#..O.....##.O.......##.##..OOO.O.#.#.....#....O..#..O....#....O...#.O..O#..O##...#.##....O.#OO##
O....O...OO.O........#..O...#..#.....O......O.O.OO.OO..#....O..O.............##.O.....##O#.OOO......
........#.O.####O.OO.#.O..O.O.#.#....OO#.......O..#....##.OOO..O.O.O..#.O.#...O.O.O..O.##O..O#....O.
...#....#.....O....O.O.O##.O..#O.OO...#.##.O..###OO##.O......#..##.OO...O.......O.......#..O.#.O..O.
.O.O...O......OO.#....#O..O.O.O..OO.O..O##O...O....O..OO.#..O....O..#.O..OO.OO....O#O..#.O..#O...#.#
..O#O.#O..#...##..#.O...OO..O#.......#..O........#.OO#..O#.#.#O....##...O.........O......OO#.....O.#
....OO.......###..O#.....O##..#O..#..#.O.....##.......##..O#O....#....#O.O..#..#..O.###O..#.O#......
O..##..O...#..O...O#OOO....#.O##O.#........#.O..O.#..#.OO.#O.#.....##.O..O.O....#..#..OO....#..#..##
.#...O.OO#O.O..O.##O..O#...##...O....OO.O#....#...#O.O#....O..........#....#............##.......#..
.O.#........##O...#O..O..O....OO#O....#.O..OO.##..O..OO#.###OO.....#..#.......O.#.....OO........OO.#
.OO...O.#..##.....OO..O.O.O.#.###.##.O.#..O..#..O..O...##.#......O....O.O.........O..#.O.O#O.#O...#.
#..#.#..O...##.....OO#O.OOO.....#...#.....##.#...O....O....#..OO#.#.OO....#.....O.O...O#.#..#..O#O.O
.O#.O.#..O..O#...OO...O...O#...O..O..#.O..#...O#.#....O......O#...O...OO.O##.#O....O....#OO....#O...
OO..OOO.O......OO...OO#O...#.#.#O.OOO#....#.OO#.#.O.#......O.O.OO#..O..#..O.O#.O#.O....O..O...O.....
...OO....O...#OO#..#..O.#O#....O.....OO.O.#.OO##.....#..O#.OO..#.#.O#..#..O.#..O....#....O.#O...OO#O
..#.......OO..##.O#...O#....O.#.O..##..#O.......#O#......O..O.........O#..#OO..O..#O.#.#.O.O#.#OO#.O
...#O#...O...OO...OO..OO...#OO...O...##.O....##.#O##.O....#..O#..O.....O.......###.#.OO#...O......#.
.O.OO#O##O##...#..#....#..#O...O#..O.O##......#........#O.........#.O....O..#..O.....O..#......O.#.#
..#....#.O.O.O..O.....O.O#O.O..#......O............O.........O#.O....#.O#..O..O.#OO.....#......O...#
OO...#..O..O##.#.#O.O.#.#....O....O...O.#..O##...O...#.O...#.O.OO...#........O#O..O.O.O..O.....#.O..
.OOO....#...O..O.....O..O...O...O..O...O#...#O....O.O...#..OO##.O.#..O..........O#..#..#..OO#.....#.
O..#..O#....#O..##O..#.#.......OO..O..#...O....O.#....O..O.##........O...O..OO...#....OO#..O.#.#.#..
O#O.O.O#.#OO#..OO.O.#......#.....#.......##.O..#.O..#..OO..O.#.#.O.O.O#.#......O....####OO#.#O#OO.#.
.#.....O#..O#O#..OO...#.O.#....#.#..##....O##....#.........##OO...##...O......#.OO...#O....O.O.O#O..
O......#.O....O...O.....OO.#....#O.##....#.O.O...O..#...O....#.O....O.O....#.OO.#.......#...#..#...O
...#OO..#......#..OO.O.O.##.O....O.##O##.OO#O.O.O..O.#O#O.OO...........O...###.#......O..#..#O#..OOO
O..O.#..O.OO.O...OO.OO..OOOO....O...#....##.OO.O.....#.......O.O........O.#.......#.......#..#.O..O.
.OO.##...#O..O#....O....#..O#....#.....O...O#.....OOO#.....................#..#..#..#O.......O.#OO..
.#OO..O....O..#.....#O...OO.#....#.#.O...O.#........O...O..O..OO#..#.....#.......OOOOO.OO....O....O.
.O#...#.......O.O...O.O.O#...OO.O#...O#O.O.#......#......O..O##.##.....O.....##...........O#...O....
.#.O.O#.....O.#..OO......#O.#..O..O.O.O..#.#...O##.#O..OOO......#...#..OO...O.#.....#O.OOO...#.O..##
.........O..##OO.#OOOO.O.O..OOO...OO.#.....#...O.#O##..O#..#.#..#...#..O.O...#OO.O...O...#O...#..#..
.#.#O.#...#OO.O.........O#..O...OO#.....O....OOOO#.....O.O....#...O...........O#.#.O..O.#.O.#.O.#.#.
......O.#...O.....O.O..O#...O.#........#.O...O.O....#..O#....O.#.O.O....O...#OO...#........OO..O.O.O
....O.O..OO.....#...OOOO.O#............O#OO....OOOOOO..#..#O#..#.#.O.OO.#O.....O.#......##..O#..#O..
..#......#...#O.#..#.#....OOO#...O.#....O..#O.....O.....O.O......O.......O.O..O..O.OO.O.#OO..O#...#.
.O.#.O.OO..O#.O#OO..........O.......O..#..#.#..O...#...##.....####...#........##O.......#....#...O##
........#.#.O.#O.......#O...O...#.#O..#OOO..#O..###...O.#.#O...O.O#..O..O...O.O....###.OO.#OO..O.#.O
..#O....#..O..####.O#...O....O.#O.##.O....O.O......O#O...OO###...O..#........#.#O.O#OO.......#.....O
....O.....#.#.O.#..O.#O.#.#O.#.......OO.....OOO...O.O..#.#....#..O.O..#.OO.O..O..OO##.....#.O..OO#O.
O#O..OO.O....OO.#O......O......#...#.....O.#OO.#.....OO..O#.O..O.O...#....O.O..OO.O....#....OO..O...
...O.....##....#....#....#......O#O..OO.....OO#O.OO......#OO.......O.#..###OO...#.O..OO.#.O.O#OO..#.
.O.#.O..#O.....#.#O....##OO.#O..##..##.##...#OO.O.#O#..O..O.O..O..##O.O.....O.OOO..#..#O..O#..OO...O
..##O#O.O.#.........O....O.OO#O#O.....O.....O#O.OO.O......O.O.OO......#.....O.O.O.O.O.....#.O.......
.....#OO.#O........O#....O.#OO.OO........#.O....O.OOOOOO.#.#O......O.#...O#.O.O..OO.....O.OO...#.O.#
.....#................OO..OOOO..#.....O.###O.O...O..#O..........OO.#...OO.O#...O......O..OOOO.#..###
O.....O...#O.#..........#O......O..OOO#....O.OOOO....O..#..#O....O.....O#..O..#.O.O....#OO.#....#O..

80
2023/go/day15/day15.go Normal file
View File

@@ -0,0 +1,80 @@
package day15
import (
"adventofcode2023/utils"
_ "fmt"
"strings"
)
type Lens struct {
label string
fl int
}
func Part1(input string) int {
ans := 0
seqs := strings.Split(input, ",")
for _,seq := range seqs {
ans += hash(seq)
}
return ans
}
func Part2(input string) int {
Boxes := [256][]Lens{}
cmds := strings.Split(input, ",")
for _,cmd := range cmds {
if cmd[len(cmd)-1] == '-' {
label := cmd[:len(cmd)-1]
hash := hash(label)
nl := []Lens{}
for _, lens := range Boxes[hash] {
if lens.label != label {
nl = append(nl, lens)
}
}
Boxes[hash] = nl
} else {
tokens := strings.Split(cmd, "=")
label := tokens[0]
fl := utils.MustAtoi(tokens[1])
hash := hash(label)
nl := []Lens{}
if len(Boxes[hash]) == 0 {
Boxes[hash] = append(Boxes[hash], Lens{label:label, fl:fl})
} else {
found := false
for _, lens := range Boxes[hash] {
if lens.label == label {
nl = append(nl, Lens{label:label, fl:fl})
found = true
} else {
nl = append(nl, lens)
}
}
Boxes[hash] = nl
if ! found {
Boxes[hash] = append(Boxes[hash], Lens{label:label, fl:fl})
}
}
}
}
ans := 0
for i, box := range Boxes {
for j, lens := range box {
ans += (i+1) * (j +1) * lens.fl
}
}
return ans
}
func hash(in string) int {
result := 0
for _, letter := range in {
result += int(letter)
result = result * 17
result = result % 256
}
return result
}

View File

@@ -0,0 +1,17 @@
package day15
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1("rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7")
require.Equal(t, 1320, r)
}
func TestPart2(t *testing.T) {
r := Part2("rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7")
require.Equal(t, 145, r)
}

1
2023/go/day15/input.txt Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

202
2023/go/day16/day16.go Normal file
View File

@@ -0,0 +1,202 @@
package day16
import (
_ "adventofcode2023/utils"
"adventofcode2023/utils/grid2d"
_ "adventofcode2023/utils/grid2d"
"adventofcode2023/utils/inputs"
"fmt"
_ "strings"
)
type Tile struct {
object rune
energized int
}
type Beam struct {
dir rune
r int
c int
rm bool
}
var startBeams []Beam
func Part1(input string) int {
beams := []Beam{}
beams = addBeam(beams, Beam{'s', 0, 3, false})
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
return score(grid, beams)
}
func Part2(input string) int {
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
G := grid.Matrix()
R := len(G)
C := len(G[0])
ans := 0
for r:=0;r<R;r++{
beams := []Beam{}
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
beams = addBeam(beams, Beam{'e', r, 0, false})
ans = max(ans, score(grid, beams))
beams = []Beam{}
beams = addBeam(beams, Beam{'w', r, C-1, false})
grid = inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
ans = max(ans, score(grid, beams))
}
for c:=0;c<C;c++{
beams := []Beam{}
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
beams = addBeam(beams, Beam{'s', 0, c, false})
ans = max(ans, score(grid, beams))
beams = []Beam{}
beams = addBeam(beams, Beam{'n', R-1, c, false})
grid = inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
ans = max(ans, score(grid, beams))
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func score(grid *grid2d.Grid[Tile], beams []Beam) int {
fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { return string(t.object)}))
G := grid.Matrix()
R := len(G)
C := len(G[0])
fmt.Println("r:", R, "c:", C, "tiles:", R*C )
for i:=0;i<1000;i++ {
beams = rmBeams(beams)
fmt.Println(i, ":", len(beams), ":", energy(G))
for i, _ := range beams {
r := beams[i].r
c := beams[i].c
if r >= 0 && r < R && c >= 0 && c < C {
G[r][c].energized++
switch beams[i].dir {
case 'n':
tile := &G[r][c]
switch tile.object {
case '.':
beams[i].r--
case '|':
beams[i].r--
case '-':
beams[i].dir = 'e'
beams[i].c++
beams = addBeam(beams, Beam{'w', beams[i].r, beams[i].c-1, false})
case '\\':
beams[i].dir = 'w'
beams[i].c--
case '/':
beams[i].dir = 'e'
beams[i].c++
}
case 'e':
tile := &G[r][c]
switch tile.object {
case '.':
beams[i].c++
case '-':
beams[i].c++
case '|':
beams[i].dir = 'n'
beams[i].r--
beams = addBeam(beams, Beam{'s', beams[i].r+1, beams[i].c, false})
case '\\':
beams[i].dir = 's'
beams[i].r++
case '/':
beams[i].dir = 'n'
beams[i].r--
}
case 's':
tile := &G[r][c]
switch tile.object {
case '.':
beams[i].r++
case '|':
beams[i].r++
case '-':
beams[i].dir = 'e'
beams[i].c++
beams = addBeam(beams, Beam{'w', beams[i].r, beams[i].c-1, false})
case '\\':
beams[i].dir = 'e'
beams[i].c++
case '/':
beams[i].dir = 'w'
beams[i].c--
}
case 'w':
tile := &G[r][c]
switch tile.object {
case '.':
beams[i].c--
case '-':
beams[i].c--
case '|':
beams[i].dir = 'n'
beams[i].r--
beams = addBeam(beams, Beam{'s', beams[i].r+1, beams[i].c, false})
case '\\':
beams[i].dir = 'n'
beams[i].r--
case '/':
beams[i].dir = 's'
beams[i].r++
}
}
} else {
beams[i].rm = true
}
}
fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { if t.energized > 0 {return "#"}; return "."}))
}
fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { if t.energized > 0 {return "#"}; return "."}))
return energy(G)
}
func rmBeams(slice []Beam) []Beam {
var result []Beam
for _, value := range slice {
if ! value.rm {
result = append(result, value)
}
}
return result
}
func addBeam(beams []Beam, beam Beam) []Beam {
for _, value := range startBeams {
if value == beam { return beams }
}
startBeams = append(startBeams, beam)
for _, value := range beams {
if value == beam { return beams }
}
return append(beams, beam)
}
func energy(G [][]Tile) int {
ans := 0
R := len(G)
C := len(G[0])
for r:=0;r<R;r++ {
for c:=0;c<C;c++ {
if G[r][c].energized > 0 {
ans++
}
}
}
return ans
}

68
2023/go/day16/day16.py Normal file
View File

@@ -0,0 +1,68 @@
#!/usr/bin/python3
import sys
import re
from copy import deepcopy
from math import gcd
from collections import defaultdict, Counter, deque
D = open(sys.argv[1]).read().strip()
L = D.split('\n')
G = [[c for c in row] for row in L]
R = len(G)
C = len(G[0])
DR = [-1, 0, 1, 0]
DC = [ 0, 1, 0,-1]
def step(r,c,d):
return (r+DR[d], c+DC[d], d)
def score(sr,sc,sd):
POS = [(sr,sc,sd)]
SEEN = set()
SEEN2 = set()
while True:
NP = []
if not POS:
break
for (r,c,d) in POS:
#print(r,c,d)
if 0<=r<R and 0<=c<C:
SEEN.add((r,c))
if (r,c,d) in SEEN2:
continue
SEEN2.add((r,c,d))
ch = G[r][c]
if ch=='.':
NP.append(step(r,c,d))
elif ch=='/':
# up right down left
NP.append(step(r,c,{0:1, 1:0, 2:3, 3:2}[d]))
elif ch=='\\':
NP.append(step(r,c,{0:3, 1:2, 2:1, 3:0}[d]))
elif ch=='|':
if d in [0,2]:
NP.append(step(r,c,d))
else:
NP.append(step(r, c, 0))
NP.append(step(r, c, 2))
elif ch=='-':
if d in [1,3]:
NP.append(step(r,c,d))
else:
NP.append(step(r, c, 1))
NP.append(step(r, c, 3))
else:
assert False
POS = NP
return len(SEEN)
print(score(0,0,1))
ans = 0
for r in range(R):
ans = max(ans, score(r,0,1))
ans = max(ans, score(r,C-1,3))
for c in range(C):
ans = max(ans, score(0,c,2))
ans = max(ans, score(R-1,c,0))
print(ans)

View File

@@ -0,0 +1,37 @@
package day16
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(
`.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|...`)
require.Equal(t, 46, r)
}
func TestPart2(t *testing.T) {
r := Part2(
`.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|...`)
require.Equal(t, 51, r)
}

110
2023/go/day16/input.txt Normal file
View File

@@ -0,0 +1,110 @@
\.......................\..........................................-..................-.../................-..
....../.......\...-......-.|...\..............\.................|............././....-........................
...............-...-........................................\......\..-.............|......-....\....-........
..\..|.|...........................-.|........................................./.|....|................|......
|../................|............................................................\........../..\..............
........\............../................/..........................\...\....|............./....-.........\\...
.................-...-...................\../........-|.................../......-...........|................
........-............/...|-............-.....\.|..............-....-../\../..................\...\././........
........................-|................................................................-........-..........
-......./.................|.....\.................\.....//............-........./..../....|...................
....-.............-........-..........-|.......|...../...\...................\.....................|..........
...|...\.........|.................|.....|....-....\.......\./........................-.../..../.....-........
....|....-.-..............\.........|.......................-.......-..............\................/.........
.....|.\...........-.................-.-........../...\............|...............|...|......./.......|...../
.....\.........................-.../..-./...\...................../......\...-.......|.\........-|............
............|.....................................-....../....\.............../-...|...\..\................./.
......-./|....../............|.........\............-../...-......./.\..\....../......|/...\..................
................................|.......|..-..../.............................../.-..................-..-/..|.
...............................-......./......................|./...............-............./....../........
..................../....................\........\...........................-............/.../..............
.|||......../.................|.................../..\............................-......./..|...|/.-.........
......-......./\....../.........|....../.......-...............|.\........-............/.../..................
.....................-.\/|................//.../.........|.|......\.-..|.........|.........\..................
.........................\/.......|.|............................|........|.............................././..
.................................|.................\../..|/.................\.................-...-........-/.
......................-...-.........../...........................\....\......-..-.......\.-....\....|........
......-......../..............\/..................\..|........-..............|...-...../......|...............
|.......|.../....|..............//.....................|..........|/......../................|................
...|.|..................../|..../.-.......-...........|.....|./....\......-......-................|...........
......\/./.|\..../|.|..|..........-....|...........|.-.|...................-.\.....|....................\.....
......../.\......................|.....|...........|.........../.......|....|...|.......-......../......\...-.
...|...-...||......-..|..-...........|.-.................|.................................-..................
..............-.\.-........|......\..........................................\./.\........../.....|...........
../\.........|...............|............|.\/.-/.................-....|...-.................-.....|..../.....
....................../......../..../-.....\........................\..-.\....|....-.........../-.............
.................................|................|.........|................../|.....|....\\............/.\..
...///./.....\.................|/.....................\...................-............|................|.....
............-...........................--........\................/.............-\................\.....-.../
...............\.........../|............................|.....................\...-...\.....................-
...\.............|.............|................\............\|...../...|.........................|...........
..................|......|..........-.-..............\.........................\..............................
....-................../.........../...|................/...............|./.|.../....\..../......./......//...
...../....../..............................|...\../..........-..........-........-..//..../...................
...............-......|......................|./........./............/..-...........|../.....-........-./....
..\.........................|...-.......\.................|..............-........\....-.............-....|...
.......|......|....../........\...........|......-........../......-..................../....................\
.......................|....-..|........./.|.-...............|..\......\.....-.......\...-/....|/.........\...
\......\..-.....................\..........................\................................../...........\...
-....-......../............................................................../.\.......|..............|....-..
........|......................|.............-....\................................./..\.......|..........-...
...-...............|........./......\...../.......|...|...............\.../...\.../......|.....-.\......\.....
............./.....|......................|.....................................\...||.................-....|.
./.....-................/........|./....-......../......./..............\..................................\..
.../..../\........-..........................|.-/.|..\................\\-.......|......./...||.......|........
.....-.........................-...............\...........|.............-.\.../.|......-.|......../...-.....-
......\....................|...../......................|.../......-..|............|......./.../.........|....
...|...........-....................................../.|............./....|..../........./.....\../..........
....../.../................\........................\...\....\......\............../|...............\.-.......
./....\.../.............|............................-.../............../............/...........\...|........
............................|.................|/..........//.........../..-...............|...................
.....\......\.................|.....|...\-./...............\................|....../.....-..\........-....-...
........................./-........\................./........-/.|....-.......\............-/\......|.\...-...
..../../..|.|...............\.......................................-.........................................
...........|...................................................-...-......|..................\............../.
/....|......................................................................|\.../.......-...........-...|....
......|.-.\......-........|.....-..|.\..............-......./......-|.........................-...............
............\......................................|........................|.-...............................
.........-.........../....\./....../.-...-..//.........../.......\\...........................................
........\......../............./...-......\.../..|..|............................../......../..\..............
--.........|.....-...|............../...|.......|..............\|............|.........................|.-....
-\......./..............-....-....\...|.-........\/.\./............-/...\........|-.........../../...\........
.\|\..............-......-.\...-....\..........................\........|...........-......./.............../.
..........................|...\..../.../..........\.............-...//...............\..................-.....
........./..........................\............|-.....|..-...|......../........-...........................\
.......\.../.....\....../.......|..|...............-......................|....-...................-.|........
......|.......\.../..............................-..............................|......-.-...................\
/.....|.......-............/|.....|-......./..../......-........../..|......../.-..\..../....../...|..........
............/..--..........-............\.......\................\........................../../....|.........
..|..-................|.|..|................/.......\............-//.......................\..\...............
.......................-......-..................|....\................-......\.|....\....|..../../|.-........
........................-..................-...........................-..-................-................|.
/.\....|.-.................................\..-.....\./.........../-.|..............\..\.....--|/....\........
.......-..-../..................\..--|..............|...............|\........|...--................|./.\.....
..........|................-.......|..................................................|...................|...
-.-..|....-.|........-./...|.-.........\.....\/........-........\........../................./.../........\...
..................../...|/......................................../............\.|./../................/\|....
...//.........................\....../..............\../.......-..\....|......................................
............................./..|./../.........-/..\..........................................................
......\.....|..................|..................\.....\.-..\...../............................../...........
..........\...........-..........-.....-....\/................../.................................\.....|..\..
..../.\...................................\............\...\....|.................|.....................-.....
...........-...........................\.......|-../.|....|.....|......................-...../................
.......|.........\..............|....\...-......../...........-.....-..-...........-..................\...\.|.
...........|.......................|....-..........\............................\.................../.\.......
..../.................\.......-..|.................../........................|...............\...........-.|.
............./..|.-\..../.....-............-....|..\......|......../............-.........|................\..
...................\...\/......\............|......................\....|...................-./-..............
..-\...........|.................../.....|....|............................-..|............\.............\....
.|.....\....\........|..................\...............|..-/.........|.-/...........-............-...........
.....\...../......-............|........./..|............-........................\....-......................
......\......../........|..............\...-..-...|.......................................................|...
...................|.................................\.....\...........................|../.|.-......-........
..................|..............\.....\............|........../....../...............\.........\.............
..|...........-..../....\.........--...\................../.............-...-....................-..../....|..
.|...\...................|......-...........-\..........\.....|.....|..........|.........|....|-../...........
.............\|...................../\...............\....../.......-....\.....................-..............
.......//.....................\....\......\......\.........|...................../......../.........\......-..
.\./.........-...-./-.\.............../......|................................\|....\...../....-..............
.......|......../......../......./.........../...............|............................../..|......../.....
............./.........|.....-./.........../....-......./|......-................|............................

View File

@@ -20,6 +20,9 @@ import (
"adventofcode2023/day11" "adventofcode2023/day11"
"adventofcode2023/day12" "adventofcode2023/day12"
"adventofcode2023/day13" "adventofcode2023/day13"
"adventofcode2023/day14"
"adventofcode2023/day15"
"adventofcode2023/day16"
@@ -70,6 +73,15 @@ func main() {
case 13: case 13:
fmt.Printf("part 1: %d\n", day13.Part1(utils.Readfile(d))) fmt.Printf("part 1: %d\n", day13.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day13.Part2(utils.Readfile(d))) fmt.Printf("part 2: %d\n", day13.Part2(utils.Readfile(d)))
case 14:
fmt.Printf("part 1: %d\n", day14.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day14.Part2(utils.Readfile(d)))
case 15:
fmt.Printf("part 1: %d\n", day15.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day15.Part2(utils.Readfile(d)))
case 16:
fmt.Printf("part 1: %d\n", day16.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day16.Part2(utils.Readfile(d)))
default: default:
panic(fmt.Errorf("no such day: %d", d)) panic(fmt.Errorf("no such day: %d", d))
} }
@@ -77,7 +89,7 @@ func main() {
// Reads day from os.Args. // Reads day from os.Args.
func day() int { func day() int {
latest := 12 latest := 15
if len(os.Args) == 1 { if len(os.Args) == 1 {
return latest return latest
} }