diff --git a/bin/d2/dune b/bin/d2/dune new file mode 100644 index 0000000..8560509 --- /dev/null +++ b/bin/d2/dune @@ -0,0 +1,4 @@ +(executable + (public_name d2) + (name main) + (libraries core utils)) diff --git a/bin/d2/input.txt b/bin/d2/input.txt new file mode 100644 index 0000000..b024b7f --- /dev/null +++ b/bin/d2/input.txt @@ -0,0 +1,2500 @@ +A Y +B X +C X +A Z +B Y +C X +C X +C X +C X +C X +A Z +B Y +C X +A Z +A Z +B Y +A Z +B X +C Z +C X +C X +B Y +C X +A X +B Y +B Z +A Z +B Y +C X +C X +C X +A Z +B Y +C X +A Z +C X +B Y +C X +C X +B Y +A Z +A Z +C X +C X +A Y +B X +C X +B X +C X +C X +A Z +C Z +C X +A Y +B Y +B Y +B X +C X +C X +C X +A Y +A Z +C X +A Z +C X +B Y +C X +C X +C X +C X +A Z +C X +A Z +C X +C X +B Y +C X +B Y +A X +A Y +C Y +A Z +C X +C X +A X +A Z +A X +C X +C X +A X +C X +B Y +A Z +A Y +A Z +B X +C X +B X +C X +C X +A Z +C X +C Z +C X +C X +C X +C X +C X +A Z +A X +C X +A Z +C X +C X +A Z +C X +A Z +A Y +C X +C X +A Z +A Z +C X +C X +A Z +A Z +C Z +C X +A Z +A Z +C X +B Y +C X +C X +A Y +A Z +A Z +A Z +A Y +B Y +A Z +C X +A Y +A Z +A Y +A Z +C X +C X +C X +B X +B Y +A Z +A Z +A Z +C X +A Z +A X +B X +C X +C X +C X +A Z +A Z +A Z +C X +C X +A X +A Z +C Y +A Z +C X +C X +C Z +C X +A Z +A X +C Y +A X +C X +C X +C X +A X +A X +C X +A Z +A Z +A Z +A Z +A Z +A Y +C X +A Z +A Z +A Z +B Y +C X +C X +A X +B X +A Z +C X +A Z +C X +A Z +C X +A Z +A Y +C X +C X +C X +A Y +C X +C Y +C Z +C X +C X +B Y +C X +A Z +C Z +A Z +C X +A Y +B Y +C X +C X +C X +B X +A Z +C X +C X +C X +B X +A Z +A Z +C X +C X +C X +A Z +A X +B Y +C Y +C X +A Z +A Z +A Z +B Y +B X +C X +A Z +A Y +B Z +C X +C X +A Z +A X +C X +A Z +B Y +A Z +C Z +B X +A Z +C X +C X +C X +A Y +C X +C X +A Z +A X +C Z +A Y +C X +C X +A Y +A X +B Y +C X +C X +C X +A Z +A X +C X +A X +A X +C X +C X +A Z +C X +A Z +A X +A Z +C X +B Y +A Z +C X +A Z +A X +B X +C X +B Y +A Y +A Y +C Z +B Z +C X +C X +C X +A Z +C Z +A Y +C X +A Y +C Z +A Y +B Y +C X +C X +A Z +B Y +C X +A Z +C X +C X +A Z +B Y +C X +B Y +C X +B Y +A Y +C X +A X +A X +B X +C X +A Z +C X +B Y +A Y +C X +B Y +B X +C X +C X +A Z +B X +A X +C X +C X +B Y +C Z +B X +C X +A Z +A Z +A X +C X +A Z +C X +A Z +C X +A Z +C X +A Z +A Y +A Y +C Z +C X +A X +C X +A Z +C X +B X +A Z +A Y +A Z +C X +A Z +C X +B Y +A X +C X +A Y +C X +C X +C X +A Z +A Y +C X +A X +C X +A Z +C X +C X +A Y +C X +C X +C X +A Z +A Z +C X +A Z +B X +A Z +C X +B Y +B X +C X +B Y +A Z +A X +C X +A Y +A X +A Z +B Y +A X +C X +C X +C X +C X +A Z +C X +C X +A X +A Z +A Z +B Y +A Z +A X +A Z +C X +B X +A Y +A X +A Y +C X +A Z +C X +A Z +B X +A Y +C X +C X +A Z +A Z +C X +C Y +A Z +A Z +A Z +A Y +C X +C X +A Z +A Z +A Z +B Y +C X +A Z +C X +A Y +A Z +A Z +A Z +C X +A X +A Z +A Z +B Y +B X +A Z +A X +C X +C X +A Z +A Z +C X +A X +A Z +C X +A X +C X +A Z +A Y +C X +B Y +B Y +C X +C X +C X +C X +C X +A X +A X +A Y +A Z +A X +C X +A X +A Z +B Y +A X +A X +C X +A Z +C X +C X +C X +A Z +A X +A X +C X +C X +C X +C X +C X +C X +A Z +C X +C X +C Z +C X +A Z +A Z +C X +C X +A Z +A Z +C X +A Z +A Z +A Z +A Z +C X +A X +C X +B Y +C X +A X +A X +A Y +C X +A Y +A Z +C X +C X +C Z +C X +C X +C X +B X +C X +C X +C X +A Y +C X +C X +A Z +C X +A Y +C X +C Z +C X +C X +B X +A Z +C X +C X +C X +C X +C X +B X +A Z +C X +A Z +B X +B Y +B Y +C X +C X +C Y +A Z +C X +C X +A X +A X +A X +A X +C X +C X +C X +C X +A Z +C X +A Z +A X +C X +C X +B Y +B Y +A Z +C X +A X +A Z +A Z +B Y +C X +C X +A Z +C X +A Z +C X +B X +C X +A Y +C X +C X +A X +B Y +B Y +C Z +C X +C X +B Y +A X +C X +C X +A X +A Z +C X +C X +A Z +B Y +A Z +C X +C X +A X +A X +C X +C Z +C X +A Z +B X +C X +B Y +A Y +B X +A Z +A Z +A X +A Z +A Y +A Z +A X +A Z +C X +C X +A Z +B Y +A Z +B X +B Y +A Z +C X +C Y +A Z +C X +C X +A X +A Z +A X +C X +C X +A Z +C X +C X +C X +C X +A X +B X +A Z +A Z +C X +A X +A X +C X +C X +A Z +A Z +C X +C X +A X +A Z +C X +A X +A Z +A Z +C X +A Z +A Z +C X +C X +A Z +C X +C X +A Z +C X +C X +A Z +A X +C X +C X +A Z +A Z +C X +C X +C X +A Y +C X +C X +B Y +C X +C X +C X +C X +A Z +A Z +A X +C X +A X +C X +A Z +B X +A Z +C X +C X +A Z +A Y +C X +C X +A Z +C X +B X +B X +B Y +A Y +A Y +A Z +A Z +A Z +C X +C X +A Z +C X +B Y +C X +B Z +A Z +C X +A Z +C X +C X +C X +C X +A Z +B X +A Y +C X +A X +A Z +B Y +A X +C X +C X +C X +C X +C X +A Z +A X +A Z +A X +A Z +A Z +C X +A X +C X +B X +C Z +A X +B X +A Y +C X +A Z +A Z +B X +B Y +B Y +C X +A Z +A X +C X +C X +B Z +B X +B Y +A Z +B Y +A Z +C X +A Z +A X +A Z +C X +C X +C X +A X +C X +A Z +C X +C X +C Y +B X +C X +A X +C X +A X +A Z +C Z +A Z +C X +A Y +C X +C X +B Y +C X +C X +A Z +C X +C X +C X +A Z +C Y +C X +A X +A Z +A X +C X +A Z +A Z +B Y +B X +A Z +C X +A Z +C X +A X +C X +C Y +A Z +A Y +C Z +C X +C Z +A Z +A Z +C X +C X +A Y +A X +B Y +C X +A Y +C X +A Y +C X +A Z +B X +A Y +C X +B X +A Z +C X +A Z +A Z +A Y +A Z +A X +B Y +C X +C X +C X +A Z +A X +C X +A Y +A Y +C X +A Z +C X +C Y +C X +C X +A X +A Z +A X +A X +C X +A X +A Z +C X +A Y +A Y +C X +B Y +A Y +C X +A Z +A Z +A X +C X +A Y +C X +C X +C X +C X +A Y +A Z +B Y +A X +A Y +C X +C X +C X +B X +A Z +C X +C X +B X +A Z +A X +C X +A X +C X +B Y +A Z +C X +C X +B X +A Z +A Z +A Z +C X +C X +C X +C Y +C X +C X +A Z +C X +A Z +C X +C X +B X +A X +A Z +C X +B Z +C X +C X +A X +A Y +C X +A Z +A Z +C X +C X +C X +C X +C X +C X +B Y +A Z +C X +A X +A Z +A Z +C X +C X +C X +A Z +C X +B Y +A Z +A Z +C X +C X +C X +C X +A Z +C X +A Z +A Y +A X +C X +A Z +C X +C X +A Z +A Z +A X +A Z +C X +A Z +A X +A Z +C X +C X +C Z +A X +C X +C X +A X +A X +C X +A Z +A Z +A Z +C X +C X +A Z +B Z +A Z +A Z +C X +A Z +C X +A Z +B X +C X +A Z +B Y +B Y +C X +A X +A Z +C X +C X +A Z +C Y +B Y +A Z +C X +C X +A Z +A Z +C Z +A Z +C X +C X +A Y +C X +A Y +B X +C Z +C X +A Y +C X +B Y +C X +C X +C Z +A Z +A Z +C X +C X +A Z +B Z +C X +A Z +C X +A Z +C X +C X +C Y +C X +B Y +A X +A Z +C X +B Y +A Z +B Y +C X +C Y +C Z +A X +A Z +A X +C X +C X +A Z +A Z +C X +C X +C X +C X +B Y +B Y +A Y +C X +C X +C X +A X +C X +B Y +A Z +B Y +C X +C X +B Y +C X +B Y +C X +C X +C X +A Z +A Z +C X +C X +B Z +A X +C X +C X +A Z +C X +C X +C X +C X +A Z +C X +A Y +A Z +C X +A Z +A Y +C X +A X +C Y +A Y +A Y +C X +C X +A X +A Y +C X +B Y +A Z +B Y +C X +B X +C X +C X +C X +B Z +A Y +C X +B Y +C X +A X +C X +C X +B X +A Z +C X +A Z +C X +C X +C X +C X +C X +C X +A X +A Z +A Z +C X +C X +C Z +B X +C Z +C X +B X +C X +A Z +B Y +A Z +C Z +C X +B X +A X +A Z +C X +C X +A Z +A Z +A Z +A X +C X +C X +A Y +A Z +C X +A Z +B Y +C X +C Z +A Z +C X +C X +C X +A X +A Z +A Z +C X +A Y +A Y +C X +C X +C X +C X +C X +A Z +C X +B X +C X +B X +B Y +A Z +C X +B Y +A Y +C Z +A Z +A X +C X +A Z +C X +A Z +C Z +C X +C X +A Z +C X +C X +C X +B Y +A Z +B X +A Z +A Z +B X +A X +A Z +C X +C X +A Y +C X +A Z +B Y +C Y +A Z +C Y +C X +A Z +C X +C X +A X +C X +A X +A Z +B Y +B Y +C X +B Y +C Z +C X +C X +B Y +A Z +C X +C X +C X +C X +C X +A X +A Z +B Y +A Y +C X +C X +C Z +C X +A X +C X +A Z +B Y +A Z +B X +C X +C X +A Z +C X +A Y +A Y +C X +B X +C X +B X +A Y +A Z +A Z +C X +A Z +A X +A Z +C X +C X +C X +A Z +B X +B X +A Z +C X +B Y +C X +C X +A Z +A X +C X +B Y +C X +C X +C X +A X +A X +B Y +A Y +A X +C X +A Z +B X +A Z +B Y +C X +B Y +A Y +C X +C X +C X +A Y +A Z +A Z +A X +A Z +A X +C X +A Z +A Y +A Z +A Z +A Z +A X +A Z +A Z +C X +C X +C X +A Z +C X +C X +B Y +C X +C X +C X +C Y +A Z +A Z +A Z +C X +A Z +B X +A X +A Z +A Y +C X +A Z +C X +A Z +A Y +B Y +C X +A X +A Z +A Z +C Y +A X +B Y +B Y +C X +A Z +A Z +A Z +A Z +A Z +A Z +A Z +C X +C X +B Y +C X +C X +A Y +C X +A Z +C X +A X +C X +A X +C X +C X +B X +C X +B X +C X +C X +A Y +A X +A Z +C X +A X +A Y +A Z +C X +C X +C X +B Y +A Z +A Y +A Z +C X +A Y +B X +C X +A X +A Y +A Y +A Z +A Z +A Z +C X +A Z +A X +A Z +C X +B X +A Z +C X +C X +A X +A Z +A Z +B Y +A Z +A X +A Z +A Z +A Z +A X +B Y +A X +A Z +C X +B X +A Z +A Z +A Y +B Y +A Y +B Y +C X +C X +A Z +B Y +A Z +A X +A Z +A Z +C X +C X +A Z +A X +C X +B Y +C X +C X +C X +C Z +A Y +C X +A Y +A Y +A Y +A Z +A X +A Z +A X +A Z +B Y +C X +A Z +A Y +C X +B Y +A Z +B Y +C X +B X +B Y +C X +A Z +B X +C X +B Y +B Y +C X +C X +A Z +B X +A X +A Z +C X +A Z +C X +C X +A Z +B X +A Z +C Y +C X +A Z +A X +B Y +B Y +C Y +B Y +A Y +C X +A X +C X +C X +C X +A Y +A Z +B Y +A Z +A Y +C X +A Y +A Y +A Y +C X +B X +B X +C X +B X +C X +C X +A X +A X +A X +C X +C X +C Y +A Y +A Z +C X +B Y +C X +A X +C X +A Z +C X +C X +C X +B X +C X +C Z +A Z +C Y +B Y +A Y +A Z +A Z +A X +A Y +C X +C Y +C X +C X +A X +A Y +A Z +C X +B X +B Y +B Y +C X +C X +C X +C X +A Z +C X +C X +B Y +C X +C X +A Z +A Z +A Z +A X +A Y +A Z +C Z +A Z +C X +C X +B Y +A X +C X +A Z +C X +A X +C X +A Z +C X +C X +A Z +A X +C X +C X +C X +A Y +C X +C X +A Z +C X +A Z +C X +A Z +C X +C X +C X +C X +A Z +C X +A Z +C X +A Z +A Z +B Z +A Z +A Y +C X +B X +C X +C X +C Z +C X +C X +C X +A X +A Z +A Z +A Z +C X +C X +C X +A Z +B Y +C X +C X +C X +A Z +C X +A Y +C X +B Y +A Z +C X +B X +C X +A X +C X +C X +C X +A Z +A Z +A Z +B Z +C X +A Z +A X +C X +B X +A X +A Y +B Y +B Y +A Z +C X +C X +C X +C X +A Z +A Z +C X +A X +B Y +B Y +A Z +A Z +C X +C X +A Z +A Y +C X +A Y +A Z +A Y +C X +A Z +C X +A Z +B Y +A X +A Z +C X +A X +C X +A Z +C X +C X +A Z +B X +B X +A Z +C X +A Y +A Z +C X +A X +A X +A Z +A Y +C X +A Z +B Z +C X +A Z +C X +A Z +A Z +C X +A Z +B X +A Z +C X +A Z +A Z +C X +C X +A X +A Z +A Z +C X +A Z +C X +A Z +C X +A X +A Z +A Z +C Z +C X +C X +B Y +B Y +C X +C X +C X +B X +A X +C X +A X +B Y +C X +B Y +A Z +A Z +A Y +A Z +B X +A X +C X +B Y +C X +A Z +C X +C X +A Z +A X +C X +C X +A Z +B Y +C X +A Z +B Y +A Z +A Z +A X +C X +A Z +C X +B Y +C X +C X +C X +A X +B Y +C X +A X +C X +A Z +C X +C X +B X +B X +C X +C X +A Z +B X +C X +A X +C X +B Y +A Y +C Z +C X +A Z +C Z +B Y +B Y +A Z +C Z +C X +C X +C X +A X +C X +A Z +B X +A Z +B Y +A Z +B X +A X +A Z +A Z +C X +B X +C X +A Z +B Y +A Z +C X +A Z +A Z +A X +A Z +A X +A X +C X +B X +C X +C X +B Y +C X +C X +A X +C X +C X +C X +C X +C X +A Z +C X +C X +A Z +A Z +B Y +C X +C Z +C X +B Y +C X +C X +C X +A Z +A Y +A X +C X +C X +B Y +C Z +C X +A Y +B Y +C X +C X +A Z +A Z +C X +C X +C X +B X +C X +C X +C X +C X +B Y +A X +C X +C X +A Z +C X +C X +C X +A Z +C X +C X +B Y +C X +A Y +C X +A Z +A Z +B Y +C X +C Y +A Y +C X +B Y +A Z +B X +C X +C X +A X +C X +C X +C X +C X +A X +A X +A Z +C X +B Z +C X +A Y +A Z +A Z +C X +C X +C X +A Z +A Z +A X +A Z +A Z +A Z +A Y +A X +A Z +C X +B Y +C X +A Z +C X +C Z +B X +C X +C X +A Z +A X +B X +C X +A Z +A Z +A Z +C Z +C X +B Y +C X +C X +C X +A Z +B Y +C X +C X +C X +C X +C X +C X +A X +C Z +B Y +A X +A X +B X +C X +C X +C X +A Z +A Z +B X +C X +C X +A Z +C X +A Z +C X +C X +C X +C X +A Z +C Y +C X +C X +A Z +A Z +A Z +A Y +A X +A X +C X +A Z +B X +A Z +C X +B X +C X +A Y +A X +C X +C X +C X +B X +B X +C X +A Z +A Z +C X +C X +A Z +B X +A Z +A Y +A X +A Y +C X +A Z +B Y +C X +A Z +C X +C X +A Z +A Z +A Y +B X +A Z +C X +A X +A Z +A Z +A Z +A X +C X +A Z +A Z +B X +A Y +C X +C X +C X +C X +B X +B Y +C X +A Z +C X +B Y +B Y +C X +B X +A Z +C X +C X +A Z +B Y +C X +A Z +C X +C X +A Z +C X +A Z +A X +C X +C X +A X +A Z +C X +A X +C X +C X +A X +C X +A X +A Y +A Z +A Y +A Z +C X +A Z +A Z +B Z +A Y +A Z +C X +A Z +C X +A X +C X +C Y +C X +C X +C X +A Z +B X +C X +C X +A Z +A Z +C Z +C X +A X +A Y +B Y +A Z +A X +B X +C X +C X +C X +A Y +C X +A Z +C X +C X +A Z +A X +C X +C Z +C X +C X +C X +A Z +A Y +C X +C X +A Z +C X +C Y +C X +C X +A Z +A X +C X +B X +A Z +A Z +C X +A Z +A Z +C X +A Y +C Y +A Z +A Z +B X +C X +A Z +A Z +C X +C X +C X +B Y +A Z +B Y +C X +B X +A X +C X +A Z +A Y +C X +A Z +C Z +A X +C X +A Z +C X +C X +A Z +C X +A Y +C X +C X +A Y +C X +B X +C X +C X +B Y +A X +C X +A Y +B Y +C X +A X +A Z +C Z +A X +C X +C X +B X +A Z +B Z +A Z +A X +A Y +C X +A X +B X +C X +C X +C X +C X +A Z +C X +A Z +A Z +C X +B X +C X +A Y +A Z +A X +A X +C X +A Y +C X +C X +A Y +C X +B X +A Z +C X +A Z +B X +A Z +B Y +C X +C X +C X +A Z +C X +C X +A X +C X +A Z +C X +C X +A Z +C X +A X +B Y +A Y +C X +C X +C X +A X +C X +A Z +C X +A X +C X +C X +A Y +C X +C X +C X +C X +A Z +C X +C X +A Y +A Z +C X +C X +C X +A Z +A Z +C Z +A Y +C X +C X +B Z +B Y +B Y +B Y +C Z +B Y +A Z +B X +C X +A Z +A Y +C X +B Y +C X +A X +B X +A Z +A Z +C X +C Y +A Z +B Y +A Z +A Z +C X +C X +B Y +C X +A Z +C Z +A X +C X +C X +C X +A Z +C X +B X +B Y +C X +A Z +A Z +C X +A Z +C Z +C X +B X +A X +B Z +A Z +C X +A X +C X +C X +C X +C X +A Z +C X +C X +C X +C X +A Z +A Z +C X +C X +A X +A Z +C X +A X +C X +C Y +C X +A Z +B X +A Y +A Z +C Y +A Z +C X +A Y +C X +A X +C X +A X +C X +A Z +C X +A X +A Z +A X +A Y +C Z +C X +A X +A Z +A Z +A Z +A Z +C X +C X +C Z +A X +A Z +B Y +A Z +A Z +B X +B Y +A X +A Y +A Z +C X +A Z +C X +A Z +B X +B X +C X +C X +C X +A X +C X +A Z +B X +A Y +B X +C X +A X +C X +A X +A Z +A Z +A Z +C X +B Y +C X +B Y +C X +A Z +A Z +A Z +C X +C X +B Y +A Y +C Y +A Z +C X +C X +A Z +C X +A Z +C Z +B X +C X +C X +A Z +B Y +A Y +C X +A X diff --git a/bin/d2/main.ml b/bin/d2/main.ml new file mode 100644 index 0000000..4eb449d --- /dev/null +++ b/bin/d2/main.ml @@ -0,0 +1,62 @@ +type choice + = Rock + | Paper + | Scissors + +let int_of_choice = function + | Rock -> 1 + | Paper -> 2 + | Scissors -> 3 + +let choice_of_string = function + | "A" | "X" -> Rock + | "B" | "Y" -> Paper + | "C" | "Z" -> Scissors + | _ -> failwith "invalid choice" ;; + +type outcome + = Draw + | Win + | Lose + +let int_of_outcome = function + | Lose -> 0 + | Draw -> 3 + | Win -> 6 + +let outcome_of_string = function + | "X" -> Lose + | "Y" -> Draw + | "Z" -> Win + | _ -> failwith "invalid choice" + +let choice_of_outcome oponent = function + | Win -> if oponent = Rock then Paper else if oponent = Paper then Scissors else Rock + | Lose -> if oponent = Rock then Scissors else if oponent = Paper then Rock else Paper + | Draw -> if oponent = Rock then Rock else if oponent = Paper then Paper else Scissors + +let outcome me oponent = + match int_of_choice me - int_of_choice oponent with + | -1 | 2 -> Lose + | 1 | -2 -> Win + | _ -> Draw + +let solve f l = l + |> List.map (fun line -> line + |> String.split_on_char ' ' + |> (fun l -> (List.hd l, List.tl l |> List.hd)) + |> f + |> (fun (oponent, me) -> ((outcome me oponent) |> int_of_outcome) + int_of_choice me)) + |> List.fold_left (+) 0 + +let d2_1 = solve (fun (oponent_s, me_s) -> + (choice_of_string oponent_s, choice_of_string me_s)) + +let d2_2 = solve (fun (oponent_s, outcome_s) -> + (choice_of_string oponent_s, outcome_of_string outcome_s) + |> (fun (oponent, outcome) -> (oponent, (choice_of_outcome oponent outcome)))) + +open Utils + +let _ = "\n1: " ^ (string_of_int (read_file "bin/d2/input.txt" |> d2_1)) ^ + "\n2: " ^ (string_of_int (read_file "bin/d2/input.txt" |> d2_2)) |> print_endline