54 lines
1.3 KiB
Nix
54 lines
1.3 KiB
Nix
|
{ pkgs, lib }:
|
||
|
|
||
|
with lib;
|
||
|
|
||
|
let
|
||
|
input = pipe (fileContents ./input.txt) [
|
||
|
(splitString "\n")
|
||
|
(map (builtins.split ": "))
|
||
|
(map (flip builtins.elemAt 2))
|
||
|
(map (builtins.split "; "))
|
||
|
(map (filter (x: x != [ ])))
|
||
|
(map (map (builtins.split ", ")))
|
||
|
(map (map (filter (x: x != [ ]))))
|
||
|
(map (map (map (x: let
|
||
|
s = builtins.split " " x;
|
||
|
name = builtins.elemAt s 2;
|
||
|
value = toInt (head s);
|
||
|
in nameValuePair name value))))
|
||
|
(map (map listToAttrs))
|
||
|
(imap1 (id: rounds: {
|
||
|
inherit id rounds;
|
||
|
}))
|
||
|
];
|
||
|
|
||
|
answer1 = pipe input [
|
||
|
(builtins.filter ({ rounds, ... }:
|
||
|
builtins.all ({ red ? 0, green ? 0, blue ? 0 }: red <= 12 && green <= 13 && blue <= 14) rounds
|
||
|
))
|
||
|
(map ({ id, ... }: id))
|
||
|
(foldr (a: b: a + b) 0)
|
||
|
toString
|
||
|
# (generators.toPretty { })
|
||
|
];
|
||
|
|
||
|
answer2 = pipe input [
|
||
|
(map ({ rounds, ... }: let
|
||
|
max = foldr (a: b: if a > b then a else b) 0;
|
||
|
maxRed = max (map ({ red ? 0, ... }: red) rounds);
|
||
|
maxGreen = max (map ({ green ? 0, ... }: green) rounds);
|
||
|
maxBlue = max (map ({ blue ? 0, ... }: blue) rounds);
|
||
|
in maxRed * maxGreen * maxBlue))
|
||
|
(foldr (a: b: a + b) 0)
|
||
|
toString
|
||
|
];
|
||
|
in
|
||
|
assert trace answer2 true;
|
||
|
pkgs.writeText "answers" ''
|
||
|
Task1:
|
||
|
${answer1}
|
||
|
|
||
|
Task2:
|
||
|
${answer2}
|
||
|
''
|