27 lines
819 B
Nix
27 lines
819 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:
|
|
splitPair (splitPair overlapFunc a) b || splitPair (splitPair overlapFunc b) a;
|
|
overlaps = overlapFunc: map boolToInt (map (splitPair (hasOverlap overlapFunc)) pairs);
|
|
in {
|
|
part1 = sum (overlaps completeOverlap);
|
|
part2 = sum (overlaps partialOverlap);
|
|
} |