This commit is contained in:
Paul-Henri Froidmont 2024-12-07 13:32:08 +01:00
parent 16873b07c8
commit 22c66a4757
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
2 changed files with 202 additions and 0 deletions

130
input/day06 Normal file
View file

@ -0,0 +1,130 @@
......#........#..........#.................##......................#.............#..................#............#............#..
.....#............................................#.......................#.......##.................#..#...................#.#...
......#...................#............................#.....#.........#................................................#.........
...........................................#.......#..........#..#......#.........#.#.#.#................#.##........##...........
........#.........................................#.......#.....#..........#...#....##....#..#.......##................#......#...
...................#..#.....................................................#.................................................#...
....#..................#..........#........#.............#................................................................#.......
......#..............#..................#...........#......#.....#...........................#..#.#.....................#.....#...
......#...#...............................................#.....#.........................#..........#............................
......#......#..........................................#..................................#....#..#................#..##...#.....
........................................................................................#.........................................
................#..........#..........................#.##......................#..........#......................................
.............#.............................#......#..............................#....................#...........#.....#...#.....
.......#.................#..................#..........................#...........................................#..............
.......#.....................................................#..........................................#....#.#.....#......#.....
...#......#............#........#......................#...........................#.#....#..#....................#.............##
...........................##..#..#..........#....................#................................................#......#.......
.....................#...#.......................#...#..#.....#................#...........................................#....#.
.................#................#.............#...#...........................................................#..#.#............
#.....................#....................##.......#...................#..........#..........................#...................
.#..........##......#...#......#................#.....................................#.#.....#..............#....................
...#...#..#..........................................................#..#..#......................................................
..................#.#..............#...#...............................#...#....#.#.........#.........................##..........
.......#.........................#..............................................#........#....#....#.........#....................
...........#......#......#...........#........#.............................##.................................................#..
............................#...................................#......#........................................#.................
......................................##...........................................#.............#..#...........#...#.....#.......
...................................................#.................................#............................................
..........................#..........................................#..#.....#.................#.#......#........................
..................#...........#.............................#....#.#..................#................................#..........
...................#....#..#.........................................................#....#.......................................
..#..........................................................##..................................#......................#....#.#..
#.........................#.....#...............................#........................#................#.......................
......................#......#...#..........#......#..............................#...#......#.................................#..
...............#.....#............................................................................#...............................
#.....................#........#.#........................................................#.......................#.............#.
.......#...#..........#........#...........#.................#..................#....................................##.....#.....
.#......#..................................#.......................................................................#..............
.................#.....#...........................................................#..............................................
.........#....................................^......#..................#..............................#..#.............#...#.....
.............................................................#.....#....................................#.........................
....................#.................#........#........................................................#..#............#........#
.....#..........................................................#...........................#.................#....##.............
..............#.........#.................#............................#.............#......................#.#............#......
.............#.................#.........................................#...#................#.............#.....#...............
....#.....##..#......#........#............................................#..........#.......#.................................##
..........................................................................#.......................................................
.......#..........#.............................................................................................##..#.............
............................#...............#...............................................................................#.....
....#......#...............................................................................................................#......
..................................#......................#.....#............................................#.....#........#......
...............................#..........................................#.......................................................
.....#.............#...#..............#.#............#....................................................................#.......
..............................................#...............................#......##.......#................#..........#.#.....
........#.....##...............................................#.........................#........................................
.....#.........................#.#........#.............................................#.............#..............##...........
........................................#..##.........................#............#...........#.............#....................
.....................#.#................#............................#.................#.....#..............................#.....
................#.....................................#..#....................#..................................#................
...........#...................#.................#..........................................................#.......#...........#.
...........................#..................................#......#..............#............#.........#....#................#
..................................................................................................................#...............
..............#....#.#............................................................................#.....#.........#........#......
..#...........#.................#.#......#................................#..........................#...........................#
............#...........##...............................#..................................................#.....................
..............##.#..................................................................................#.........#......#......#.....
................................................................#...............#....#....##................#.....................
.........#..#.....................#........................................................#......#................#..............
...#..........#..........#..................#.......................#........................#...#................#.........#.....
...................................#..#...............................#..........#................................................
.........................#........................................................................................................
......................#.........#....................................................##............................#.....#........
.#....#.....................#.........................................................#....#........#.............................
..........................................#....................................#........................................#.........
.................................................#.......................................#........................................
#..#...............#......................#....#.............................................#................#........##.........
.........#....#........##.........#.....#.........#...............................................#..................#....#...#...
..#............................................................................#...............................................#..
.......................................................#.........#......#..........................#.#............................
.........#.............#.................##.....#.....#.........#............#.........#..................#.....#.............#...
#..........#.........#...............................................................................................#............
.......................#....................#..................................................#..................................
.#................#.................................#........................................#...........#........................
.........#........................................................................................................................
..................................................................................#..........#.....................#..............
..#...............................#.......#.....................#......................#.....#..........................#.........
......#....#..........................................................#..........................#................................
...........................................##..................................................##..................#...#..........
...............#....#...........................#........................................#..............#....................##...
#......#......................................................#..........#.........................#.........#....................
...#...................................#......#..........................................#.........................#.............#
#.....#.........#.............#.......................................#...............................#...........................
...................#.#..........................................................................#...............#.................
.......#......##..........#....................................................#..................#..........#....................
.............................................#.##..............#......................#......#..#..................#..........#...
..##...................#...................................#.........................................#...........#................
...................................................#.....................................#.......................#...............#
..........#.......##...................#...............#...............................................................#..........
.......................#............#............##.............................................#......##.................#...#...
.........#.................................................................................#............#....................#....
.......##.........#..................................................................#................#...........................
................#.............................................................................................#...................
......................#.......#....#.................................................#......#.#...............................#...
.........#.........#.#.....##.#..................................##...................................................#...........
.#......................................................#.......#......##........#..........#.........#....#......................
........#.#......................#................................................................................................
..................#.............................#.................#..................#......................#......##.#...........
................##.............................................#....#..........##.#.#....#........................................
..............#...................#.......#............................#.#.....................................................#..
............#..............................................#....#.....................#...#.......................#.....#......#..
..............#........................................................#............................................#.............
.......#.....#.........#..............#..............................#.......................#..#................#....#..#........
.......................#......#........................................#.................#..........#.............................
...........#..................#.............................#............................................................#........
......#....#......#.....................#.....................#........#.....................#...#.....#.#...................#....
#..............................................##...#.....#...........#..........................................#................
..........#..........#.#........................................#..#....#.........................................................
..................#......................................#...#.......#............................................................
...#.............................#..................................................#...........#.................................
................................##.#.............#........................#...#...............................................#...
...#...................................#.......................#........................#............#...............#....#.#.....
..............................................................##.......#...............#.........#..................#.............
....#............................#..................................#..#..#...............#..............##.......................
#...#.................##...............................#...........#...........#..............#.#.........#........#...#..........
..........................#.....#....................#..............#.............#..........#....................#.........#.....
......#.......................................................#........#.....#..........................#...#.........#...........
...............................#............#.....#...........................#...............#........#..........................
............#..#......#...#..#.....................#...............#.........#...........................................#.....#..
.......#..#..................#............#...........#..............................................................#............
....#......#.##..#......##..........#.......#............#...............#....#....................................#..........#.#.

72
src/day06.scala Normal file
View file

@ -0,0 +1,72 @@
package aoc
package day06
import scala.annotation.tailrec
val dayNumber = "06"
@main def part1: Unit =
println(part1(loadInput(dayNumber)))
@main def part2: Unit =
println(part2(loadInput(dayNumber)))
def part1(input: String): String =
val (gridMap, guardPos) = parseInput(input)
walk(guardPos, Dir.Up, Set())(using gridMap).size.toString
def part2(input: String): String =
val (gridMap, guardPos) = parseInput(input)
(walk(guardPos, Dir.Up, Set())(using gridMap) - guardPos)
.count((x, y) =>
isLoop(guardPos, Dir.Up, Set())(using gridMap + ((x -> y, '#')))
)
.toString
def parseInput(input: String): (Map[(Int, Int), Char], (Int, Int)) =
val grid = input.split("\n")
val coords =
for
y <- 0 until grid.length
x <- 0 until grid.head.length
yield (x, y) -> grid(y)(x)
val gridMap = coords.toMap
val guardPos = coords.collectFirst { case (x, y) -> '^' => (x, y) }.get
(gridMap, guardPos)
enum Dir:
case Up, Right, Down, Left
def next = this match
case Up => Right
case Right => Down
case Down => Left
case Left => Up
def move(x: Int, y: Int) = this match
case Up => (x, y - 1)
case Right => (x + 1, y)
case Down => (x, y + 1)
case Left => (x - 1, y)
@tailrec def walk(pos: (Int, Int), dir: Dir, visited: Set[(Int, Int)])(using
gridMap: Map[(Int, Int), Char]
): Set[(Int, Int)] =
val nextPos = dir.move.tupled(pos)
gridMap.get(nextPos) match
case Some('.' | '^') =>
walk(nextPos, dir, visited + pos)
case Some('#') => walk(pos, dir.next, visited)
case Some(_) => ???
case None => visited + pos
@tailrec def isLoop(pos: (Int, Int), dir: Dir, visited: Set[(Int, Int, Dir)])(
using gridMap: Map[(Int, Int), Char]
): Boolean =
val nextPos = dir.move.tupled(pos)
if visited.contains(nextPos :* dir) then true
else
gridMap.get(nextPos) match
case Some('.' | '^') =>
isLoop(nextPos, dir, visited + (pos :* dir))
case Some('#') => isLoop(pos, dir.next, visited)
case Some(_) => ???
case None => false