diff options
| author | Alexandre Jesus <adbjesus@gmail.com> | 2025-12-02 18:23:02 +0000 |
|---|---|---|
| committer | Alexandre Jesus <adbjesus@gmail.com> | 2025-12-02 18:26:54 +0000 |
| commit | f79774c4f154a4b150ac6f1c67efdb90732ee1bc (patch) | |
| tree | 3b7e928d39a20ffd4d1cfd27550fa731501c4510 | |
| parent | 7a3141b79caf7023ae02ec04dae85a8946d370a9 (diff) | |
| download | aoc2025-f79774c4f154a4b150ac6f1c67efdb90732ee1bc.tar.gz aoc2025-f79774c4f154a4b150ac6f1c67efdb90732ee1bc.zip | |
Day 2
| -rw-r--r-- | bin/main.ml | 2 | ||||
| m--------- | data | 0 | ||||
| -rw-r--r-- | lib/day02.ml | 53 |
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 |
