···
2
+
input = builtins.readFile ../../shared/03/input.txt;
3
+
banks = builtins.filter (s: builtins.isString s && s != "") (builtins.split "\n" input);
5
+
# Helper to convert string to list of digit ints
6
+
stringToDigits = str:
8
+
len = builtins.stringLength str;
9
+
indices = builtins.genList (i: i) len;
10
+
in map (i: builtins.fromJSON (builtins.substring i 1 str)) indices;
12
+
# Part 1: Find highest pair (largestI * 10 + jVal) for each bank
17
+
digits = stringToDigits bank;
18
+
L = builtins.length digits;
20
+
# For each position j, find the largest digit before it and form pair
21
+
processPair = state: j:
23
+
jVal = builtins.elemAt digits j;
24
+
# Find largest digit in digits[0..j-1]
25
+
largestI = builtins.foldl'
26
+
(max: i: let iVal = builtins.elemAt digits i; in if iVal > max then iVal else max)
28
+
(builtins.genList (i: i) j);
29
+
pair = largestI * 10 + jVal;
30
+
newHighest = if pair > state.highest then pair else state.highest;
31
+
in { highest = newHighest; };
33
+
# Process j from 1 to L-1
34
+
result = builtins.foldl'
37
+
(builtins.genList (i: i + 1) (L - 1));
40
+
jolts = map processBank banks;
41
+
in builtins.foldl' builtins.add 0 jolts;
43
+
# Part 2: Monotonic stack to find best K-digit number
50
+
digits = stringToDigits bank;
51
+
L = builtins.length digits;
53
+
# Process each digit with monotonic stack approach
54
+
processDigit = state: j:
56
+
jVal = builtins.elemAt digits j;
59
+
# Pop smaller tail digits if we can still reach K
62
+
stackLen = builtins.length stack;
63
+
canPop = stackLen > 0 &&
64
+
(builtins.elemAt stack (stackLen - 1)) < jVal &&
65
+
stackLen - 1 + remaining >= K;
68
+
popSmaller (builtins.genList (i: builtins.elemAt stack i) (stackLen - 1))
72
+
newStack = popSmaller state.stack;
73
+
stackLen = builtins.length newStack;
75
+
# Add current digit if we still need more
76
+
finalStack = if stackLen < K then newStack ++ [jVal] else newStack;
77
+
in { stack = finalStack; };
79
+
# Process all digits
80
+
result = builtins.foldl'
83
+
(builtins.genList (i: i) L);
85
+
# Convert stack to number
86
+
stackToNum = builtins.foldl' (acc: d: acc * 10 + d) 0 result.stack;
89
+
jolts = map processBank banks;
90
+
in builtins.foldl' builtins.add 0 jolts;
93
+
inherit part1 part2;