day 6
This commit is contained in:
parent
85ecd2cfd0
commit
a0a3593bd5
4 changed files with 219 additions and 1 deletions
62
day6/default.nix
Normal file
62
day6/default.nix
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
{ lib, utils, ... }:
|
||||||
|
with lib;
|
||||||
|
with builtins;
|
||||||
|
with utils;
|
||||||
|
let
|
||||||
|
grid = map stringToCharacters (readLines ./input);
|
||||||
|
rotMat = [ [ 0 1 ] [ (-1) 0 ] ];
|
||||||
|
|
||||||
|
state = let
|
||||||
|
r = findFirst (pipe' [ (elemAt grid) (elem "^") ]) 0 (listRange grid);
|
||||||
|
c = let row = elemAt grid r;
|
||||||
|
in findFirst (pipe' [ (elemAt row) (eq "^") ]) 0 (listRange row);
|
||||||
|
in rec {
|
||||||
|
pos = [ r c ];
|
||||||
|
direction = [ (-1) 0 ];
|
||||||
|
path = [ pos ];
|
||||||
|
cyclic = false;
|
||||||
|
turns = { }; # only turns are relevant to check cycles
|
||||||
|
};
|
||||||
|
|
||||||
|
raycastUntil = pred: direction: pos:
|
||||||
|
if pred pos then
|
||||||
|
[ ]
|
||||||
|
else
|
||||||
|
[ pos ] ++ (raycastUntil pred direction (vecSum pos direction));
|
||||||
|
|
||||||
|
constructPath = state: extraObstruction:
|
||||||
|
let
|
||||||
|
isBlocked = pos: (matIndex pos grid) == "#" || pos == extraObstruction;
|
||||||
|
|
||||||
|
# batch pathing via "ray cast" to reduce required recursion depth to something the interpretter likes
|
||||||
|
pathAddition =
|
||||||
|
raycastUntil (pos: !inRangeMatrix pos grid || isBlocked pos)
|
||||||
|
state.direction state.pos;
|
||||||
|
|
||||||
|
pos = last pathAddition;
|
||||||
|
turnEntry = "${toString pos} ${toString state.direction}";
|
||||||
|
in if (inRangeMatrix (vecSum pos state.direction) grid)
|
||||||
|
&& !state.cyclic then
|
||||||
|
(constructPath {
|
||||||
|
direction = matVecMul rotMat state.direction;
|
||||||
|
inherit pos;
|
||||||
|
path = state.path ++ pathAddition;
|
||||||
|
cyclic = state.cyclic
|
||||||
|
|| (hasAttr turnEntry state.turns); # logarithmic lookup
|
||||||
|
turns = state.turns // { "${turnEntry}" = null; };
|
||||||
|
} extraObstruction)
|
||||||
|
else {
|
||||||
|
inherit pos;
|
||||||
|
inherit (state) direction cyclic turns;
|
||||||
|
path = state.path ++ pathAddition;
|
||||||
|
};
|
||||||
|
|
||||||
|
uniquePositions = unique (constructPath state null).path;
|
||||||
|
|
||||||
|
obstructionCandidates = remove state.pos uniquePositions;
|
||||||
|
|
||||||
|
in {
|
||||||
|
part1 = length uniquePositions;
|
||||||
|
part2 = count (candidate: (constructPath state candidate).cyclic)
|
||||||
|
obstructionCandidates;
|
||||||
|
}
|
10
day6/example
Normal file
10
day6/example
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
....#.....
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
..#.......
|
||||||
|
.......#..
|
||||||
|
..........
|
||||||
|
.#..^.....
|
||||||
|
........#.
|
||||||
|
#.........
|
||||||
|
......#...
|
130
day6/input
Normal file
130
day6/input
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
..........#.............................#...............#...........#....................#...........#............................
|
||||||
|
..............................#.......#...#.....#.....#...............#.#..#.......................#............#.................
|
||||||
|
.............#...........#.#........#............#..........................#.........#.......#......#............................
|
||||||
|
......................................................#....#..#.............#................................#...#............##..
|
||||||
|
...............#.....#....................................#......................................................#................
|
||||||
|
..................##............#......#...............................................................#...................#......
|
||||||
|
.#......#...........................................................#............................#................................
|
||||||
|
#..#.............#...............................#.....#....#.............................#....#..............................#...
|
||||||
|
#...##..........#.........................#.................................................#............#...............#........
|
||||||
|
............#...............#..............................................#.................................#..........##........
|
||||||
|
..............#...................#......##...#.....#....................#.......................................................#
|
||||||
|
.#.....#....#......................#...#........................................#.#.............#.........#.......................
|
||||||
|
#..#...............#........##.........#.....#..........#.....##.........................#.....#.#................................
|
||||||
|
...............#...............................#.....#.................................................#..##......................
|
||||||
|
......#...................#..........#...........................................#....#...........................................
|
||||||
|
...............................................#...#....##.................................................#.....#................
|
||||||
|
.................#.........#..............................#........#...#...#...................................#..................
|
||||||
|
...........#..#.....#...#.........................#..........#.#.............#....#...................##..........................
|
||||||
|
.........................................#.........................#.#............#...#...##............................#.........
|
||||||
|
.....#......................................#....................................................#..............#.................
|
||||||
|
..................................................#..................#................#.............#.#..#..................#.....
|
||||||
|
............................................#.....#......................#........#..........................................#....
|
||||||
|
.......#..........................#...#...................................#.........................#...#..........#......#.......
|
||||||
|
............#...........##........................................................................#......................#........
|
||||||
|
#.#...............................................#........#..........#.#..#...#................................#.................
|
||||||
|
..#.........................#.#........................#....##..................................................#............#....
|
||||||
|
.....................................................................................#...............#...........#..........#.....
|
||||||
|
....................#..........#................................#...............................................#.................
|
||||||
|
#..............#.#...........#.........#..........#..........................#......................##........#.........#.........
|
||||||
|
....#....#...............................................................................#...#...........#............#...#...#...
|
||||||
|
.......................................................##......................#...#................................#.............
|
||||||
|
.......#...........##...........................#..............#..............................#...................#......#........
|
||||||
|
......#.........#..............................................................#........#..#..........#.......#..#...#.....#....#.
|
||||||
|
....#.............................................#........#....#..................................#..............................
|
||||||
|
..........#......#...........#....................................#..............#.......#...#............#.......................
|
||||||
|
...........................................................................................#.......#..............................
|
||||||
|
.#..................................................#.............................#..................#...................#........
|
||||||
|
......#..#.#................#.....................#..................................#.............#...............#..............
|
||||||
|
...............................#..................#........#......................................................................
|
||||||
|
......................#..................................................................................#.........#..............
|
||||||
|
...............................................................................................................................#..
|
||||||
|
.......#..............#...........................................................#......................#.......................#
|
||||||
|
#...............................#..............................#.......#..............................#...#...#........#..........
|
||||||
|
............................#....#...#.........#....#................................................................#............
|
||||||
|
.....................#.................................................................#..#....#..................#...............
|
||||||
|
......................#.............#.............................#...................................................#...........
|
||||||
|
....#.................#.#.........##................#.....#....................................................#.............#....
|
||||||
|
...............................#...#...................#.......................................#......#...........................
|
||||||
|
....#.............................................................................................................................
|
||||||
|
...#.......................................................................................................#............#.......#.
|
||||||
|
..#.............##.............................................................#...#............................#............#....
|
||||||
|
......................#.......#............#........................................................#..................#......#...
|
||||||
|
...................#.............#..................#..............................#............#........#...................#....
|
||||||
|
....................#...........#.........................................................#......#.......#...........#.....##.....
|
||||||
|
...........#.........................................#.............................#..............#..................#............
|
||||||
|
......................#.........#...................#......#...........................................#..........................
|
||||||
|
..#....#...#.............................#..............#.....................#............#...................................#..
|
||||||
|
.....#.............................#....#..................................#...................#...#.............#................
|
||||||
|
...................#...#...........#........................#.............#........................#...#.............#..........#.
|
||||||
|
...#...........#......#.......#..............#......#..........#.....#............................................................
|
||||||
|
..#......................................................#......#...........................#...........#......#..#...............
|
||||||
|
........#............................#.#....................#...#...#......#.....#...............................................#
|
||||||
|
.............#....#........#.........................................................................................#.........#..
|
||||||
|
....................................................................................................#.............................
|
||||||
|
..#........................#....#............................................................................#....................
|
||||||
|
.......................................#.....#.#.......................................#......#........#.#...................#....
|
||||||
|
.................#........#....................................#...#..#................................#..........................
|
||||||
|
...........#.................................................................................................#....................
|
||||||
|
......................#..................#...#.............#................##................#.......#...........#.........#.....
|
||||||
|
............#..#................#.............................................#............##..................##..........#......
|
||||||
|
......#.#.......................#............#...........................................................#........................
|
||||||
|
#......................................#.#......^...............................................#.................................
|
||||||
|
........#...........................................................#...............#.............................................
|
||||||
|
...#.............................................#.................#...............#.............................#...#.#..........
|
||||||
|
....................#........#...........##.......................#.................#..................#................#.........
|
||||||
|
#.................................................................................................................................
|
||||||
|
............#.......................................................................................#.#.........#..............#..
|
||||||
|
...............#....#............#..................................................#......##.................................#...
|
||||||
|
.............................#.........#...............#......#.......#.................#........................#........#.......
|
||||||
|
......................................................#........................................................#.................#
|
||||||
|
.................#.#...............#......................................................................................#....#..
|
||||||
|
........#.............#......................#...........#...........#......................................#..............#......
|
||||||
|
......................#......................#...........#.....#.....##............................................#....#.........
|
||||||
|
.............#................................................................................#..........#.....#..................
|
||||||
|
............##...........................#.................................#..#.#....................................#............
|
||||||
|
..............................................................................................#............................#......
|
||||||
|
...#.............................#..#..#....................................#..............#....#.................................
|
||||||
|
.....#..........................................................#.....#......#.........#..........................................
|
||||||
|
....##......#.....................#..........#..............#..................#.#..............#........#...........#....#.......
|
||||||
|
.....#...#.........#............#............#.............................................................#......................
|
||||||
|
.........#...................................#...........#.....................................##.....#............#..............
|
||||||
|
.....##.#............##.....................#..........................#.................................#........#...............
|
||||||
|
.......................#..............##...#...................................................#.........#........................
|
||||||
|
..#........#.......#...#..##............#....................................................................#...........#.....#..
|
||||||
|
..#.....................................................................#..............#.............#...................#........
|
||||||
|
...........#..........#..........#.....#.................................................................#..#.....................
|
||||||
|
..........#................#........................................................##.#...............................#.#......#.
|
||||||
|
#............................................#...........................##...#.......................#.............#.............
|
||||||
|
..#............#........................................................................................................#.........
|
||||||
|
....................................................#....................#............#...............#..........................#
|
||||||
|
........................................................................#.......#.....................................#.#.........
|
||||||
|
................#..#......................#...........................................#...........................................
|
||||||
|
........................##............................................#.............##..........................#.......#....#....
|
||||||
|
.........#.......#..............................#......#....#............#..................#...#.................................
|
||||||
|
#.........#............................#....#.#..#.........................................................##.....................
|
||||||
|
.#..##...............#....#.............................#...............#........#.......................................#......#.
|
||||||
|
...#............................................................#.....................#.................#.....#...................
|
||||||
|
...#...........#..#.............................#.....#.............................................................#.............
|
||||||
|
...#.........................#..............................................................................................##....
|
||||||
|
.........................#...........................#.......................#...........#........................................
|
||||||
|
.#..................................#.............................................................................................
|
||||||
|
....................................................................#...........##.....#.#.........#.....#........................
|
||||||
|
................#...............................#........#........................................................................
|
||||||
|
......#....#.................................#...................................#.#.........#.....#....................#.........
|
||||||
|
................#..............................#.......................#...#.....#.......#................#.......................
|
||||||
|
....................#......................................#..#...........#.#.................#...#.......................#.......
|
||||||
|
.............#..#...#............................#.#...........................................#.......................#..........
|
||||||
|
.........#..........#.................#....................................#.#..........................................#.........
|
||||||
|
....#.............#......................................................#...........#...........................#................
|
||||||
|
........#.#............................#...........................................#.................#..............#..........#..
|
||||||
|
..............#..........................#............#.........#....#...#.....#.........................#....#...............##..
|
||||||
|
...................#.........................................................#.......#........#..............#..........#.........
|
||||||
|
.#........#....#..................................#..#.#...............#............#...........#.................................
|
||||||
|
...............................................................................................#.....#....#.............#.........
|
||||||
|
...........#..........#...........................................#.........#..............#................#..........#..........
|
||||||
|
............#.................................###..............#.#...............................................................#
|
||||||
|
......#...................................................................................#............#...#..........#.....#.....
|
||||||
|
.............#..................#...................#......#.........#..#.......................#....#................#..........#
|
||||||
|
..#....##................................#.................#...........................#.......#....#...#..........#..............
|
||||||
|
...............................#......................................#.........#.............#......................#..........#.
|
18
utils.nix
18
utils.nix
|
@ -13,9 +13,25 @@ with builtins; rec {
|
||||||
eq = x: y: x == y;
|
eq = x: y: x == y;
|
||||||
greaterThan = x: y: x > y;
|
greaterThan = x: y: x > y;
|
||||||
listRange = l: range 0 ((length l) - 1);
|
listRange = l: range 0 ((length l) - 1);
|
||||||
transpose = l: map (i: map ((flip elemAt) i) l) (listRange (head l));
|
|
||||||
invert = f: x: !(f x);
|
invert = f: x: !(f x);
|
||||||
elemAtMid = l: elemAt l ((length l) / 2);
|
elemAtMid = l: elemAt l ((length l) / 2);
|
||||||
removeAll = rl: (flip pipe) (map remove rl);
|
removeAll = rl: (flip pipe) (map remove rl);
|
||||||
pipe' = flip pipe;
|
pipe' = flip pipe;
|
||||||
|
inRange = i: l: (i >= 0) && (i < length l);
|
||||||
|
|
||||||
|
transpose = l: map (i: map ((flip elemAt) i) l) (listRange (head l));
|
||||||
|
matVecMul = m: v: map (r: foldl' add 0 (zipListsWith mul v r)) m;
|
||||||
|
vecSum = zipListsWith add;
|
||||||
|
matIndex = i: pipe' (map (flip elemAt) i);
|
||||||
|
inRangeMatrix = i: m:
|
||||||
|
if i == [ ] then
|
||||||
|
true
|
||||||
|
else
|
||||||
|
(isList m) && (inRange (head i) m)
|
||||||
|
&& (inRangeMatrix (tail i) (elemAt m (head i)));
|
||||||
|
getMatrixIndices = m:
|
||||||
|
crossLists (x: y: [ x y ]) [
|
||||||
|
(listRange m)
|
||||||
|
(listRange (head m))
|
||||||
|
]; # fixme: only 2d, not arbitrary tensors.
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue