Skip to content

Commit a0b42ca

Browse files
committed
2025 Day 3
1 parent 4b26915 commit a0b42ca

File tree

4 files changed

+235
-4
lines changed

4 files changed

+235
-4
lines changed

2025/days/Day03.ml

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
11
open Utils
22

3-
let day03 input =
4-
("TODO", "TODO")
3+
let digit_to_int c = int_of_char c - int_of_char '0'
4+
5+
let max_digit_index s =
6+
let len = String.length s in
7+
fold_range_rev (fun (j, m) i ->
8+
let v = digit_to_int s.[i] in
9+
if v >= m then (i, v) else (j, m)
10+
) (0, digit_to_int s.[0]) 0 (len - 1)
511

12+
let rec max_joltage_n n line = let len = String.length line in match n with
13+
| 0 -> 0
14+
| n when n = len -> int_of_string line
15+
| n -> (
16+
let (i, d) = max_digit_index (String.sub line 0 (len - n + 1)) in
17+
d * (p10 (n - 1)) + max_joltage_n (n - 1) (String.sub line (i + 1) (len - i - 1)))
618

19+
let solve n lines =
20+
List.map (max_joltage_n n) lines |> sum
21+
22+
let day03 input =
23+
let lines = String.split_on_char '\n' (trim_end_nl input) in
24+
let part1 = solve 2 lines in
25+
let part2 = solve 12 lines in
26+
(string_of_int part1, string_of_int part2)

2025/days/Utils.ml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ let int_of_bool = function
44
| true -> 1
55
| false -> 0
66

7-
let powers_of_10 = [|1;10;100;1000;10000;100000;1000000;10000000;100000000;1000000000;10000000000|]
7+
let powers_of_10 = [|1;10;100;1000;10000;100000;1000000;10000000;100000000;1000000000;10000000000;100000000000;1000000000000;10000000000000;100000000000000;1000000000000000;10000000000000000;100000000000000000;1000000000000000000;|]
88

99
let p10 = function
1010
| p when p < 0 -> 0
@@ -19,3 +19,14 @@ let rec sum_range a b f =
1919
if a <= b then
2020
f a + sum_range (a + 1) b f
2121
else 0
22+
23+
let trim_end_nl s = String.sub s 0 (String.length s - 1)
24+
25+
let rec fold_range f acc range_start range_end =
26+
if range_start > range_end then acc else
27+
fold_range f (f acc range_start) (range_start + 1) range_end
28+
let rec fold_range_rev f acc range_start range_end =
29+
if range_start > range_end then acc else
30+
fold_range_rev f (f acc range_end) range_start (range_end - 1)
31+
32+
let sum = List.fold_left (+) 0

0 commit comments

Comments
 (0)