50 lines
1.0 KiB
OCaml
50 lines
1.0 KiB
OCaml
#use "lib/file_utils.ml" ;;
|
|
|
|
type shape = Rock | Paper | Scissors
|
|
type outcome = Win | Tie | Loss
|
|
|
|
let shape_of = 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 outcome_of = function
|
|
| Rock, Scissors -> Win
|
|
| Paper, Rock -> Win
|
|
| Scissors, Paper -> Win
|
|
| a, b when a = b -> Tie
|
|
| _ -> Loss
|
|
;;
|
|
|
|
let play_round line =
|
|
let op_move = shape_of (String.get line 0) in
|
|
let my_move = shape_of (String.get line 2) in
|
|
let outcome = outcome_of(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 contents = read_file "inputs/2.txt" in
|
|
let score = String.split_on_char '\n' contents
|
|
|> List.filter (fun l -> String.trim l <> "")
|
|
|> List.map play_round
|
|
|> List.fold_left (+) 0
|
|
in
|
|
|
|
Printf.printf "%d" score
|