41 lines
901 B
Nix
41 lines
901 B
Nix
{ pkgs, lib }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
input = pipe (fileContents ./input.txt) [
|
|
(splitString "\n")
|
|
(map (split "[[:space:]]+"))
|
|
(map (filter (x: x != [])))
|
|
(map (map toInt))
|
|
];
|
|
|
|
# - The levels are either all increasing or all decreasing.
|
|
# - Any two adjacent levels differ by at least one and at most three.
|
|
safeCondition = xs: let
|
|
zipped = zipLists xs (tail xs);
|
|
in (all ({ fst, snd }: let x = fst - snd; in 1 <= x && x <= 3) zipped)
|
|
|| (all ({ fst, snd }: let x = fst - snd; in -1 >= x && x >= -3) zipped);
|
|
|
|
answer1 = lib.pipe input [
|
|
(filter safeCondition)
|
|
length
|
|
toString
|
|
];
|
|
|
|
answer2 = lib.pipe input [
|
|
(filter (xs: let
|
|
variants = genList (i: (take i xs) ++ (drop (i + 1) xs)) (length xs);
|
|
in any safeCondition variants))
|
|
length
|
|
toString
|
|
];
|
|
in
|
|
pkgs.writeText "answers" ''
|
|
Task1:
|
|
${answer1}
|
|
|
|
Task2:
|
|
${answer2}
|
|
''
|