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); }