From 52c33969d7b358cdac40f02a8562e37f82a96135 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Mon, 26 Feb 2024 23:16:00 +0100 Subject: Add day4 --- 2023/ocaml/day4/bin/dune | 4 ++++ 2023/ocaml/day4/bin/main.ml | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 2023/ocaml/day4/bin/dune create mode 100644 2023/ocaml/day4/bin/main.ml (limited to '2023/ocaml/day4/bin') diff --git a/2023/ocaml/day4/bin/dune b/2023/ocaml/day4/bin/dune new file mode 100644 index 0000000..add70da --- /dev/null +++ b/2023/ocaml/day4/bin/dune @@ -0,0 +1,4 @@ +(executable + (public_name day4) + (name main) + (libraries day4)) diff --git a/2023/ocaml/day4/bin/main.ml b/2023/ocaml/day4/bin/main.ml new file mode 100644 index 0000000..9d1a6ad --- /dev/null +++ b/2023/ocaml/day4/bin/main.ml @@ -0,0 +1,45 @@ +let input_file = "input.txt" + +let read_file f = + let ic = open_in f in + try + let lines = really_input_string ic (in_channel_length ic) |> String.trim in + close_in ic; + lines + with e -> + close_in_noerr ic; + raise e + +let nums_from_string str = + String.split_on_char ' ' str + |> List.filter (fun ch -> String.length ch > 0) + |> List.map int_of_string + +let rec parse ?(result = 0) lines = + match lines with + | [] -> result + | x :: tail -> + let numbers = + List.nth (String.split_on_char ':' x) 1 + |> String.split_on_char '|' |> List.map String.trim + |> List.map nums_from_string + in + + let winnings = List.nth numbers 0 in + let plays = List.nth numbers 1 in + + let k = + Int.shift_left 1 + (List.length + (List.map + (fun win -> if List.mem win plays = true then 1 else 0) + winnings + |> List.filter (fun i -> i = 1)) + - 1) + in + + parse tail ~result:(result + k) + +let () = + let result = read_file input_file |> String.split_on_char '\n' |> parse in + Printf.printf "%d\n" result -- cgit v1.2.3-18-g5258