Day 6 done
Also included the logs of the app for the sample because they look kinda nice scrolling past
This commit is contained in:
parent
6dad1566a7
commit
1014cbb42c
4 changed files with 522 additions and 0 deletions
130
day6/input
Normal file
130
day6/input
Normal file
|
@ -0,0 +1,130 @@
|
|||
....#.................#......................#..........................#..................#....##..#...........#.................
|
||||
...................................#...............................#......#..#...............................#....................
|
||||
..........................#................#......##.....#.....................................#...............#..#...............
|
||||
.......................................................................................................#..........................
|
||||
...................#....#.........................#..............#.....#......................................................#...
|
||||
.....#.........................................................................................................#..................
|
||||
.........................................................#....................#..#............#................#..................
|
||||
..............#...............#..................................................................#......#.........................
|
||||
.........#.....#.......#......#.......................#.............#..#........#.......#............#.......#....#..#.......#....
|
||||
........................#....#...............................................#...#.#.........................................#....
|
||||
.........................#........................................................................#.....................#.........
|
||||
.#..........#...#...............#..................#...#......#.................................#....................#.......#....
|
||||
............................................................#......#.........................................................#....
|
||||
.......................#...#..................#.#.............#......................#.............#..............................
|
||||
............................................................................................................#.........#...........
|
||||
....#..................###........#.............................#.#....................#..........#.....................#.........
|
||||
................................................................................................#.......................#.#.......
|
||||
..........................................................................#........#...#.................#.......#................
|
||||
..........................#.#..#.#...............................................#..........#..............................#......
|
||||
..............#........#.#...............#............................#..........#....................................#........#.#
|
||||
#..................................................................................................#...........#................#.
|
||||
...............................................#........................................#.................................#.......
|
||||
.....#..#......#.......#..............#........#........#...........................................................#.............
|
||||
.......#..........#.......#.#...........#................#.................................................#......................
|
||||
....#.....#...............#....#.......#...#.............................................................#...................#....
|
||||
............................................#....#.......#................................#......#......................#.....#...
|
||||
.....................#...................................#....#...........................................................#.......
|
||||
..#..............................#...........#...........................#.................................#......................
|
||||
........#.............................##...................#.....................#................................................
|
||||
................#.#.#......#...............................................#...###.........#....#.................................
|
||||
.......#.............#.............#...........#..#...............................#..................................#.....#.....#
|
||||
.....#...#.......#.........................................#..............................#........................#.............#
|
||||
...............................................#.....#..............................................................#.............
|
||||
.........#.......................................#.......................#...........#............................................
|
||||
.......................#.....#.....................................................#....................................#.........
|
||||
.............................#......................#.....................#..............#..#.......................#.............
|
||||
......#......................................#.......#.....................#.....#...........#..........#.....................#...
|
||||
..................................................#....................#.......#....#.......#...#.................................
|
||||
......................................#......#........#.....#........................................#.............#..............
|
||||
#......................#.#..............#.....#.........#...............................#...............................#.........
|
||||
#......#...............#.........................................................................................#..#.............
|
||||
.#..............................................#.................#.......#.......................................................
|
||||
...#.......#.....#.............#...................................................................................#..............
|
||||
..........................#........#........#.....................................#........................#..............#..#....
|
||||
.......#..........#.......#...................................................#.##.....#.#.........#....#.................#.......
|
||||
..##...................#.......................................#..............#.#........#........................................
|
||||
#.......#..............#...........#.....#....#....#............#........#..................................#.#.........#.........
|
||||
..................#.......................................................................................................#.......
|
||||
............................#.........#....................#...............................#..........#...........................
|
||||
.............#.....................................................................#.....#.................#......................
|
||||
...#...#............#..........................#..........................................#.......................................
|
||||
..#.............#.#........................#...#.......................#.........#....................##....#.....................
|
||||
...........................................................................................................#.........#...#........
|
||||
.............................#.#..........................................................................................#.......
|
||||
....................#........................#.#......#...............#......#.............................#......................
|
||||
....#...#.......#..................#..........................................................#........................#..........
|
||||
.#...........#..............................................#...........................................#.........................
|
||||
..............................#...........#...........................................#.........#...........................#....#
|
||||
............#.......#......#....#.......................................................................#.........................
|
||||
.........................................#...#..................#..................#.....................................#........
|
||||
................#..................#........#.........................#...................#......................................#
|
||||
............................................................#.....#........#......................................................
|
||||
..............................#............#.........................................#.............#.......#..#...................
|
||||
...#............#........................................................................#..................................#....#
|
||||
..............................#.......#.............#.................................................#...........................
|
||||
.....#.................................................#..........#...............................#..##..........................#
|
||||
.............#.........................................................#.............................#..#..............#........#.
|
||||
....................#...............#................................................................................#....#......#
|
||||
........#....#..#...........................................................................#................#..............#.....
|
||||
....#......................#...............#..........#......#.........#..^....#..........#..................#.......#............
|
||||
...........................#.#...................................................#...............................#................
|
||||
#..#.........................................................#.....#........................#.....................................
|
||||
.#.#....#.......................................#......#..........#................#..#...........................................
|
||||
...#.....#..........#...................#.......#............................#....................................................
|
||||
.............#......................................................#............#.....................#.....................#....
|
||||
...................#.............................................................................................#................
|
||||
...................#.....#...................................................................................................#....
|
||||
................#............#......................#.......#..................#..#.....................#..............#........#.
|
||||
#....#...................................................................#.......##....#..........#...............................
|
||||
.........................................#............#......#.......................#........#..............#.#..................
|
||||
.##........#.....#...........................................................................................#..............#.....
|
||||
#...........................................................#.......#....#......#..#...................................#..#.#.....
|
||||
.............#........................................#...............................#...........................................
|
||||
......................#..................................................................#..................................#.....
|
||||
...#.#........................................#.................................................................................#.
|
||||
.............#.......................#............................#.#................................#.......#..#...........#.....
|
||||
...#..#...............................................................................#................#..........................
|
||||
.......#.............................#............#..#........#.....#.........................#..................#................
|
||||
......#...............................................................................##.................................#....#...
|
||||
........#..................#.......................................................................#......#..........#............
|
||||
...........#.......#........#..........................................#........#..............#.................#.........#......
|
||||
...................#..............................#...............................#.....................#.....#...................
|
||||
.............#..#..................#.#..#.....#..#..........................................................................#.....
|
||||
..............................#...................................................#.......................#..............#........
|
||||
.......#......................#.............................#...........................#.....#...#.................#........#....
|
||||
.........#.......#....##..........................................................................................................
|
||||
........................................................................#......................#..................................
|
||||
.......................#..........##.#................................................#..#.....#......#......#.................#..
|
||||
......................................#......................................................................#....................
|
||||
.....................................#....#...............................................#...#.....#.......#...#...........#.....
|
||||
...................#..#................................................................................#..........................
|
||||
..............#.................#..............................#..............#...........#.#..................#...#.............#
|
||||
................#..#......#.........................#.....#.....#..............#..#.........................................#.....
|
||||
.....#.........................#........................................#.....#.......#...........#...................#...........
|
||||
......#....................##......................................................................................#..............
|
||||
............................................................................###...............................#...................
|
||||
#..................................#......#..............................................................................#.......#
|
||||
.....#...................#.....#............................................................#.....................#...#...........
|
||||
.......#......#........................#.....................#.#..##............#......#.................#.....................#..
|
||||
.....#..............#.................#........#..................#..#..........................##.....#..#...................#...
|
||||
........#................#................#...........#.........................................#....................#............
|
||||
.........#.........#....#................#........#........#...............#....#.................................................
|
||||
...........#...#............#..................#.............................#.#..#....................#.#........................
|
||||
.#............#..#..#................#.#................................................................##.............#..........
|
||||
...........#.......................#.........................................................#....................................
|
||||
..#..........................#...........#......#................................#.#..............................................
|
||||
............................................................#..................#...........#.....##.................#.............
|
||||
....#.........#............................##..........................................#.....#....#..........#....................
|
||||
..................#..............#........#........#....................#..............#....................#.....................
|
||||
....#...................................#.....................................................#.............#...................#.
|
||||
.........#...........#...#.............................#.............##..#................................................#.#.....
|
||||
............................##..............#................#..#........................................#....................#...
|
||||
.............................#.#......................................................##.....#..................................#.
|
||||
.............................................................................#..................#...#.................#...........
|
||||
........................#...........#..................#......#...................................................................
|
||||
.....#.......................#......#................#............#..................#.................................#..........
|
||||
#..........#...................................................................#...................#...#...............#..........
|
||||
....................#............................................#...............#........................##....#..#..............
|
||||
.#.....#............................#...............#.#.#..........................#.........#..............#.....................
|
||||
.............................#....................................#..#......#........................#............................
|
297
day6/main.go
Normal file
297
day6/main.go
Normal file
|
@ -0,0 +1,297 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"git.mstar.dev/mstar/aoc24/util"
|
||||
"git.mstar.dev/mstar/goutils/sliceutils"
|
||||
)
|
||||
|
||||
type MapState int
|
||||
type Map [][]MapState // Y, X
|
||||
|
||||
type State struct {
|
||||
X, Y int
|
||||
Dir MapState
|
||||
}
|
||||
|
||||
const (
|
||||
MapStateEmpty MapState = iota
|
||||
MapStateObstacle
|
||||
MapStateVisited
|
||||
MapStateGuardUp
|
||||
MapStateGuardDown
|
||||
MapStateGuardLeft
|
||||
MapStateGuardRight
|
||||
)
|
||||
|
||||
func parseStringIntoMapLine(line string) []MapState {
|
||||
mapLine := []MapState{}
|
||||
for _, r := range line {
|
||||
switch r {
|
||||
case '.':
|
||||
mapLine = append(mapLine, MapStateEmpty)
|
||||
case '#':
|
||||
mapLine = append(mapLine, MapStateObstacle)
|
||||
case '^':
|
||||
mapLine = append(mapLine, MapStateGuardUp)
|
||||
case '>':
|
||||
mapLine = append(mapLine, MapStateGuardRight)
|
||||
case '<':
|
||||
mapLine = append(mapLine, MapStateGuardLeft)
|
||||
case 'v':
|
||||
mapLine = append(mapLine, MapStateGuardDown)
|
||||
default:
|
||||
}
|
||||
}
|
||||
return mapLine
|
||||
}
|
||||
|
||||
func parseLinesIntoMap(lines []string) Map {
|
||||
outMap := Map{}
|
||||
for _, line := range lines {
|
||||
outMap = append(outMap, parseStringIntoMapLine(line))
|
||||
}
|
||||
return outMap
|
||||
}
|
||||
|
||||
func (area Map) isGuardInMap() bool {
|
||||
for _, areaLine := range area {
|
||||
for _, cell := range areaLine {
|
||||
switch cell {
|
||||
case MapStateGuardUp, MapStateGuardDown, MapStateGuardLeft, MapStateGuardRight:
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (area Map) getGuardPosition() (x, y int, ok bool) {
|
||||
for iy, line := range area {
|
||||
for ix, cell := range line {
|
||||
switch cell {
|
||||
case MapStateGuardUp, MapStateGuardDown, MapStateGuardLeft, MapStateGuardRight:
|
||||
return ix, iy, true
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1, -1, false
|
||||
}
|
||||
|
||||
func (area Map) advanceMap() State {
|
||||
// Find guard position first
|
||||
guardX, guardY, ok := area.getGuardPosition()
|
||||
if !ok {
|
||||
return State{}
|
||||
}
|
||||
dir := area[guardY][guardX]
|
||||
switch area[guardY][guardX] {
|
||||
case MapStateGuardDown:
|
||||
targetCellVal := area.get(guardX, guardY+1)
|
||||
if targetCellVal == MapStateObstacle {
|
||||
area.set(MapStateGuardLeft, guardX, guardY)
|
||||
} else {
|
||||
area.set(MapStateVisited, guardX, guardY)
|
||||
area.set(MapStateGuardDown, guardX, guardY+1)
|
||||
}
|
||||
case MapStateGuardUp:
|
||||
targetCellVal := area.get(guardX, guardY-1)
|
||||
if targetCellVal == MapStateObstacle {
|
||||
area.set(MapStateGuardRight, guardX, guardY)
|
||||
} else {
|
||||
area.set(MapStateVisited, guardX, guardY)
|
||||
area.set(MapStateGuardUp, guardX, guardY-1)
|
||||
|
||||
}
|
||||
case MapStateGuardLeft:
|
||||
targetCellVal := area.get(guardX-1, guardY)
|
||||
if targetCellVal == MapStateObstacle {
|
||||
area.set(MapStateGuardUp, guardX, guardY)
|
||||
} else {
|
||||
area.set(MapStateVisited, guardX, guardY)
|
||||
area.set(MapStateGuardLeft, guardX-1, guardY)
|
||||
}
|
||||
case MapStateGuardRight:
|
||||
targetCellVal := area.get(guardX+1, guardY)
|
||||
if targetCellVal == MapStateObstacle {
|
||||
area.set(MapStateGuardDown, guardX, guardY)
|
||||
} else {
|
||||
area.set(MapStateVisited, guardX, guardY)
|
||||
area.set(MapStateGuardRight, guardX+1, guardY)
|
||||
}
|
||||
default:
|
||||
panic(fmt.Sprintf("Unknown guard state %v", area[guardY][guardX]))
|
||||
}
|
||||
return State{guardX, guardY, dir}
|
||||
}
|
||||
|
||||
func (area Map) set(newState MapState, posX, posY int) {
|
||||
if posY >= len(area) || posY < 0 || posX >= len(area[0]) || posX < 0 {
|
||||
return
|
||||
}
|
||||
area[posY][posX] = newState
|
||||
}
|
||||
|
||||
func (area Map) get(posX, posY int) MapState {
|
||||
if posY >= len(area) || posY < 0 || posX >= len(area[0]) || posX < 0 {
|
||||
return MapStateEmpty
|
||||
}
|
||||
return area[posY][posX]
|
||||
}
|
||||
|
||||
func (area Map) countVisitedCells() int {
|
||||
acc := 0
|
||||
for _, line := range area {
|
||||
for _, elem := range line {
|
||||
if elem == MapStateVisited {
|
||||
acc += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
return acc
|
||||
}
|
||||
|
||||
func (area Map) printCurrentState() string {
|
||||
builder := strings.Builder{}
|
||||
for _, line := range area {
|
||||
for _, elem := range line {
|
||||
switch elem {
|
||||
case MapStateEmpty:
|
||||
builder.WriteString(".")
|
||||
case MapStateObstacle:
|
||||
builder.WriteString("#")
|
||||
case MapStateVisited:
|
||||
builder.WriteString("X")
|
||||
case MapStateGuardDown:
|
||||
builder.WriteString("v")
|
||||
case MapStateGuardUp:
|
||||
builder.WriteString("^")
|
||||
case MapStateGuardLeft:
|
||||
builder.WriteString("<")
|
||||
case MapStateGuardRight:
|
||||
builder.WriteString(">")
|
||||
}
|
||||
}
|
||||
builder.WriteString("\n")
|
||||
}
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
func (area Map) countEmptyCells() uint64 {
|
||||
var acc uint64 = 0
|
||||
for _, line := range area {
|
||||
for _, elem := range line {
|
||||
if elem == MapStateEmpty {
|
||||
acc++
|
||||
}
|
||||
}
|
||||
}
|
||||
return acc
|
||||
}
|
||||
|
||||
func (area Map) getFieldGuardIsFacing() (MapState, int, int) {
|
||||
guardX, GuardY, found := area.getGuardPosition()
|
||||
// No guard on map, not what we want
|
||||
if !found {
|
||||
return -1, -1, -1
|
||||
}
|
||||
guard := area.get(guardX, GuardY)
|
||||
switch guard {
|
||||
case MapStateGuardLeft:
|
||||
return area.get(guardX-1, GuardY), guardX - 1, GuardY
|
||||
case MapStateGuardRight:
|
||||
return area.get(guardX+1, GuardY), guardX + 1, GuardY
|
||||
case MapStateGuardDown:
|
||||
return area.get(guardX, GuardY+1), guardX, GuardY + 1
|
||||
case MapStateGuardUp:
|
||||
return area.get(guardX, GuardY-1), guardX, GuardY - 1
|
||||
default:
|
||||
panic(fmt.Errorf("Invalid field found by guard finder: %v", guard))
|
||||
}
|
||||
}
|
||||
|
||||
func (area Map) clone() Map {
|
||||
clone := Map{}
|
||||
for _, line := range area {
|
||||
newLine := []MapState{}
|
||||
for _, elem := range line {
|
||||
newLine = append(newLine, elem)
|
||||
}
|
||||
clone = append(clone, newLine)
|
||||
}
|
||||
return clone
|
||||
}
|
||||
|
||||
func runCheck(area Map, addChan chan any, wg *sync.WaitGroup, isRoot bool) {
|
||||
checkedStates := []State{}
|
||||
for area.isGuardInMap() {
|
||||
if isRoot {
|
||||
nextElem, nextX, nextY := area.getFieldGuardIsFacing()
|
||||
// fmt.Printf("Guard in root is facing %d:%d of type %d\n", nextX, nextY, nextElem)
|
||||
// If is root and next field is empty, launch a new goroutine with that field being an obstacle
|
||||
if nextElem == MapStateEmpty {
|
||||
clone := area.clone()
|
||||
clone.set(MapStateObstacle, nextX, nextY)
|
||||
// fmt.Printf(
|
||||
// "Launching check for new state. State:\n%s\n\n",
|
||||
// clone.printCurrentState(),
|
||||
// )
|
||||
fmt.Println("Launching new alternative from root")
|
||||
wg.Add(1)
|
||||
go runCheck(clone, addChan, wg, false)
|
||||
}
|
||||
}
|
||||
nextState := area.advanceMap()
|
||||
// Check if state is already known
|
||||
if len(
|
||||
sliceutils.Filter(
|
||||
checkedStates,
|
||||
func(t State) bool { return t.Dir == nextState.Dir && t.X == nextState.X && t.Y == nextState.Y },
|
||||
),
|
||||
) > 0 {
|
||||
// If it is, loop detected, report it back and exit
|
||||
wg.Done()
|
||||
addChan <- true
|
||||
fmt.Printf("Loop found, returning. IsRoot: %v\n", isRoot)
|
||||
return
|
||||
} else {
|
||||
checkedStates = append(checkedStates, nextState)
|
||||
}
|
||||
}
|
||||
// Guard no longer on map, report as done without loop
|
||||
wg.Done()
|
||||
fmt.Printf("Guard exited, returning. IsRoot: %v\n", isRoot)
|
||||
}
|
||||
|
||||
func main() {
|
||||
inputLines := util.FileContentToNonEmptyLines(util.LoadFileFromArgs())
|
||||
// fullInput := sliceutils.Compact(
|
||||
// inputLines,
|
||||
// func(acc, next string) string { return acc + "\n" + next },
|
||||
// )
|
||||
area := parseLinesIntoMap(inputLines)
|
||||
for area.isGuardInMap() {
|
||||
area.advanceMap()
|
||||
// area.printCurrentState()
|
||||
}
|
||||
fmt.Printf("Task 1: %d\n", area.countVisitedCells())
|
||||
|
||||
untouchedArea := parseLinesIntoMap(inputLines)
|
||||
|
||||
acc := 0
|
||||
addChan := make(chan any, 1)
|
||||
wg := sync.WaitGroup{}
|
||||
go func() {
|
||||
for range addChan {
|
||||
acc++
|
||||
}
|
||||
}()
|
||||
wg.Add(1)
|
||||
go runCheck(untouchedArea.clone(), addChan, &wg, true)
|
||||
wg.Wait()
|
||||
close(addChan)
|
||||
fmt.Printf("Task 2: %d\n", acc)
|
||||
}
|
10
day6/sample
Normal file
10
day6/sample
Normal file
|
@ -0,0 +1,10 @@
|
|||
....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
85
day6/tmp
Normal file
85
day6/tmp
Normal file
|
@ -0,0 +1,85 @@
|
|||
Task 1: 41
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Loop found, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Loop found, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Loop found, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Loop found, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Loop found, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: false
|
||||
Launching new alternative from root
|
||||
Guard exited, returning. IsRoot: true
|
||||
Loop found, returning. IsRoot: false
|
||||
Guard exited, returning. IsRoot: false
|
||||
Task 2: 6
|
Loading…
Reference in a new issue