{ pkgs, lib }: with lib; let input = fileContents ./input.txt; answer1 = lib.pipe input [ (split "mul\\(([[:digit:]]{1,3}),([[:digit:]]{1,3})\\)") (lib.filter isList) (map (map toInt)) (map (xs: (head xs) * (last xs))) (foldl add 0) toString ]; answer2 = lib.pipe input [ (split "mul\\(([[:digit:]]{1,3}),([[:digit:]]{1,3})\\)|(do\\(\\))|(don't\\(\\))") (lib.filter isList) (map (xs: if elemAt xs 0 != null then (toInt (elemAt xs 0)) * (toInt (elemAt xs 1)) else if elemAt xs 2 != null then "do" else if elemAt xs 3 != null then "dont" else null )) (foldl ({ toggle, sum }: x: { toggle = if x == "do" then true else if x == "dont" then false else toggle; sum = sum + (if toggle && isInt x then x else 0); }) { toggle = true; sum = 0; }) (x: toString x.sum) ]; in pkgs.writeText "answers" '' Task1: ${answer1} Task2: ${answer2} ''