Day 6
This commit is contained in:
130
day6/data.txt
Normal file
130
day6/data.txt
Normal file
@ -0,0 +1,130 @@
|
||||
....#.................#......................#..........................#..................#....##..#...........#.................
|
||||
...................................#...............................#......#..#...............................#....................
|
||||
..........................#................#......##.....#.....................................#...............#..#...............
|
||||
.......................................................................................................#..........................
|
||||
...................#....#.........................#..............#.....#......................................................#...
|
||||
.....#.........................................................................................................#..................
|
||||
.........................................................#....................#..#............#................#..................
|
||||
..............#...............#..................................................................#......#.........................
|
||||
.........#.....#.......#......#.......................#.............#..#........#.......#............#.......#....#..#.......#....
|
||||
........................#....#...............................................#...#.#.........................................#....
|
||||
.........................#........................................................................#.....................#.........
|
||||
.#..........#...#...............#..................#...#......#.................................#....................#.......#....
|
||||
............................................................#......#.........................................................#....
|
||||
.......................#...#..................#.#.............#......................#.............#..............................
|
||||
............................................................................................................#.........#...........
|
||||
....#..................###........#.............................#.#....................#..........#.....................#.........
|
||||
................................................................................................#.......................#.#.......
|
||||
..........................................................................#........#...#.................#.......#................
|
||||
..........................#.#..#.#...............................................#..........#..............................#......
|
||||
..............#........#.#...............#............................#..........#....................................#........#.#
|
||||
#..................................................................................................#...........#................#.
|
||||
...............................................#........................................#.................................#.......
|
||||
.....#..#......#.......#..............#........#........#...........................................................#.............
|
||||
.......#..........#.......#.#...........#................#.................................................#......................
|
||||
....#.....#...............#....#.......#...#.............................................................#...................#....
|
||||
............................................#....#.......#................................#......#......................#.....#...
|
||||
.....................#...................................#....#...........................................................#.......
|
||||
..#..............................#...........#...........................#.................................#......................
|
||||
........#.............................##...................#.....................#................................................
|
||||
................#.#.#......#...............................................#...###.........#....#.................................
|
||||
.......#.............#.............#...........#..#...............................#..................................#.....#.....#
|
||||
.....#...#.......#.........................................#..............................#........................#.............#
|
||||
...............................................#.....#..............................................................#.............
|
||||
.........#.......................................#.......................#...........#............................................
|
||||
.......................#.....#.....................................................#....................................#.........
|
||||
.............................#......................#.....................#..............#..#.......................#.............
|
||||
......#......................................#.......#.....................#.....#...........#..........#.....................#...
|
||||
..................................................#....................#.......#....#.......#...#.................................
|
||||
......................................#......#........#.....#........................................#.............#..............
|
||||
#......................#.#..............#.....#.........#...............................#...............................#.........
|
||||
#......#...............#.........................................................................................#..#.............
|
||||
.#..............................................#.................#.......#.......................................................
|
||||
...#.......#.....#.............#...................................................................................#..............
|
||||
..........................#........#........#.....................................#........................#..............#..#....
|
||||
.......#..........#.......#...................................................#.##.....#.#.........#....#.................#.......
|
||||
..##...................#.......................................#..............#.#........#........................................
|
||||
#.......#..............#...........#.....#....#....#............#........#..................................#.#.........#.........
|
||||
..................#.......................................................................................................#.......
|
||||
............................#.........#....................#...............................#..........#...........................
|
||||
.............#.....................................................................#.....#.................#......................
|
||||
...#...#............#..........................#..........................................#.......................................
|
||||
..#.............#.#........................#...#.......................#.........#....................##....#.....................
|
||||
...........................................................................................................#.........#...#........
|
||||
.............................#.#..........................................................................................#.......
|
||||
....................#........................#.#......#...............#......#.............................#......................
|
||||
....#...#.......#..................#..........................................................#........................#..........
|
||||
.#...........#..............................................#...........................................#.........................
|
||||
..............................#...........#...........................................#.........#...........................#....#
|
||||
............#.......#......#....#.......................................................................#.........................
|
||||
.........................................#...#..................#..................#.....................................#........
|
||||
................#..................#........#.........................#...................#......................................#
|
||||
............................................................#.....#........#......................................................
|
||||
..............................#............#.........................................#.............#.......#..#...................
|
||||
...#............#........................................................................#..................................#....#
|
||||
..............................#.......#.............#.................................................#...........................
|
||||
.....#.................................................#..........#...............................#..##..........................#
|
||||
.............#.........................................................#.............................#..#..............#........#.
|
||||
....................#...............#................................................................................#....#......#
|
||||
........#....#..#...........................................................................#................#..............#.....
|
||||
....#......................#...............#..........#......#.........#..^....#..........#..................#.......#............
|
||||
...........................#.#...................................................#...............................#................
|
||||
#..#.........................................................#.....#........................#.....................................
|
||||
.#.#....#.......................................#......#..........#................#..#...........................................
|
||||
...#.....#..........#...................#.......#............................#....................................................
|
||||
.............#......................................................#............#.....................#.....................#....
|
||||
...................#.............................................................................................#................
|
||||
...................#.....#...................................................................................................#....
|
||||
................#............#......................#.......#..................#..#.....................#..............#........#.
|
||||
#....#...................................................................#.......##....#..........#...............................
|
||||
.........................................#............#......#.......................#........#..............#.#..................
|
||||
.##........#.....#...........................................................................................#..............#.....
|
||||
#...........................................................#.......#....#......#..#...................................#..#.#.....
|
||||
.............#........................................#...............................#...........................................
|
||||
......................#..................................................................#..................................#.....
|
||||
...#.#........................................#.................................................................................#.
|
||||
.............#.......................#............................#.#................................#.......#..#...........#.....
|
||||
...#..#...............................................................................#................#..........................
|
||||
.......#.............................#............#..#........#.....#.........................#..................#................
|
||||
......#...............................................................................##.................................#....#...
|
||||
........#..................#.......................................................................#......#..........#............
|
||||
...........#.......#........#..........................................#........#..............#.................#.........#......
|
||||
...................#..............................#...............................#.....................#.....#...................
|
||||
.............#..#..................#.#..#.....#..#..........................................................................#.....
|
||||
..............................#...................................................#.......................#..............#........
|
||||
.......#......................#.............................#...........................#.....#...#.................#........#....
|
||||
.........#.......#....##..........................................................................................................
|
||||
........................................................................#......................#..................................
|
||||
.......................#..........##.#................................................#..#.....#......#......#.................#..
|
||||
......................................#......................................................................#....................
|
||||
.....................................#....#...............................................#...#.....#.......#...#...........#.....
|
||||
...................#..#................................................................................#..........................
|
||||
..............#.................#..............................#..............#...........#.#..................#...#.............#
|
||||
................#..#......#.........................#.....#.....#..............#..#.........................................#.....
|
||||
.....#.........................#........................................#.....#.......#...........#...................#...........
|
||||
......#....................##......................................................................................#..............
|
||||
............................................................................###...............................#...................
|
||||
#..................................#......#..............................................................................#.......#
|
||||
.....#...................#.....#............................................................#.....................#...#...........
|
||||
.......#......#........................#.....................#.#..##............#......#.................#.....................#..
|
||||
.....#..............#.................#........#..................#..#..........................##.....#..#...................#...
|
||||
........#................#................#...........#.........................................#....................#............
|
||||
.........#.........#....#................#........#........#...............#....#.................................................
|
||||
...........#...#............#..................#.............................#.#..#....................#.#........................
|
||||
.#............#..#..#................#.#................................................................##.............#..........
|
||||
...........#.......................#.........................................................#....................................
|
||||
..#..........................#...........#......#................................#.#..............................................
|
||||
............................................................#..................#...........#.....##.................#.............
|
||||
....#.........#............................##..........................................#.....#....#..........#....................
|
||||
..................#..............#........#........#....................#..............#....................#.....................
|
||||
....#...................................#.....................................................#.............#...................#.
|
||||
.........#...........#...#.............................#.............##..#................................................#.#.....
|
||||
............................##..............#................#..#........................................#....................#...
|
||||
.............................#.#......................................................##.....#..................................#.
|
||||
.............................................................................#..................#...#.................#...........
|
||||
........................#...........#..................#......#...................................................................
|
||||
.....#.......................#......#................#............#..................#.................................#..........
|
||||
#..........#...................................................................#...................#...#...............#..........
|
||||
....................#............................................#...............#........................##....#..#..............
|
||||
.#.....#............................#...............#.#.#..........................#.........#..............#.....................
|
||||
.............................#....................................#..#......#........................#............................
|
10
day6/example.txt
Normal file
10
day6/example.txt
Normal file
@ -0,0 +1,10 @@
|
||||
....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
3
day6/go.mod
Normal file
3
day6/go.mod
Normal file
@ -0,0 +1,3 @@
|
||||
module stevenlr.com/aoc2024/day6
|
||||
|
||||
go 1.22.2
|
196
day6/main.go
Normal file
196
day6/main.go
Normal file
@ -0,0 +1,196 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"slices"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(part1(readData("example.txt")))
|
||||
fmt.Println(part1(readData("data.txt")))
|
||||
fmt.Println(part2(readData("example.txt")))
|
||||
fmt.Println(part2(readData("data.txt")))
|
||||
}
|
||||
|
||||
func part1(tiles [][]byte, x, y int) (visited int) {
|
||||
directions := [4][2]int{
|
||||
{0, -1},
|
||||
{1, 0},
|
||||
{0, 1},
|
||||
{-1, 0},
|
||||
}
|
||||
|
||||
dir := 0
|
||||
dx := directions[dir][0]
|
||||
dy := directions[dir][1]
|
||||
|
||||
for {
|
||||
if tiles[y][x] != 'X' {
|
||||
tiles[y][x] = 'X'
|
||||
visited++
|
||||
}
|
||||
|
||||
if y+dy < 0 || y+dy >= len(tiles) {
|
||||
return
|
||||
}
|
||||
|
||||
if x+dx < 0 || x+dx >= len(tiles[y+dy]) {
|
||||
return
|
||||
}
|
||||
|
||||
if tiles[y+dy][x+dx] == '#' {
|
||||
dir = (dir + 1) % 4
|
||||
dx = directions[dir][0]
|
||||
dy = directions[dir][1]
|
||||
} else {
|
||||
x += dx
|
||||
y += dy
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type State struct {
|
||||
x, y int
|
||||
dir int
|
||||
}
|
||||
|
||||
func (state *State) GetDirection() (dx, dy int) {
|
||||
directions := [4][2]int{
|
||||
{0, -1},
|
||||
{1, 0},
|
||||
{0, 1},
|
||||
{-1, 0},
|
||||
}
|
||||
dx = directions[state.dir][0]
|
||||
dy = directions[state.dir][1]
|
||||
return
|
||||
}
|
||||
|
||||
func (state *State) GetNextPosition() (x, y int) {
|
||||
dx, dy := state.GetDirection()
|
||||
x = state.x + dx
|
||||
y = state.y + dy
|
||||
return
|
||||
}
|
||||
|
||||
func (state *State) IsAboutToExit(tiles [][]byte) bool {
|
||||
x, y := state.GetNextPosition()
|
||||
if y < 0 || y >= len(tiles) {
|
||||
return true
|
||||
}
|
||||
if x < 0 || x >= len(tiles[y]) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (state *State) HasObstacleInFront(tiles [][]byte) bool {
|
||||
x, y := state.GetNextPosition()
|
||||
return tiles[y][x] == '#'
|
||||
}
|
||||
|
||||
func (state *State) Clone() State {
|
||||
return State{
|
||||
state.x, state.y, state.dir,
|
||||
}
|
||||
}
|
||||
|
||||
func (state *State) Rotate() {
|
||||
state.dir = (state.dir + 1) % 4
|
||||
}
|
||||
|
||||
func copyVisited(visited [][]byte) (visitedCopy [][]byte) {
|
||||
visitedCopy = make([][]byte, len(visited))
|
||||
for i, sublist := range visited {
|
||||
visitedCopy[i] = make([]byte, len(sublist))
|
||||
copy(visitedCopy[i], sublist)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func canReachExit(tiles [][]byte, visited [][]byte, state State) bool {
|
||||
for !state.IsAboutToExit(tiles) {
|
||||
visitedBit := byte(1) << state.dir
|
||||
if visited[state.y][state.x]&visitedBit != 0 {
|
||||
return false
|
||||
}
|
||||
visited[state.y][state.x] |= visitedBit
|
||||
|
||||
if state.HasObstacleInFront(tiles) {
|
||||
state.Rotate()
|
||||
continue
|
||||
}
|
||||
|
||||
nextX, nextY := state.GetNextPosition()
|
||||
state.x = nextX
|
||||
state.y = nextY
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func part2(tiles [][]byte, startX, startY int) (positionsLooping int) {
|
||||
state := State{startX, startY, 0}
|
||||
|
||||
visited := make([][]byte, len(tiles))
|
||||
for i := range visited {
|
||||
visited[i] = make([]byte, len(tiles[i]))
|
||||
}
|
||||
|
||||
for !state.IsAboutToExit(tiles) {
|
||||
visitedBit := byte(1) << state.dir
|
||||
if visited[state.y][state.x]&visitedBit != 0 {
|
||||
panic("Already visited???")
|
||||
}
|
||||
visited[state.y][state.x] |= visitedBit
|
||||
|
||||
if state.HasObstacleInFront(tiles) {
|
||||
state.Rotate()
|
||||
continue
|
||||
}
|
||||
|
||||
nextX, nextY := state.GetNextPosition()
|
||||
if visited[nextY][nextX] == 0 {
|
||||
tiles[nextY][nextX] = '#'
|
||||
|
||||
stateCopy := state.Clone()
|
||||
stateCopy.Rotate()
|
||||
if !canReachExit(tiles, copyVisited(visited), stateCopy) {
|
||||
positionsLooping++
|
||||
}
|
||||
tiles[nextY][nextX] = '.'
|
||||
}
|
||||
|
||||
state.x = nextX
|
||||
state.y = nextY
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func readData(fileName string) (tiles [][]byte, startX, startY int) {
|
||||
fp, err := os.Open(fileName)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(fp)
|
||||
|
||||
y := 0
|
||||
for scanner.Scan() {
|
||||
line := []byte(strings.TrimSpace(scanner.Text()))
|
||||
|
||||
x := slices.Index(line, '^')
|
||||
if x != -1 {
|
||||
startX = x
|
||||
startY = y
|
||||
}
|
||||
|
||||
tiles = append(tiles, line)
|
||||
y += 1
|
||||
}
|
||||
|
||||
return
|
||||
}
|
Reference in New Issue
Block a user