diff options
Diffstat (limited to 'lib/day01.ml')
| -rw-r--r-- | lib/day01.ml | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/lib/day01.ml b/lib/day01.ml index e1d6457..9a983a6 100644 --- a/lib/day01.ml +++ b/lib/day01.ml @@ -4,8 +4,44 @@ * SPDX-License-Identifier: GPL-3.0-or-later *) -let part1 _ch = - failwith "Unimplemented" +let parse_rotation s = + let num = lazy (int_of_string (String.sub s 1 ((String.length s) - 1))) in + match s.[0] with + | 'R' -> Lazy.force num + | 'L' -> -(Lazy.force num) + | s -> failwith (Printf.sprintf "Unknown rotation %c" s) -let part2 _ch = - failwith "Unimplemented" +let parse_rotations ch = + In_channel.input_all ch + |> String.trim + |> String.split_on_char '\n' + |> List.map parse_rotation + +let part1 ch = + let m = 100 in + let s = 50 in + parse_rotations ch + |> List.fold_left + (fun (a, p) r -> + let nxt = (p + r) mod m in + let inc = if nxt = 0 then 1 else 0 in + (a + inc, nxt) + ) + (0, s) + |> fst + |> Printf.printf "%d\n" + +let part2 ch = + let m = 100 in + let s = 50 in + parse_rotations ch + |> List.fold_left + (fun (a, p) r -> + let nxt = p + r in + let inc = (abs nxt) / m + if p > 0 && nxt <= 0 then 1 else 0 in + let nxt = ((nxt mod m) + m) mod m in + (a + inc, nxt) + ) + (0, s) + |> fst + |> Printf.printf "%d\n" |
