Compare commits
4 Commits
da30155acf
...
fe417025bd
Author | SHA1 | Date |
---|---|---|
Gregory Eremin | fe417025bd | |
Gregory Eremin | d924d15dd6 | |
Gregory Eremin | 9cfa03069e | |
Gregory Eremin | faa6186c43 |
|
@ -1 +0,0 @@
|
||||||
inputs
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
15
ocaml/1.ml
15
ocaml/1.ml
|
@ -1,12 +1,19 @@
|
||||||
#load "str.cma" ;;
|
#load "str.cma" ;;
|
||||||
#use "lib/file_utils.ml" ;;
|
#use "lib/file_utils.ml" ;;
|
||||||
|
|
||||||
|
let top n calories =
|
||||||
|
let topn = List.filteri (fun i _ -> i < n) calories in
|
||||||
|
let numcal = List.fold_left (+) 0 topn in
|
||||||
|
Printf.printf "Top %d: %d\n" n numcal
|
||||||
|
;;
|
||||||
|
|
||||||
|
let order_desc a b = if a < b then 1 else -1 in
|
||||||
let contents = read_file "inputs/1.txt" in
|
let contents = read_file "inputs/1.txt" in
|
||||||
let maxcal = Str.split (Str.regexp "\n\n") contents
|
let calories = Str.split (Str.regexp "\n\n") contents
|
||||||
|> List.map (String.split_on_char '\n')
|
|> List.map (String.split_on_char '\n')
|
||||||
|> List.map (List.map (int_of_string))
|
|> List.map (List.map (int_of_string))
|
||||||
|> List.map (List.fold_left (+) 0)
|
|> List.map (List.fold_left (+) 0)
|
||||||
|> List.fold_left (max) 0
|
|> List.sort order_desc
|
||||||
in
|
in
|
||||||
|
top 1 calories;
|
||||||
Printf.printf "%d" maxcal
|
top 3 calories
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
#use "lib/file_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
|
Loading…
Reference in New Issue