44 lines
856 B
Nix
44 lines
856 B
Nix
|
{ pkgs, lib }:
|
||
|
|
||
|
with lib;
|
||
|
|
||
|
let
|
||
|
input = pipe (fileContents ./input.txt) [
|
||
|
(splitString "\n")
|
||
|
(map (split "[[:space:]]+"))
|
||
|
(map (x: {
|
||
|
fst = elemAt x 0;
|
||
|
snd = elemAt x 2;
|
||
|
}))
|
||
|
(x: {
|
||
|
fst = catAttrs "fst" x;
|
||
|
snd = catAttrs "snd" x;
|
||
|
})
|
||
|
];
|
||
|
|
||
|
abs = x: if x < 0 then -x else x;
|
||
|
|
||
|
answer1 = lib.pipe input [
|
||
|
(mapAttrs (_: xs: sort lessThan (map toInt xs)))
|
||
|
({ fst, snd }: zipListsWith (x: y: abs (x - y)) fst snd)
|
||
|
(foldl add 0)
|
||
|
toString
|
||
|
];
|
||
|
|
||
|
similarity = left: right: let
|
||
|
rightCount = foldl (acc: x: acc // { ${x} = (acc.${x} or 0) + 1; }) { } right;
|
||
|
in foldl add 0 (map (x: (toInt x) * rightCount.${x} or 0) left);
|
||
|
|
||
|
answer2 = lib.pipe input [
|
||
|
({ fst, snd }: similarity fst snd)
|
||
|
toString
|
||
|
];
|
||
|
in
|
||
|
pkgs.writeText "answers" ''
|
||
|
Task1:
|
||
|
${answer1}
|
||
|
|
||
|
Task2:
|
||
|
${answer2}
|
||
|
''
|