diff --git a/4/solution.nix b/4/solution.nix index 225a0a0..341aa90 100644 --- a/4/solution.nix +++ b/4/solution.nix @@ -4,20 +4,26 @@ let # read input input = readFile ./input; pairs = let - readRange = s: let - l = splitString "-" s; + readRange = s: + let l = splitString "-" s; in [ (toInt (head l)) (toInt (last l)) ]; readPair = a: b: [ (readRange a) (readRange b) ]; - in map (line: split readPair (splitString "," line)) (splitString "\n" input); + in map + (line: split readPair (splitString "," line)) + (splitString "\n" input); - partiallyContainsOther = a1: a2: b1: b2: + # overlap functions + partialOverlap = a1: a2: b1: b2: a1 <= b1 && b1 <= a2 || a1 <= b2 && b2 <= a2; - containsOther = a1: a2: b1: b2: a1 <= b1 && a2 >= b2; - 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; + 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 (split (hasOverlap overlapFunc)) pairs); in { - part1 = sum (overlaps containsOther); - part2 = sum (overlaps partiallyContainsOther); + part1 = sum (overlaps completeOverlap); + part2 = sum (overlaps partialOverlap); } \ No newline at end of file