day 2 part 2
This commit is contained in:
parent
6a41f0587c
commit
e9f2b69924
2 changed files with 59 additions and 20 deletions
|
|
@ -8,12 +8,7 @@
|
||||||
with builtins;
|
with builtins;
|
||||||
with import ./utils.nix;
|
with import ./utils.nix;
|
||||||
let
|
let
|
||||||
# reversedChars =
|
# part 1 simple repeat middle of word
|
||||||
# str:
|
|
||||||
# let
|
|
||||||
# len = length str;
|
|
||||||
# in
|
|
||||||
# builtins.genList (i: builtins.elemAt str (len - 1 - i)) len;
|
|
||||||
isStrPatternSplit =
|
isStrPatternSplit =
|
||||||
str:
|
str:
|
||||||
let
|
let
|
||||||
|
|
@ -25,27 +20,46 @@ let
|
||||||
half = strLen / 2;
|
half = strLen / 2;
|
||||||
firstHalf = substring 0 half str;
|
firstHalf = substring 0 half str;
|
||||||
secondHalf = substring half strLen str;
|
secondHalf = substring half strLen str;
|
||||||
# secondReversed = reversedChars secondHalf;
|
|
||||||
in
|
in
|
||||||
firstHalf == secondHalf
|
firstHalf == secondHalf
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
|
# part 2 any repeat num
|
||||||
|
isStrPatternRepeated =
|
||||||
|
str:
|
||||||
|
let
|
||||||
|
strLen = stringLength str;
|
||||||
|
splits = reverseList (genList (i: i + 1) strLen);
|
||||||
|
in
|
||||||
|
any (
|
||||||
|
split:
|
||||||
|
if split < strLen && mod strLen split == 0 then
|
||||||
|
let
|
||||||
|
parts = splitStringByLength str split;
|
||||||
|
in
|
||||||
|
all (e: e == elemAt parts 0) parts
|
||||||
|
else
|
||||||
|
false
|
||||||
|
) splits;
|
||||||
|
|
||||||
ranges = map (range: map (v: toIntBase10 v) (split "-" range)) (split "," input);
|
ranges = map (range: map (v: toIntBase10 v) (split "-" range)) (split "," input);
|
||||||
fullRanges = map (itr: map (v: toString v) (rangeInclusive (elemAt itr 0) (elemAt itr 1))) ranges;
|
fullRanges = map (itr: map (v: toString v) (rangeInclusive (elemAt itr 0) (elemAt itr 1))) ranges;
|
||||||
|
|
||||||
|
getSumOfBadIdsGivenBadIdFunc =
|
||||||
|
badIdFunc:
|
||||||
|
let
|
||||||
invalidIds = flatten (
|
invalidIds = flatten (
|
||||||
map (
|
map (
|
||||||
range:
|
range: (reduce (invalidIds: id: invalidIds ++ (if badIdFunc id then [ id ] else [ ])) [ ] range)
|
||||||
(reduce (
|
|
||||||
invalidIds: id: invalidIds ++ (if isStrPatternSplit id then [ id ] else [ ])
|
|
||||||
) [ ] range)
|
|
||||||
) fullRanges
|
) fullRanges
|
||||||
);
|
);
|
||||||
invalidIdNums = map (v: toIntBase10 v) invalidIds;
|
invalidIdNums = map (v: toIntBase10 v) invalidIds;
|
||||||
invalidIdSum = sum invalidIdNums;
|
invalidIdSum = sum invalidIdNums;
|
||||||
in
|
in
|
||||||
|
invalidIdSum;
|
||||||
|
in
|
||||||
{
|
{
|
||||||
part1 = invalidIdSum;
|
part1 = getSumOfBadIdsGivenBadIdFunc isStrPatternSplit;
|
||||||
part2 = 0;
|
part2 = getSumOfBadIdsGivenBadIdFunc isStrPatternRepeated;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ rec {
|
||||||
mod = a: b: a - b * (floor (a / b));
|
mod = a: b: a - b * (floor (a / b));
|
||||||
min = a: b: if a < b then a else b;
|
min = a: b: if a < b then a else b;
|
||||||
max = a: b: if a > b then a else b;
|
max = a: b: if a > b then a else b;
|
||||||
split = delim: input: filter (s: isString s && s != "") (split delim input);
|
split = delim: input: filter (s: isString s && s != "") (builtins.split delim input);
|
||||||
reduce = foldl'; # foldl' (acc: elem: acc + elem) 0 [1 2 3]
|
reduce = foldl'; # foldl' (acc: elem: acc + elem) 0 [1 2 3]
|
||||||
flatten = input: concatMap (x: if isList x then x else [ x ]) input;
|
flatten = input: concatMap (x: if isList x then x else [ x ]) input;
|
||||||
rangeInclusive =
|
rangeInclusive =
|
||||||
|
|
@ -17,4 +17,29 @@ rec {
|
||||||
in
|
in
|
||||||
genList (i: min + i) len;
|
genList (i: min + i) len;
|
||||||
sum = input: reduce (sum: v: sum + v) 0 input;
|
sum = input: reduce (sum: v: sum + v) 0 input;
|
||||||
|
reverseList =
|
||||||
|
list:
|
||||||
|
if builtins.length list == 0 then
|
||||||
|
[ ]
|
||||||
|
else
|
||||||
|
# Recursively reverse the tail and append the head to the end
|
||||||
|
(reverseList(builtins.tail list)) ++ [ (builtins.head list) ];
|
||||||
|
splitStringByLength =
|
||||||
|
# @param s: The input string.
|
||||||
|
# @param len: The desired length of each part.
|
||||||
|
s: len:
|
||||||
|
let
|
||||||
|
# Recursive helper function
|
||||||
|
splitRec =
|
||||||
|
currentString: acc:
|
||||||
|
if stringLength currentString <= 0 then
|
||||||
|
reverseList acc
|
||||||
|
else
|
||||||
|
let
|
||||||
|
chunk = substring 0 len currentString;
|
||||||
|
remaining = substring len (stringLength currentString - len) currentString;
|
||||||
|
in
|
||||||
|
splitRec remaining ([ chunk ] ++ acc);
|
||||||
|
in
|
||||||
|
splitRec s [ ];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue