(* * SPDX-FileCopyrightText: Copyright 2025 Alexandre Jesus * * SPDX-License-Identifier: GPL-3.0-or-later *) 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 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"