Day 6. Part 2 took 15 seconds to run... hm. But it works! Elixir is comfortable, but maybe not very exciting
parent
5f874999ef
commit
c58aebfe43
@ -0,0 +1,130 @@
|
|||||||
|
.#..#......................#........#........................................#.............#......#...............#...............
|
||||||
|
.......#...........#........................#..............#.....#......#..##............#.....#.....................##...........
|
||||||
|
.#.....#........#.##..#.............#...........#................#............#.#.........#.....................#......#..........
|
||||||
|
...........#...#.#.................................#.....................#............#.....#.#................#..#...............
|
||||||
|
..................................................................................#...............................................
|
||||||
|
..................#....................#.................#.........#..#.................#...........#...................#.........
|
||||||
|
.......#......#................#.......#............................#.................#.........................#...#........#....
|
||||||
|
................................#..............................................................#.........#.........#..............
|
||||||
|
.......................................................#............#......#........#.#...................#............#..........
|
||||||
|
.....#......#..............................................#..............................................#.......................
|
||||||
|
......#..........................................................................................#................#...............
|
||||||
|
............................#..................#............#..#.#..............#..........#......................................
|
||||||
|
......#..........................#...................#..........#....#.........................#.......................#....#..#..
|
||||||
|
..................................#..........#....................................................................#........#......
|
||||||
|
..#.................................#..................................................#......................#...................
|
||||||
|
.....#............#..................#......#...................................#.#........#.#......#........#....................
|
||||||
|
........#......................#.....#...#.##................................#......#.............................................
|
||||||
|
...........#.........#...............................................................................#............................
|
||||||
|
..................................#...##...............................#.............#.........................................##.
|
||||||
|
..........................#.#..#......................................#........#..............................#...................
|
||||||
|
......#...........###..#....#........................................................................................#............
|
||||||
|
..............#.....................................................................#......##.............#.......................
|
||||||
|
.................................#...................#.........#..............................................#...........#.......
|
||||||
|
....................#..#...................................................#................................#........#............
|
||||||
|
........................................#.#.#..................#....................#.....#.................#.....................
|
||||||
|
.........................#....#.....#.................##...............................................#.......#...#..............
|
||||||
|
..#.........................#....................#.........................#..............................#...................#...
|
||||||
|
..................##....#..#..#.#.................................................................#...............................
|
||||||
|
..............#........................................................#.............................#......#.....................
|
||||||
|
.................#...........#........................#......#..........##....................#.................................#.
|
||||||
|
..........................#.............................................#..#.................................#.........#...#......
|
||||||
|
..#..................##.....................................................#.....................#.......#.....#.................
|
||||||
|
....#.........................................#..................#.#.........................#.......................#............
|
||||||
|
...#.....#.#..............................................................#................#......................#...#........#..
|
||||||
|
.............................#..#......#.....................................................##...................................
|
||||||
|
...........#......................#....#.........#........................#......................................................#
|
||||||
|
............#.............................................#.................................#....#................................
|
||||||
|
..............................................................#.............#................#.........#.........................#
|
||||||
|
..........................................#....#........#......................#.....#.............#..............................
|
||||||
|
..#..#.............#...............................................#.....................................................#........
|
||||||
|
................................................................................#.............#...................................
|
||||||
|
...............................................#.......................#................#............#....................#.#.....
|
||||||
|
.......................#.............................#.#..................#...#....#.................................#...#.....#..
|
||||||
|
.......................#...........................#.........................................#.........#.........................#
|
||||||
|
...#.........#.....#..........................................#...................................................................
|
||||||
|
..........#..#...#...#........................#..........#..........................................#......#.........#............
|
||||||
|
...............#............................#.#...................##.....................................................#........
|
||||||
|
.........................................................#....................#........................#.........#....##....#...#.
|
||||||
|
......................................#.#................................................#........................#...............
|
||||||
|
..........#.............................................................#..#..#..............................#...#...#.#..........
|
||||||
|
.........#.....................................................................................#...........#..#......#..........#.
|
||||||
|
............................#....................#..............#...#.............................................................
|
||||||
|
...........................................................#........#......................#.................................#....
|
||||||
|
.........#..................#.........#.......#...............................#................#.............#...........#........
|
||||||
|
............................#.........#...........................................................................................
|
||||||
|
................................#...........#.......................................#..........#.#.....#..........................
|
||||||
|
..........................................#.................................................................................#.....
|
||||||
|
..............#...............................................#...................................................................
|
||||||
|
...#....#.....................#..........#..#......................#..............................................................
|
||||||
|
.......................#..........#.................................................#......#.............#........#....#..........
|
||||||
|
.........................................................................#.#......................................#...............
|
||||||
|
..........................................#.......................#...............................................#.........#...#.
|
||||||
|
............................#.......................................................#...#.........#..#...##........#..............
|
||||||
|
...........................................................................#..............#..........#.............#..............
|
||||||
|
#............#..#...#..#........#....................#...........#..#.........................................#..........#........
|
||||||
|
...........................................................................#......#..^.........#.........#........................
|
||||||
|
......#............................#.............................................................................................#
|
||||||
|
......................#.....#.......................................................#........................#..........#.........
|
||||||
|
................#....#.......#.............................#..............#....................#....#....................#........
|
||||||
|
......#...................................#..................................................................#....................
|
||||||
|
.....#..............#.#...........................................................#.................#.........#......#........#...
|
||||||
|
..#..#..#..#........#...........#...........#....##...........#.....................#.............................................
|
||||||
|
......................##..........................................................................................................
|
||||||
|
...........#............#.........................................................#.....#.....#....................#..............
|
||||||
|
#.............#..........#...............#..#.......................................#..............................#..............
|
||||||
|
#.......................................#........#....#.......................................................#..#.............#..
|
||||||
|
.......................#...#.....#..#...........................#...........#.........................#...#...#................#..
|
||||||
|
#...............................................................#........................................#.....................#..
|
||||||
|
..#.....................#............................##..........#..................##...#.....................................#..
|
||||||
|
.......#...................##..........................................#........#.................................................
|
||||||
|
.........................................................#............................................#...............##..........
|
||||||
|
.......................#......#..............................................................................................#....
|
||||||
|
...........#.......................................#.................................#..........#.............#..................#
|
||||||
|
....#.............#......#............................#........................#...................#......#.....#..........#......
|
||||||
|
.................................................................#................................#...............................
|
||||||
|
..........................................................#.......................#...#...........................................
|
||||||
|
.#............#...........................................#............................#..............................#...#.#.....
|
||||||
|
..#.................................................#.............................................#.....................#.........
|
||||||
|
.....#...............#...#.......................#.......................#......................................#...........#.....
|
||||||
|
...........#...#................................#.............................#........#.........................................#
|
||||||
|
..............................#.....................#......................#...#................................#.................
|
||||||
|
.........#.....................................................#...#......................................#................#......
|
||||||
|
.....#.....................#.................................#...................................................#....#......#....
|
||||||
|
................#.........#.........................#...........#...#..............................................#..............
|
||||||
|
.................................#....................................................................#..................#......#.
|
||||||
|
#..............#......................................................................#.....#.....................................
|
||||||
|
.............#......#..............##.#............#.#.....................#..........#.......#..........................#........
|
||||||
|
.......#............#.................#...........................................................#.............................#.
|
||||||
|
...........................#.......................#..................#....#....................................#.................
|
||||||
|
....#.....##...........................................#...........#.............#........................#.....#.................
|
||||||
|
............................#..............................................##..........#..................#.......#...............
|
||||||
|
#.............................#.............#...............................#..........#...#.....................................#
|
||||||
|
.............#.......#.....................................#...###......##...............#..#..............#.........#............
|
||||||
|
.......#......##.....#..................#....................................#............#................#...................#..
|
||||||
|
..............#......................#............#........#.....................................................#.........#....#.
|
||||||
|
.............#.......#...............................................##......#...........#...........#............................
|
||||||
|
#.#....#..............................................................#.........................................#...............#.
|
||||||
|
...#....#........................#.#.......#.....................#.............................#.#......................#.#.......
|
||||||
|
.##........................................................#.#...................#.....#.................................#........
|
||||||
|
............................#.#..................................#....#...........................................................
|
||||||
|
..................................................#......#...............#...............................#..#..#.......#..........
|
||||||
|
..........#......................#..........#.........................#...............#..##.....................#.................
|
||||||
|
...#.......#.........................................................#............#.........#...#................................#
|
||||||
|
....................#...................................#..........#.....#...#..#........#............#................#..........
|
||||||
|
...............................#........#.....................................#.....................................#.........#...
|
||||||
|
....#....................#...................................#.#........................#.........................................
|
||||||
|
.........#............................#.....................#.............#...........##.........#................................
|
||||||
|
.............................................##........................................#......#................................#..
|
||||||
|
...#...............................#.#...#...........#.............................#.............................................#
|
||||||
|
.............................#...........#................#..................................................#............#.......
|
||||||
|
................#....................................................................................#..#.#.......................
|
||||||
|
...#.............#.#..#.......................#.................#...............#..#....#..............#............#......#......
|
||||||
|
...........#......#............................#.....#..........#.#.................#..........#...........#...............#...#..
|
||||||
|
....#..................#...........................#.........#............#........#..........#..............................#....
|
||||||
|
..........#.......#...................#......#.......#.......#....................#.....................................#.........
|
||||||
|
...#....................................................#......#...#...................#.....................#....................
|
||||||
|
....................#..#.....#......#...................#............#.......................................#...............#....
|
||||||
|
.........................#.......#.....#..#.......#...........#......##..............................#.........#..................
|
||||||
|
.#...........#...#.........#....#...#.......#....#........................#...................#...#..................#............
|
||||||
|
.........##......#..............................#....................#..#...#..................#............................#.....
|
@ -0,0 +1,96 @@
|
|||||||
|
defmodule Day6 do
|
||||||
|
def run do
|
||||||
|
map =
|
||||||
|
File.read!("data.txt")
|
||||||
|
|> String.split("\n")
|
||||||
|
|> Enum.drop(-1)
|
||||||
|
|> Enum.map(&String.graphemes(&1))
|
||||||
|
|
||||||
|
height = length(map)
|
||||||
|
width = length(hd(map))
|
||||||
|
|
||||||
|
# find initial location
|
||||||
|
idx = Enum.concat(map) |> Enum.find_index(&(&1 != "#" and &1 != "."))
|
||||||
|
location = {div(idx, height), rem(idx, width)}
|
||||||
|
|
||||||
|
initialState = %{
|
||||||
|
map: map,
|
||||||
|
visited: MapSet.new(),
|
||||||
|
location: location,
|
||||||
|
bearing: 0,
|
||||||
|
height: height,
|
||||||
|
width: width
|
||||||
|
}
|
||||||
|
|
||||||
|
visited = walk(initialState, false)
|
||||||
|
IO.puts("Part 1: #{MapSet.size(visited)}")
|
||||||
|
|
||||||
|
# for each visited location, try putting an obstacle there
|
||||||
|
num_positions =
|
||||||
|
Enum.reduce(visited, 0, fn {row, col}, acc ->
|
||||||
|
# generate new map with obstacle in the path
|
||||||
|
new_row = List.replace_at(Enum.at(map, row), col, "#")
|
||||||
|
new_map = List.replace_at(map, row, new_row)
|
||||||
|
acc + walk(%{initialState | map: new_map}, true)
|
||||||
|
end)
|
||||||
|
|
||||||
|
IO.puts("Part 2: #{num_positions}")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp walk(state, detect_loops?) do
|
||||||
|
# if we're detecting loops, and this location & bearing is already in our map, get out
|
||||||
|
if detect_loops? and MapSet.member?(state.visited, {state.location, state.bearing}) do
|
||||||
|
1
|
||||||
|
else
|
||||||
|
# add current location to set
|
||||||
|
visited =
|
||||||
|
if detect_loops? do
|
||||||
|
# if we're detecting loops, also record the bearing
|
||||||
|
MapSet.put(state.visited, {state.location, state.bearing})
|
||||||
|
else
|
||||||
|
MapSet.put(state.visited, state.location)
|
||||||
|
end
|
||||||
|
|
||||||
|
{row, col} = state.location
|
||||||
|
|
||||||
|
# grab next location
|
||||||
|
{next_row, next_col} =
|
||||||
|
case state.bearing do
|
||||||
|
0 -> {row - 1, col}
|
||||||
|
1 -> {row, col + 1}
|
||||||
|
2 -> {row + 1, col}
|
||||||
|
3 -> {row, col - 1}
|
||||||
|
end
|
||||||
|
|
||||||
|
in_bounds =
|
||||||
|
next_row >= 0 and next_row < state.height and
|
||||||
|
next_col >= 0 and next_col < state.width
|
||||||
|
|
||||||
|
if !in_bounds do
|
||||||
|
# if not in bounds, end recursion
|
||||||
|
if detect_loops? do
|
||||||
|
# if we're detecting loops, we didn't find one. return 0
|
||||||
|
0
|
||||||
|
else
|
||||||
|
# otherwise return the list of visited locations
|
||||||
|
visited
|
||||||
|
end
|
||||||
|
else
|
||||||
|
cell = Enum.at(state.map, next_row) |> Enum.at(next_col)
|
||||||
|
|
||||||
|
new_state =
|
||||||
|
if cell == "#" do
|
||||||
|
# keep location the same, turn 90° right
|
||||||
|
new_bearing = Integer.mod(state.bearing + 1, 4)
|
||||||
|
%{state | visited: visited, bearing: new_bearing}
|
||||||
|
else
|
||||||
|
%{state | visited: visited, location: {next_row, next_col}}
|
||||||
|
end
|
||||||
|
|
||||||
|
walk(new_state, detect_loops?)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Day6.run()
|
@ -0,0 +1,10 @@
|
|||||||
|
....#.....
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
..#.......
|
||||||
|
.......#..
|
||||||
|
..........
|
||||||
|
.#..^.....
|
||||||
|
........#.
|
||||||
|
#.........
|
||||||
|
......#...
|
Loading…
Reference in New Issue