AoC-2022-Nix/4/solution.nix
2022-12-04 00:13:50 -07:00

27 lines
838 B
Nix

with import ../util.nix;
let
# read input
input = readFile ./input;
pairs = let
readRange = s: splitPair (a: b: [ (toInt a) (toInt b) ]) (splitString "-" s);
readPair = a: b: [ (readRange a) (readRange b) ];
in map
(line: splitPair readPair (splitString "," line))
(splitString "\n" input);
# overlap functions
partialOverlap = a1: a2: b1: b2:
a1 <= b1 && b1 <= a2 || a1 <= b2 && b2 <= a2;
completeOverlap = a1: a2: b1: b2:
a1 <= b1 && a2 >= b2;
# calc overlaps
hasOverlap = overlapFunc: a: b:
let a1 = head a; b1 = head b; a2 = last a; b2 = last b;
in overlapFunc a1 a2 b1 b2 || overlapFunc b1 b2 a1 a2;
overlaps = overlapFunc: map boolToInt (map (splitPair (hasOverlap overlapFunc)) pairs);
in {
part1 = sum (overlaps completeOverlap);
part2 = sum (overlaps partialOverlap);
}