summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Jesus <adbjesus@gmail.com>2025-12-02 18:23:02 +0000
committerAlexandre Jesus <adbjesus@gmail.com>2025-12-02 18:26:54 +0000
commitf79774c4f154a4b150ac6f1c67efdb90732ee1bc (patch)
tree3b7e928d39a20ffd4d1cfd27550fa731501c4510
parent7a3141b79caf7023ae02ec04dae85a8946d370a9 (diff)
downloadaoc2025-f79774c4f154a4b150ac6f1c67efdb90732ee1bc.tar.gz
aoc2025-f79774c4f154a4b150ac6f1c67efdb90732ee1bc.zip
Day 2
-rw-r--r--bin/main.ml2
m---------data0
-rw-r--r--lib/day02.ml53
3 files changed, 55 insertions, 0 deletions
diff --git a/bin/main.ml b/bin/main.ml
index 0ffbaac..292f581 100644
--- a/bin/main.ml
+++ b/bin/main.ml
@@ -22,6 +22,8 @@ let day_part_fn day part =
match (day, part) with
| (1, 1) -> Day01.part1
| (1, 2) -> Day01.part2
+ | (2, 1) -> Day02.part1
+ | (2, 2) -> Day02.part2
| _ -> failwith (Format.sprintf "Day %d, part %d, has not yet been implemented\n" day part)
let () =
diff --git a/data b/data
-Subproject f9ee29e51dec4c486cf71a30c8a630e45e8490d
+Subproject 1104f8981085ced710cab6a129004d99ffee88b
diff --git a/lib/day02.ml b/lib/day02.ml
new file mode 100644
index 0000000..b751fbd
--- /dev/null
+++ b/lib/day02.ml
@@ -0,0 +1,53 @@
+(*
+ * SPDX-FileCopyrightText: Copyright 2025 Alexandre Jesus <https://adbjesus.com>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *)
+
+let parse_range s =
+ match String.split_on_char '-' s with
+ | [a; b] -> (int_of_string a, int_of_string b)
+ | _ -> failwith ("Invalid range " ^ s)
+
+let parse_ranges ch =
+ In_channel.input_all ch
+ |> String.trim
+ |> String.split_on_char ','
+ |> List.map parse_range
+
+let is_invalid s cnt =
+ cnt > 0 &&
+ (String.length s) mod cnt = 0 &&
+ String.to_seqi s
+ |> Seq.drop cnt
+ |> Seq.for_all (fun (i, c) -> c = s.[i - cnt])
+
+let is_invalid_part1 a =
+ let s = string_of_int a in
+ let l = String.length s in
+ is_invalid s (l / 2)
+
+let sum_invalid_ids invalid_fn (a, b) =
+ Seq.ints a
+ |> Seq.take (b - a + 1)
+ |> Seq.filter invalid_fn
+ |> Seq.fold_left (+) 0
+
+let solve ch invalid_fn =
+ parse_ranges ch
+ |> List.map (sum_invalid_ids invalid_fn)
+ |> List.fold_left (+) 0
+ |> Printf.printf "%d\n"
+
+let part1 ch =
+ solve ch is_invalid_part1
+
+let is_invalid_part2 a =
+ let s = string_of_int a in
+ let l = String.length s in
+ Seq.ints 1
+ |> Seq.take (l / 2)
+ |> Seq.exists (is_invalid s)
+
+let part2 ch =
+ solve ch is_invalid_part2