#use "lib/utils.ml" ;; type shape = Rock | Paper | Scissors type outcome = Win | Tie | Loss let shape_of_char = function | 'A' | 'X' -> Rock | 'B' | 'Y' -> Paper | 'C' | 'Z' -> Scissors | s -> failwith ("invalid shape: " ^ (String.make 1 s)) let score_of_shape = function | Rock -> 1 | Paper -> 2 | Scissors -> 3 let score_of_outcome = function | Loss -> 0 | Tie -> 3 | Win -> 6 let part1 line = let outcome_of_round = function | Rock, Scissors -> Win | Paper, Rock -> Win | Scissors, Paper -> Win | a, b when a = b -> Tie | _ -> Loss in let op_move = shape_of_char (String.get line 0) in let my_move = shape_of_char (String.get line 2) in let outcome = outcome_of_round(my_move, op_move) in let outcome_score = score_of_outcome outcome in let shape_score = score_of_shape my_move in outcome_score + shape_score let part2 line = let outcome_of_char = function | 'X' -> Loss | 'Y' -> Tie | 'Z' -> Win | o -> failwith ("invalid outcome: " ^ (String.make 1 o)) in let make_move = function | Rock, Win -> Paper | Rock, Loss -> Scissors | Paper, Win -> Scissors | Paper, Loss -> Rock | Scissors, Win -> Rock | Scissors, Loss -> Paper | s, Tie -> s in let op_move = shape_of_char (String.get line 0) in let outcome = outcome_of_char (String.get line 2) in let my_move = make_move(op_move, outcome) in let outcome_score = score_of_outcome outcome in let shape_score = score_of_shape my_move in outcome_score + shape_score let play lines part rules = let score = lines |> List.map rules |> List.fold_left (+) 0 in Printf.printf "Part %d: %d\n" part score ;; let contents = read_file "inputs/2.txt" in let lines = String.split_on_char '\n' contents |> List.filter (fun l -> String.trim l <> "") in play lines 1 part1; play lines 2 part2