This commit is contained in:
parent
aa0a2b7b7d
commit
aa84e3974b
10
aoc2024/day06/example.txt
Normal file
10
aoc2024/day06/example.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
....#.....
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
..#.......
|
||||||
|
.......#..
|
||||||
|
..........
|
||||||
|
.#..^.....
|
||||||
|
........#.
|
||||||
|
#.........
|
||||||
|
......#...
|
130
aoc2024/day06/input.txt
Normal file
130
aoc2024/day06/input.txt
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
........#........................................#......#........#................................................................
|
||||||
|
....................................#......#.....#............#.............#..........#..........................................
|
||||||
|
......................#.......................................................#...................................................
|
||||||
|
.......#..#..#....#...#...#....#..............#......#.......#...#................#.......#.......................................
|
||||||
|
......................#....##...#.......#....#.......................................#....................#.......................
|
||||||
|
...#............................#........................................#..........................#.....................#.......
|
||||||
|
....................#............#...............#......#.........#...........#...................................................
|
||||||
|
............................#......#...#................#.............#...........................................................
|
||||||
|
.....#..#.........#....................#......................................................#........................#.........#
|
||||||
|
.........#..##.#.........#.............................................#...........#........#....................##...............
|
||||||
|
...............#....#.........................##......#.....................#..............................................#......
|
||||||
|
..................##...................................#...........#........#....#.............#..................#........#.#....
|
||||||
|
....................................#...................#..............................#............#.............................
|
||||||
|
.........#.....#................#..........................................#...................................#..............#...
|
||||||
|
...#....................#...................................#..##...................#.......#......................###.........#..
|
||||||
|
....................#............#....#.##....#.........#......#...#........................#.......................#..........#..
|
||||||
|
..............#...................................................................................#....................#..........
|
||||||
|
.........#................#..............................#............................#...#.................#...............#.....
|
||||||
|
............................................................................................#...#............................#....
|
||||||
|
............#....................#................................#....#...............................#....#.....................
|
||||||
|
........................................#.........#..................................................#..#..................#......
|
||||||
|
.............#.#............................#..#.....#............................................#....#..........................
|
||||||
|
................................................................................................#.........#..#..............#..#..
|
||||||
|
...........#..........#.#..#................#.#..#...#.........#..........................................#..........#..#.........
|
||||||
|
.............................#....................#.......#....#.....#....#......#....................#..#...............##.......
|
||||||
|
..........#..............................................................................#....#.........#..#................#.....
|
||||||
|
..#..#...............................................................#.......#........#...........................#...............
|
||||||
|
...........................................................................#...##....................#.#....##....................
|
||||||
|
.......................................#...............................................#.....................#.........#..........
|
||||||
|
.......................................................#.......#....#................#.....................................#......
|
||||||
|
.............#................#...................#.................#....................#..................#.#.........#.........
|
||||||
|
.....................................................................#.....................................#......................
|
||||||
|
........................#..........................................#....#..#.#..........................................#.........
|
||||||
|
............#.......#..................#.................................................#..............#.......................#.
|
||||||
|
.........................................................#...............#...#....#...........#.................................#.
|
||||||
|
.........................#..........................#..#........................................................#.................
|
||||||
|
...............#....................................#.......#......................................#............#.................
|
||||||
|
.#......................................................................................................#.........................
|
||||||
|
#...#........................................................#.................#....#....................#...........#............
|
||||||
|
..#.........#................................................................#................................#.............#.....
|
||||||
|
..................................#.........................................................................#................#....
|
||||||
|
..............#..............................................#........#..................................#........................
|
||||||
|
......#............................................#.................................#............................#...............
|
||||||
|
.......##..#.......................##............#...#...................#.#..........................................##..........
|
||||||
|
.#......#.....................................................................#..#..........................#......#.............#
|
||||||
|
.................#.....................#........##..#.........#........#................#.........................................
|
||||||
|
...........#.....#..........#........#............................................................................................
|
||||||
|
.........................#......#.......................................#..............................#..........................
|
||||||
|
............#............................................................#..............#..............................#..........
|
||||||
|
..................#.........#...........................................................................................#.........
|
||||||
|
#.#..................................#....................#......................#.............#.................................#
|
||||||
|
....#................#.................#...................#...........#......................................#...................
|
||||||
|
................#........................................................................................#....#.#.......#.....##..
|
||||||
|
..........#...#.......................................#........#.......................................#...#......................
|
||||||
|
.......#..##........................#......##.........................#.........#.......#.............................#.....#.....
|
||||||
|
................#...............................................#....#..........#.....#.........#.........#.........#.............
|
||||||
|
...............................#............#....................................#......#......................................#..
|
||||||
|
.#..#..................#............................................#....#............#...............##...#..........#...........
|
||||||
|
....#.............................................................................................................................
|
||||||
|
.............................................................#...........................#..........#.............................
|
||||||
|
.#........#..................#.....#.............#.....................................................#...#........#...........#.
|
||||||
|
.......................#........................................#.....#............................#.#..................#.........
|
||||||
|
................#....#................#.......#............................#.......#.................#............................
|
||||||
|
....#.........#....#........#.....................#........................#............#.........................................
|
||||||
|
.......#.......#.....................................................................##...........#...............................
|
||||||
|
...........#.........................................................#..........#............#....................................
|
||||||
|
..................#.............................#.......................................................................#.........
|
||||||
|
................#.....#........#.....#...#..........#.....................................#.....#........................#........
|
||||||
|
..........................................#.........#...........#.................................................................
|
||||||
|
...#.......................................................................................................#......................
|
||||||
|
....#..............#...........#..................................................#.................#.................#...........
|
||||||
|
.#................#.....#.#.................................................................#.........................#...........
|
||||||
|
............#.........................##....................................#..............#......................................
|
||||||
|
...##...........#...#............#..........................................................................#.....................
|
||||||
|
............................................#......................#......#.......................................................
|
||||||
|
............#............................................................................................................#........
|
||||||
|
...................##..............#.#....#.##...................................................#..................#.............
|
||||||
|
..#...................................................................................#.........#.........................#.....#.
|
||||||
|
........................#..............................................#......#................................................#..
|
||||||
|
................#............#............................#.#...................#.....................#...........................
|
||||||
|
..................#......#................#.#......................#...................#...#......................................
|
||||||
|
..#................................................##...................................................................#.........
|
||||||
|
...........................#......................................................................#......#...#......#.............
|
||||||
|
........................#...#........#......#.......#..........#.............................#........#.....#.....................
|
||||||
|
.................................................#..............................................#......#.....#....................
|
||||||
|
.....#....#.................#......#........#.#..............^...........................#...................#..#.................
|
||||||
|
.............................................................................#................................#...................
|
||||||
|
#..........................#..#..............#.......#..........................#.................................................
|
||||||
|
............#.............................................................................#...................#...................
|
||||||
|
..................#.............................#.........................................#................#.........#......#.....
|
||||||
|
...#...............................#.....#......#............###.#.#.....................................#....#.............#.....
|
||||||
|
...........#...........#...........................#..............................................................................
|
||||||
|
............#..........................................#.....#.............#..........................#....................#.....#
|
||||||
|
........................#......#..#............................#.......................................................#..........
|
||||||
|
..#...#...#.......#.#..........................................#.............#.........#....#..................#...........#......
|
||||||
|
..................#.......#.....................................................................................#........#........
|
||||||
|
......##................#...........................................#..............##.................................#...........
|
||||||
|
.................#................................................................................#.#....................#........
|
||||||
|
....................#.........#..........#...............#...#...#.#.#............................................................
|
||||||
|
#..................#.#..........#..#...................................................................................#..........
|
||||||
|
..........#........................................................#..........##..........................#..##...................
|
||||||
|
...........#...................................................................#..................................................
|
||||||
|
..................#........#............................................#..................#....#.......................#..#......
|
||||||
|
............#...................#......#..........................................................................................
|
||||||
|
...........................#.....##..........#.#..............#......................#.............#.......#...........#..........
|
||||||
|
............#..................................................#.......#.........#.#..................#..............##...........
|
||||||
|
#..................................................#...#......#..#......................#.............#........#............#.....
|
||||||
|
....#..................#..........#.........#.........................................#..................#................#.......
|
||||||
|
...#.................#.............................................................................#....................#.........
|
||||||
|
..........#.................................................................#............#....................#.#.#.....#.........
|
||||||
|
.....................#......................#...........#........#................................................................
|
||||||
|
.....#.......................................................................#......................#...#......#..................
|
||||||
|
.............##........#.....................#...........##........#............#.....#.....................#...............#.....
|
||||||
|
.....#.........#....#.................#....#...........#.......##..........#.........#.#......................................#...
|
||||||
|
.......#..................##.......#...#.#...#...................................#.......................................#.....#..
|
||||||
|
...............#.......#.................#........................................................................................
|
||||||
|
......#.......#.....#...............................#...........#.......#......................##...#....#........................
|
||||||
|
.##..........................##..................##................#..#....#...##.................................................
|
||||||
|
........#..............................#.#......#........#...............#....#........#.#........................................
|
||||||
|
...............................#..#.....................#.#...................#...................................................
|
||||||
|
.....................#.................................................##...#.......#.................##...............#.......#..
|
||||||
|
.............#..........................#.................................#..............#.......#..........#........#............
|
||||||
|
.........................................#...................#.........................................................#..........
|
||||||
|
...............................#..........#..............................#............#.....#.....................................
|
||||||
|
.............#..........................#....................#................................#...#............#..................
|
||||||
|
....#......#........#.......#......#................................................#...#......................................##.
|
||||||
|
..#...................................#........#.....................................#...#......#.........#..#..........#.........
|
||||||
|
.......#.........#................................................................................................................
|
||||||
|
...........#...............................##.........................................#..#....................#.....#.#.......##..
|
||||||
|
.........................#..#...............#............................#.............#..........................#..............#
|
147
aoc2024/day06/main.go
Normal file
147
aoc2024/day06/main.go
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
_ "embed"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
aoc "go.sour.is/advent-of-code"
|
||||||
|
)
|
||||||
|
|
||||||
|
// var log = aoc.Log
|
||||||
|
|
||||||
|
func main() { aoc.MustResult(aoc.Runner(run)) }
|
||||||
|
|
||||||
|
type result struct {
|
||||||
|
valuePT1 int
|
||||||
|
valuePT2 int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r result) String() string { return fmt.Sprintf("%#v", r) }
|
||||||
|
|
||||||
|
func run(scan *bufio.Scanner) (*result, error) {
|
||||||
|
|
||||||
|
var start aoc.Point[int]
|
||||||
|
var m [][]rune
|
||||||
|
|
||||||
|
for scan.Scan() {
|
||||||
|
txt := scan.Text()
|
||||||
|
|
||||||
|
if txt == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
m = append(m, []rune(txt))
|
||||||
|
|
||||||
|
for i, c := range txt {
|
||||||
|
if c == '^' {
|
||||||
|
start = aoc.Point[int]{len(m) - 1, i}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sum, positions, _ := runPT1(m, start)
|
||||||
|
|
||||||
|
loops := runPT2(m, start, positions)
|
||||||
|
|
||||||
|
return &result{sum, loops}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func isOutOfBounds(p, topRight, bottomLeft aoc.Point[int]) bool {
|
||||||
|
return p[0] < topRight[0] ||
|
||||||
|
p[0] > bottomLeft[0] ||
|
||||||
|
p[1] < topRight[1] ||
|
||||||
|
p[1] > bottomLeft[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
func printMap(m [][]rune, o aoc.Point[int]) {
|
||||||
|
for i, row := range m {
|
||||||
|
if i == o[0] {
|
||||||
|
row[o[1]] = 'O'
|
||||||
|
}
|
||||||
|
println(string(row))
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
|
||||||
|
func runPT1(m [][]rune, start aoc.Point[int]) (int, []aoc.Point[int], bool) {
|
||||||
|
m = copyMap(m)
|
||||||
|
|
||||||
|
topRight := aoc.Point[int]{0, 0}
|
||||||
|
bottomLeft := aoc.Point[int]{len(m) - 1, len(m[0]) - 1}
|
||||||
|
|
||||||
|
directions := []aoc.Point[int]{
|
||||||
|
{-1, 0}, // up
|
||||||
|
{0, 1}, // right
|
||||||
|
{1, 0}, // down
|
||||||
|
{0, -1}, // left
|
||||||
|
}
|
||||||
|
|
||||||
|
d := 0
|
||||||
|
current := start
|
||||||
|
var loopStart [3]int
|
||||||
|
var paths = aoc.NewSet[[3]int]()
|
||||||
|
for !isOutOfBounds(current, topRight, bottomLeft) {
|
||||||
|
m[current[0]][current[1]] = 'X'
|
||||||
|
next := current.Add(directions[d])
|
||||||
|
if isOutOfBounds(next, topRight, bottomLeft) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if m[next[0]][next[1]] == '#' {
|
||||||
|
d = (d + 1) % 4
|
||||||
|
pt := [3]int{current[0], current[1], d}
|
||||||
|
if paths.Has(pt) {
|
||||||
|
if loopStart == pt {
|
||||||
|
return 0, nil, true
|
||||||
|
}
|
||||||
|
if loopStart == [3]int{} {
|
||||||
|
loopStart = pt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
paths.Add(pt)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
current = next
|
||||||
|
}
|
||||||
|
|
||||||
|
var sum int
|
||||||
|
var points []aoc.Point[int]
|
||||||
|
for y, row := range m {
|
||||||
|
for x, v := range row {
|
||||||
|
if v == 'X' {
|
||||||
|
points = append(points, aoc.Point[int]{x, y})
|
||||||
|
sum++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum, points, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func runPT2(m [][]rune, start aoc.Point[int], points []aoc.Point[int]) int {
|
||||||
|
sum := 0
|
||||||
|
for _, p := range points {
|
||||||
|
cm := copyMap(m)
|
||||||
|
cm[p[0]][p[1]] = '#'
|
||||||
|
|
||||||
|
_, _, isOOB :=runPT1(cm, start)
|
||||||
|
|
||||||
|
if !isOOB {
|
||||||
|
printMap(cm, start)
|
||||||
|
sum++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyMap(m [][]rune) [][]rune {
|
||||||
|
newM := make([][]rune, len(m))
|
||||||
|
for i, row := range m {
|
||||||
|
newM[i] = make([]rune, len(row))
|
||||||
|
copy(newM[i], row)
|
||||||
|
}
|
||||||
|
return newM
|
||||||
|
}
|
43
aoc2024/day06/main_test.go
Normal file
43
aoc2024/day06/main_test.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
_ "embed"
|
||||||
|
|
||||||
|
"github.com/matryer/is"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed example.txt
|
||||||
|
var example []byte
|
||||||
|
|
||||||
|
//go:embed input.txt
|
||||||
|
var input []byte
|
||||||
|
|
||||||
|
func TestExample(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
scan := bufio.NewScanner(bytes.NewReader(example))
|
||||||
|
|
||||||
|
result, err := run(scan)
|
||||||
|
is.NoErr(err)
|
||||||
|
|
||||||
|
t.Log(result)
|
||||||
|
is.Equal(result.valuePT1, 41)
|
||||||
|
is.Equal(result.valuePT2, 6)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSolution(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
scan := bufio.NewScanner(bytes.NewReader(input))
|
||||||
|
|
||||||
|
result, err := run(scan)
|
||||||
|
is.NoErr(err)
|
||||||
|
|
||||||
|
t.Log(result)
|
||||||
|
is.Equal(result.valuePT1, 5329)
|
||||||
|
is.True(result.valuePT2 > 897)
|
||||||
|
is.Equal(result.valuePT2, 0)
|
||||||
|
}
|
||||||
|
|
@ -73,3 +73,17 @@ func toList[T any](seq iter.Seq[T]) []T {
|
|||||||
}
|
}
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGraphBFS2(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
var adjacencyList = map[int][]int{
|
||||||
|
1: {2, 3},
|
||||||
|
2: {4},
|
||||||
|
3: {5, 6},
|
||||||
|
}
|
||||||
|
|
||||||
|
g := aoc.Graph(aoc.WithAdjacencyList[int](adjacencyList))
|
||||||
|
is.Equal(toList(g.BFS(1)), []int{1, 2, 3, 4, 5, 6})
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user