73 lines
1.6 KiB
Nix
73 lines
1.6 KiB
Nix
|
{lib, ...}: input: rec {
|
||
|
|
||
|
content = lib.trim input;
|
||
|
|
||
|
emptyLines = lines: lines
|
||
|
|> builtins.length
|
||
|
|> genStrList ""
|
||
|
;
|
||
|
|
||
|
genStrList = str: builtins.genList (_: str);
|
||
|
|
||
|
rotated = input: input
|
||
|
|> lib.strings.splitString "\n"
|
||
|
|> map (lib.stringToCharacters)
|
||
|
|> (lines: builtins.foldl'
|
||
|
(lib.zipListsWith (a: b: a + b))
|
||
|
(emptyLines lines)
|
||
|
lines)
|
||
|
|> lib.concatStringsSep "\n"
|
||
|
;
|
||
|
|
||
|
len = builtins.length (lib.strings.splitString "\n" content);
|
||
|
|
||
|
diagonal = input: input
|
||
|
|> lib.strings.splitString "\n"
|
||
|
|> map (lib.stringToCharacters)
|
||
|
|> (lines: builtins.foldl'
|
||
|
({acc, i}: line: {
|
||
|
acc = lib.zipListsWith (a: b: a + b) acc
|
||
|
((genStrList " " i) ++ line ++ (genStrList " " (len - i)));
|
||
|
i = i + 1;
|
||
|
})
|
||
|
{
|
||
|
acc = (emptyLines lines) ++ emptyLines (builtins.elemAt lines 0);
|
||
|
i = 0;
|
||
|
}
|
||
|
lines)
|
||
|
|> ({acc, ...}: acc)
|
||
|
|> map lib.trim
|
||
|
|> lib.concatStringsSep "\n"
|
||
|
;
|
||
|
|
||
|
reversed = input: input
|
||
|
|> lib.strings.splitString "\n"
|
||
|
|> map reverseString
|
||
|
|> lib.concatStringsSep "\n"
|
||
|
;
|
||
|
|
||
|
reverseString = s: s
|
||
|
|> lib.stringToCharacters
|
||
|
|> lib.reverseList
|
||
|
|> lib.concatStringsSep ""
|
||
|
;
|
||
|
|
||
|
search = term: input: input
|
||
|
|> builtins.split term
|
||
|
|> builtins.filter lib.isList
|
||
|
|> builtins.length
|
||
|
;
|
||
|
|
||
|
searchForwardAndBack = term: input:
|
||
|
search term input +
|
||
|
search (reverseString term) input;
|
||
|
|
||
|
findXMAS = searchForwardAndBack "XMAS";
|
||
|
|
||
|
part1result = findXMAS content
|
||
|
+ findXMAS (diagonal content)
|
||
|
+ findXMAS (rotated content)
|
||
|
+ findXMAS (diagonal (reversed content))
|
||
|
;
|
||
|
}
|