1
0
Fork 0

Compare commits

...

4 Commits

Author SHA1 Message Date
Gregory Eremin fe417025bd Day 1 part 2 2023-01-11 22:25:41 +01:00
Gregory Eremin d924d15dd6 Day 2 part 2 2023-01-11 22:05:29 +01:00
Gregory Eremin 9cfa03069e Add inputs to the repo 2023-01-11 21:35:14 +01:00
Gregory Eremin faa6186c43 Day 2 part 1 2023-01-11 21:34:33 +01:00
5 changed files with 4841 additions and 6 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
inputs

2256
inputs/1.txt Normal file

File diff suppressed because it is too large Load Diff

2500
inputs/2.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,19 @@
#load "str.cma" ;;
#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 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 (List.map (int_of_string))
|> List.map (List.fold_left (+) 0)
|> List.fold_left (max) 0
in
Printf.printf "%d" maxcal
|> List.sort order_desc
in
top 1 calories;
top 3 calories

73
ocaml/2.ml Normal file
View File

@ -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