day 2 part 2

This commit is contained in:
RingOfStorms (Joshua Bell) 2025-12-08 23:57:23 -06:00
parent 6a41f0587c
commit e9f2b69924
2 changed files with 59 additions and 20 deletions

View file

@ -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;
} }

View file

@ -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 [ ];
} }