Skip to content
This repository has been archived by the owner on Jan 13, 2024. It is now read-only.

Commit

Permalink
Solved day 16
Browse files Browse the repository at this point in the history
  • Loading branch information
FlorianCassayre committed Dec 17, 2023
1 parent 7bacb2b commit 6fc3e9b
Show file tree
Hide file tree
Showing 5 changed files with 182 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ _My solutions to the 2023 edition of [Advent of Code](https://adventofcode.com/2
| **[13](https://adventofcode.com/2023/day/13)** | [solution](src/main/scala/adventofcode/solutions/Day13.scala) |
| **[14](https://adventofcode.com/2023/day/14)** | [solution](src/main/scala/adventofcode/solutions/Day14.scala) |
| **[15](https://adventofcode.com/2023/day/15)** | [solution](src/main/scala/adventofcode/solutions/Day15.scala) |
| **[16](https://adventofcode.com/2023/day/16)** | [](src/main/scala/adventofcode/solutions/Day16.scala) |
| **[16](https://adventofcode.com/2023/day/16)** | [solution](src/main/scala/adventofcode/solutions/Day16.scala) |
| **[17](https://adventofcode.com/2023/day/17)** | [](src/main/scala/adventofcode/solutions/Day17.scala) |
| **[18](https://adventofcode.com/2023/day/18)** | [](src/main/scala/adventofcode/solutions/Day18.scala) |
| **[19](https://adventofcode.com/2023/day/19)** | [](src/main/scala/adventofcode/solutions/Day19.scala) |
Expand Down
110 changes: 110 additions & 0 deletions input/16.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
\|.................................../....\\/........................-.....|.|..-.....|\...................../
|-.....|...\........|........................../-...../...--.|..\..........|......./.......-......|......./.-.
.....\..../......-......|.........................-............|..../.....|.......-........../................
........\..|.....|................/.......-\..............\...../....|............\....\......................
-................\....-..........-................./.......//...............|..|...................-..........
...................|..................................|.....|.....-....................../....|..\...\..\.|-..
.......-.............../......\...................................-......../.......-.\|.................../...
......\..................\.............-..........././....|-.....|......................../.-.....|......\....
......-............-..................|..................../......-...|.....................\.................
.........\..........-.......-./...-.../..\...../............................|................/....|...........
.\....../....|...............|..../.......................-...................................-......|..\.....
......................../...|.|........|.........|.....................-............../.-.../.-...............
..|..-.-......|.......\....................-|.......|............-............................................
.........................|.............-..........................-.\\......|.......|........-.........\......
.../....-....\............/...................|........./..\.......\...........||.|......\.......\..-./.......
.../..\.|..-....../.......................-.......-.......|/...........-.......-.......\......................
..\...........-...-.......-.........|\....................../.-...........................\...........-.......
..../.....||.....................-.........................................../............././................
...................-..\................\................................................../.../.........../...
\..................-.-..........//....|......./........-.............../.........\............................
................/...|................../......./..............|.....|..............|..-...........|...........
..../........-......\.|...-................./...................../|.........\................................
...../...................-........|.......................-...\.............................\.../.............
...../....-......................./..........................-............-........\......-.....\.../.\.\.....
..|......-.\..........\........................\........../.........|...|............./............../-.......
./..\-.......|.........|.\/........-........|.|...|..|....\...|.\.....|..|..-...............\.................
..|../..........\................./...\...........|.....................-\..................-..|.........-..-.
........./......||.....................................|..\.-|-................//..|-...|............-.\......
........\..........\..........\......................./......................./......|........-.......|...-...
.........././.....-...-..................-.|..........................-.............-......................./.
.\..........|...........--....................\...-.\.........\......-.................../....|./..\..........
......\.........\.|..||.....|...../........-..........|....|.....|....\..|..........\.........|...............
...........\....-.../......-............/.............-......../.-...................-....|.....-\.......|....
/.....................-.../...............-./....................../|....|.-...|.................\......../...
................../.............|..........\..|..\....|....-...../...-.......\../......\....-...../.||........
./-|.......\..../........../-....../......./...-....-................|............|.................-..../....
.....................\....................|\.-../.......................|.......|.....-........-./..|.........
..........|...\......\......................|./...........--................-..........-.......\...\-..\|.\..\
.......\...-|................\....|......................../............................\..........-.\........
./.......|................\...\........./.........|..................|.....-.......-.....|..|-............-...
...|............/....-.\...........\...../..|..-...../..|.......-........\...-..............-.................
.\-.....................-.........-.\.................|....-.....\....\.\\.//|.........\../.\.........../..-..
......................................|\-........../..-.........-.........................................-|..
........./.../..|.....-............./..\............./............../..............-\.......|....-....-.......
.|............|......-/.-......-......-............-........|...../......\/....\../........|.......|..........
.......|...........\.................-......................\..-...........................|..................
|.........\..\.....-.../.........................-\.................|.........\...............................
....-..........\.....././.............../..........-|...|...../........................-......|....-..........
....................\.|.........\....|..........-.............\..........................|...........\........
.............|.../......|.........../....................../....-..................../......................./
.\...|....-../.............|............-..-.......||..........|............\/..................\...-.........
........\/....-...................../..............-.....................-................................-...
/-..........-......\.....|.....\....\............./..../...........|........-....\...............\.........|..
...../..................\........................./.-...../.....\....-..-\.....\...|................./........
......../......./.......................-.......-..\//...........-|.............../...\.\./..\................
..............................|...................../......\..|.............\\......................./..-.....
....\.....|..............|..................|...|.............|............--.......-..-.................../..
....|.............../.\.............................................|...................../.........\.........
.........\...../.../......\....................................................|.....-.../...\..........\.....
-\............\.......................-...................-..../-........./.................................-.
|.....\.....................\...................|..|..\....../.......\...|......\.............../-.-......|...
.......|.........\.................|..-.............................\............................/............
........................-.-........./..../.|.|.../..............\../....-..........|............../.....\\....
...........\-...........||..........................................\.........|...........-...-...........-\..
..................|................................./.................||.|..........|.....................|.|.
....../.............................|.............................-/..|......./............................../
./................../.|................................-...\.......|..................|............\-..|.....|
\.....|.-...........-|.................../............\................../......................./.......\....
.\.....................\.............|...............-......\...-........-...............-..........|../......
.../..\...|........\\....\............-..|.....|........-/..........|....|.........\..|/...-.....-.\.../.....\
......................../....-................................\..|.........................\..................
..................\....-............\\\/..........|.................|...../..|.............|..................
..|./.......|.....-............|...............|....|............-...\...........................\.\..........
.....|-..\...\.........................|../...................../......\............\.........................
-..-...........-............|......../................./......\.....-...|...............|.....................
........|.......|.......\.|...\...../..\.../......................\.......\...\..................\....-..../..
....-.-./.|...............-.-.............-.............../......./..........|.|../...............|.-.........
...........\..-............../..........-..-../........../.....-/-|.........................-.............\...
............................\.......//.|......../...........|\.....\...........-..-.......-/-.................
..................................\..-..........|./..................../\............./............../........
.....\..........\.......-............/.....................-.|....-......................./.|.................
...............................|.......\........../.............-.....|.......\..\........................-...
......\.........\\............../..-..............\...|..--......-.....\......./................./............
.\.......\.....-...........-......................\........................../......../..../.-./..\........../
.......|.......|........|...\\................./..../..\....\...\...........-.....................\.........-/
....../........................................\..........-..|...............\....................|...-.......
.|.|......./..........\........|......-......-............................|..|..\.........\.......-...........
.....\.\-.-......\.........../.......\\..|..\........\/....\|.............................................\...
.....................-.......................|............................................../.................
..................\...-|............|........................-....../...........||............................
........./............................./.....-....../.-...........-...........................................
.........|...........-.........\......\.............\-.....|...-...|-.../..|.............\.....|....-.........
.....|.....................................|.../........./|...|.|..................\..........................
..\...........-.............|................//.............|........|.........../.\..............\...........
..-\..-............|.\............../../.....||.../......-......|...-/...|..../../...................-/.\.....
.......\.........../.\......\.........\...........-..............\..............|.........-..........-.-......
../...................\|............................../...................|.............../.............-/....
................/\.................|.....................\...|.\....................-.....-...................
......................................................|................................\..\../...|.......|.-./
.........//..|.......\.-...............|............................................................-.|.......
........../.\........\............-./.\....../..//...........\..........|.\.\...|/\...-...\...................
...-................/............../.............................................-../.-........\........../...
...................-...............-.....-............/................./|.-.|...\.\...............-..-......|
\....../.....|......\.........|../.....|......-..../....................-................/...\......\....../..
...../...-.......................\..|\...-...\.|.........|.......|.................\.............-............
...........................\/............................../...........-.......-..../......../......\...-.....
.............................|.-......................-|\...--...............................\..............\.
..............\.|......./..........\..........\/.../......|.....-../......../.....\...|-...........\........./
.............../........\...................../...|......................-...|.|......./.....-................
..-...............--..-...-............-..-\......................-.......|..............|........\.\.....-...
1 change: 1 addition & 0 deletions output/16-1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
8125
1 change: 1 addition & 0 deletions output/16-2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
8489
69 changes: 69 additions & 0 deletions src/main/scala/adventofcode/solutions/Day16.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package adventofcode.solutions

import adventofcode.Definitions.*

@main def Day16 = Day(16) { (input, part) =>

case class Vec(i: Int, j: Int):
inline def +(that: Vec): Vec = Vec(i + that.i, j + that.j)
inline def *(v: Int): Vec = Vec(i * v, j * v)
def dot(that: Vec): Int = i * that.i + j * that.j
case class Beam(position: Vec, direction: Vec):
def moved: Beam = copy(position = position + direction)

enum Tile:
case Empty
case Mirror(nesw: Boolean)
case Splitter(vertical: Boolean)
import Tile.*

val map = input.toLines.map(_.map {
case '.' => Empty
case '/' => Mirror(true)
case '\\' => Mirror(false)
case '|' => Splitter(true)
case '-' => Splitter(false)
})

val Zero = Vec(0, 0)
val initialBeam = Beam(Zero, Vec(0, 1))

def move(beam: Beam, tile: Tile): Set[Beam] =
val newBeams = tile match
case Empty => Set(beam)
case Mirror(nesw) =>
val normal = if nesw then Vec(1, 1) else Vec(-1, 1)
val absNormal = if normal.dot(beam.direction) > 0 then normal else normal * -1
val newDirection = beam.direction + absNormal * -1 * beam.direction.dot(absNormal)
Set(beam.copy(direction = newDirection))
case Splitter(vertical) =>
val direction = if vertical then Vec(1, 0) else Vec(0, 1)
if beam.direction.dot(direction) == 0 then
Set(beam.copy(direction = direction), beam.copy(direction = direction * -1))
else
Set(beam)
newBeams.map(_.moved)

def simulate(beams: Set[Beam], history: Set[Beam]): Int =
if beams.nonEmpty then
val newBeams = beams.flatMap(beam => move(beam, map(beam.position.i)(beam.position.j)))
.filter(beam => map.indices.contains(beam.position.i) && map(beam.position.i).indices.contains(beam.position.j))
.diff(history)
val newHistory = history ++ beams
simulate(newBeams, newHistory)
else
history.map(_.position).size

part(1) = simulate(Set(initialBeam), Set.empty)

val borders =
Seq(
(map.head.indices.map(Vec(0, _)), Vec(1, 0)),
(map.indices.map(Vec(_, 0)), Vec(0, 1)),
(map.indices.map(Vec(_, map.head.size - 1)), Vec(0, -1)),
(map.head.indices.map(Vec(map.size - 1, _)), Vec(-1, 0)),
).flatMap((positions, direction) => positions.map(position => Beam(position, direction)))

part(2) = borders.map(beam => simulate(Set(beam), Set.empty)).max

}

0 comments on commit 6fc3e9b

Please sign in to comment.