advent-of-code-2024/day1/part2.nix
2024-12-11 19:02:54 -07:00

46 lines
No EOL
1.6 KiB
Nix

let
# Import nixpkgs lib and input file
inherit ((builtins.getFlake (builtins.toString ./..)).inputs.nixpkgs) lib;
input = builtins.readFile (builtins.toString ./input.txt);
# Do parsing
parsed = ( # Define function to sort lines into two lists
lib.lists.foldr
(cur: acc: {
first = acc.first ++ [(lib.strings.toIntBase10 (builtins.elemAt cur 0))];
second = acc.second ++ [(lib.strings.toIntBase10 (builtins.elemAt cur 1))];
})
{ first = []; second = []; }
) ( # Call with input split on newlines and 3 spaces; formatted like [ [ 1 2 ] [ 3 4 ] [ 5 6 ] ]
lib.lists.forEach
(lib.strings.splitString "\n" input)
(e: lib.strings.splitString " " e)
);
collapsed = (
lib.lists.foldr
(cur: acc:
acc // (
if (builtins.hasAttr "${builtins.toString cur}" acc)
then {
"${builtins.toString cur}" = acc."${builtins.toString cur}" + 1;
}
else {
"${builtins.toString cur}" = 1;
}
)
)
{}
) parsed.second;
output = (
lib.lists.foldr
(cur: acc:
acc + (
if (builtins.hasAttr "${builtins.toString cur}" collapsed)
then (cur * collapsed."${builtins.toString cur}")
else 0
)
)
0
) parsed.first;
in output