47 lines
1.3 KiB
OCaml
47 lines
1.3 KiB
OCaml
|
|
let year = 2023
|
||
|
|
let day = 1
|
||
|
|
|
||
|
|
module Part_1 = struct
|
||
|
|
type color = Red | Blue | Green
|
||
|
|
type set = { count : int; color : color }
|
||
|
|
type game = { number : int; sets : set list }
|
||
|
|
|
||
|
|
let print_game { number ; _ } =
|
||
|
|
Printf.sprintf "%i" number
|
||
|
|
|
||
|
|
let run (input : string) : (string, string) result =
|
||
|
|
let parse_color = function
|
||
|
|
| "red" -> Red
|
||
|
|
| "blue" -> Blue
|
||
|
|
| "green" -> Green
|
||
|
|
| _ -> assert false
|
||
|
|
in
|
||
|
|
let parse_set str =
|
||
|
|
match String.split_on_char ',' str with
|
||
|
|
| [ number; color ] ->
|
||
|
|
{ count = int_of_string number; color = parse_color color }
|
||
|
|
| _ -> assert false
|
||
|
|
in
|
||
|
|
let parse_sets str = String.split_on_char ';' str |> List.map parse_set in
|
||
|
|
let parse_game_number str =
|
||
|
|
match String.trim str |> String.split_on_char ' ' with
|
||
|
|
| [ _; number ] -> int_of_string number
|
||
|
|
| _ -> assert false
|
||
|
|
in
|
||
|
|
let parse_line str =
|
||
|
|
match String.split_on_char ':' str with
|
||
|
|
| [ prefix; suffix ] ->
|
||
|
|
{ number = parse_game_number prefix; sets = parse_sets suffix }
|
||
|
|
| _ -> assert false
|
||
|
|
in
|
||
|
|
let (games : game list) =
|
||
|
|
input |> String.trim |> String.split_on_char '\n' |> List.map parse_line
|
||
|
|
in
|
||
|
|
Ok (List.hd games |> print_game)
|
||
|
|
end
|
||
|
|
|
||
|
|
module Part_2 = struct
|
||
|
|
let run (input : string) : (string, string) result =
|
||
|
|
Ok input
|
||
|
|
end
|