Compare commits
3
Commits
250d978a38
...
31a75867fa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31a75867fa | ||
|
|
b6eae27d9d | ||
|
|
fe5cd3666f |
No files matched your search
-15
@@ -1,15 +0,0 @@
|
|||||||
open Aoc
|
|
||||||
|
|
||||||
let () =
|
|
||||||
Day1.print ();
|
|
||||||
Day2.print ();
|
|
||||||
Day3.print ();
|
|
||||||
Day4.print ();
|
|
||||||
Day5.print ();
|
|
||||||
Day6.print ();
|
|
||||||
Day7.print ();
|
|
||||||
Day8.print ();
|
|
||||||
Day9.print ();
|
|
||||||
Day10.print ();
|
|
||||||
Day11.print ()
|
|
||||||
;;
|
|
||||||
+12
-7
@@ -1,4 +1,5 @@
|
|||||||
let part1 lines =
|
let part1 () =
|
||||||
|
let lines = Utils.lines_of_input 1 in
|
||||||
let rec most_calories most current lines =
|
let rec most_calories most current lines =
|
||||||
match lines with
|
match lines with
|
||||||
| [] -> most
|
| [] -> most
|
||||||
@@ -10,7 +11,8 @@ let part1 lines =
|
|||||||
most_calories 0 0 lines
|
most_calories 0 0 lines
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part2 lines =
|
let part2 () =
|
||||||
|
let lines = Utils.lines_of_input 1 in
|
||||||
let accum_calories elves calories =
|
let accum_calories elves calories =
|
||||||
match elves, calories with
|
match elves, calories with
|
||||||
| elves, "" -> 0 :: elves
|
| elves, "" -> 0 :: elves
|
||||||
@@ -23,9 +25,12 @@ let part2 lines =
|
|||||||
| _ -> failwith "wtf"
|
| _ -> failwith "wtf"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 1.1" =
|
||||||
let lines = Utils.lines_of_input 1 in
|
Printf.printf "%d" @@ part1 ();
|
||||||
Printf.(
|
[%expect {| 75622 |}]
|
||||||
printf "Day 1.1: %d\n" @@ part1 lines;
|
;;
|
||||||
printf "Day 1.2: %d\n" @@ part2 lines)
|
|
||||||
|
let%expect_test "Day 1.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 213159 |}]
|
||||||
;;
|
;;
|
||||||
+14
-5
@@ -40,9 +40,18 @@ let part2 () =
|
|||||||
|> List.iter Fun.(print_string %> print_newline)
|
|> List.iter Fun.(print_string %> print_newline)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 10.1" =
|
||||||
Printf.(
|
Printf.printf "%d" @@ part1 ();
|
||||||
printf "Day 10.1: %d\n" @@ part1 ();
|
[%expect {| 14760 |}]
|
||||||
printf "Day 10.2:\n";
|
;;
|
||||||
part2 ())
|
|
||||||
|
let%expect_test "Day 10.2" =
|
||||||
|
part2 ();
|
||||||
|
[%expect {|
|
||||||
|
#### #### ## #### ### # # ### #####
|
||||||
|
# # # # # # # # # # # # #
|
||||||
|
### ### # ### # # # # # # ### #
|
||||||
|
# # # ## # ### # # ### #
|
||||||
|
# # # # # # # # # # # #
|
||||||
|
#### # ### #### # # ## # # #### |}]
|
||||||
;;
|
;;
|
||||||
+13
-9
@@ -44,7 +44,7 @@ let parse_monkeys () =
|
|||||||
|
|
||||||
let throw item monkey = monkey.items <- List.append [ item ] monkey.items
|
let throw item monkey = monkey.items <- List.append [ item ] monkey.items
|
||||||
|
|
||||||
let round monkies manageable =
|
let round monkies ~manageable =
|
||||||
let divisor = Array.fold_left (fun acc monkey -> acc * monkey.test_num) 1 monkies in
|
let divisor = Array.fold_left (fun acc monkey -> acc * monkey.test_num) 1 monkies in
|
||||||
let destress score = if manageable then score / 3 else Int.(score mod divisor) in
|
let destress score = if manageable then score / 3 else Int.(score mod divisor) in
|
||||||
monkies
|
monkies
|
||||||
@@ -58,10 +58,10 @@ let round monkies manageable =
|
|||||||
monkey.items <- [])
|
monkey.items <- [])
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let solve rounds manageable =
|
let solve rounds ~manageable =
|
||||||
let monkies = parse_monkeys () in
|
let monkies = parse_monkeys () in
|
||||||
for _ = 1 to rounds do
|
for _ = 1 to rounds do
|
||||||
round monkies manageable
|
round monkies ~manageable
|
||||||
done;
|
done;
|
||||||
monkies
|
monkies
|
||||||
|> Array.to_list
|
|> Array.to_list
|
||||||
@@ -73,11 +73,15 @@ let solve rounds manageable =
|
|||||||
|> Option.get_exn_or "aoc goofed up the input"
|
|> Option.get_exn_or "aoc goofed up the input"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part1 () = solve 20 true
|
let part1 () = solve 20 ~manageable:true
|
||||||
let part2 () = solve 10_000 false
|
let part2 () = solve 10_000 ~manageable:false
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 11.1" =
|
||||||
Printf.(
|
Printf.printf "%d" @@ part1 ();
|
||||||
printf "Day 11.1: %d\n" @@ part1 ();
|
[%expect {| 56350 |}]
|
||||||
printf "Day 11.2: %d\n" @@ part2 ())
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 11.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 13954061248 |}]
|
||||||
;;
|
;;
|
||||||
+12
-7
@@ -52,7 +52,8 @@ let match_outcome = function
|
|||||||
| _, _ -> Lose
|
| _, _ -> Lose
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part1 lines =
|
let part1 () =
|
||||||
|
let lines = Utils.lines_of_input 2 in
|
||||||
let parse_line line =
|
let parse_line line =
|
||||||
match Re.Pcre.(split ~rex:(regexp {|\s+|}) line) with
|
match Re.Pcre.(split ~rex:(regexp {|\s+|}) line) with
|
||||||
| them :: me :: _ -> parse_move them, parse_move me
|
| them :: me :: _ -> parse_move them, parse_move me
|
||||||
@@ -66,7 +67,8 @@ let part1 lines =
|
|||||||
lines
|
lines
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part2 lines =
|
let part2 () =
|
||||||
|
let lines = Utils.lines_of_input 2 in
|
||||||
let parse_line =
|
let parse_line =
|
||||||
function%pcre
|
function%pcre
|
||||||
| {|(?<them>\w)\s*(?<outcome>\w)|} -> parse_move them, parse_outcome outcome
|
| {|(?<them>\w)\s*(?<outcome>\w)|} -> parse_move them, parse_outcome outcome
|
||||||
@@ -86,9 +88,12 @@ let part2 lines =
|
|||||||
lines
|
lines
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 2.1" =
|
||||||
let lines = Utils.lines_of_input 2 in
|
Printf.printf "%d" @@ part1 ();
|
||||||
Printf.(
|
[%expect {| 11841 |}]
|
||||||
printf "Day 2.1: %d\n" @@ part1 lines;
|
;;
|
||||||
printf "Day 2.2: %d\n" @@ part2 lines)
|
|
||||||
|
let%expect_test "Day 2.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 13022 |}]
|
||||||
;;
|
;;
|
||||||
+12
-7
@@ -10,7 +10,8 @@ let priority char =
|
|||||||
| _ -> failwith @@ Printf.sprintf "'%c' is not a valid item" char
|
| _ -> failwith @@ Printf.sprintf "'%c' is not a valid item" char
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part1 lines =
|
let part1 () =
|
||||||
|
let lines = Utils.lines_of_input 3 in
|
||||||
List.fold_left
|
List.fold_left
|
||||||
(fun acc line ->
|
(fun acc line ->
|
||||||
let half_len = String.length line / 2 in
|
let half_len = String.length line / 2 in
|
||||||
@@ -30,7 +31,8 @@ let part1 lines =
|
|||||||
shout out https://doc.sherlocode.com/ for helping me find Containers and its
|
shout out https://doc.sherlocode.com/ for helping me find Containers and its
|
||||||
List.chunks and List.reduce functions
|
List.chunks and List.reduce functions
|
||||||
*)
|
*)
|
||||||
let part2 lines =
|
let part2 () =
|
||||||
|
let lines = Utils.lines_of_input 3 in
|
||||||
let groups = List.chunks 3 (List.map set_of_string lines) in
|
let groups = List.chunks 3 (List.map set_of_string lines) in
|
||||||
List.fold_left
|
List.fold_left
|
||||||
(fun acc group ->
|
(fun acc group ->
|
||||||
@@ -44,9 +46,12 @@ let part2 lines =
|
|||||||
groups
|
groups
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 3.1" =
|
||||||
let lines = Utils.lines_of_input 3 in
|
Printf.printf "%d" @@ part1 ();
|
||||||
Printf.(
|
[%expect {| 7446 |}]
|
||||||
printf "Day 3.1: %d\n" @@ part1 lines;
|
;;
|
||||||
printf "Day 3.2: %d\n" @@ part2 lines)
|
|
||||||
|
let%expect_test "Day 3.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 2646 |}]
|
||||||
;;
|
;;
|
||||||
+10
-6
@@ -19,22 +19,26 @@ let count_overlaps is_overlapping =
|
|||||||
0
|
0
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part1 =
|
let part1 () =
|
||||||
count_overlaps (fun pairs ->
|
count_overlaps (fun pairs ->
|
||||||
match pairs with
|
match pairs with
|
||||||
| (l1, r1), (l2, r2) when (l1 <= l2 && r1 >= r2) || (l2 <= l1 && r2 >= r1) -> true
|
| (l1, r1), (l2, r2) when (l1 <= l2 && r1 >= r2) || (l2 <= l1 && r2 >= r1) -> true
|
||||||
| _ -> false)
|
| _ -> false)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part2 =
|
let part2 () =
|
||||||
count_overlaps (fun pairs ->
|
count_overlaps (fun pairs ->
|
||||||
match pairs with
|
match pairs with
|
||||||
| (l1, r1), (l2, r2) when r1 < l2 || r2 < l1 -> false
|
| (l1, r1), (l2, r2) when r1 < l2 || r2 < l1 -> false
|
||||||
| _ -> true)
|
| _ -> true)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 4.1" =
|
||||||
Printf.(
|
Printf.printf "%d" @@ part1 ();
|
||||||
printf "Day 4.1: %d\n" part1;
|
[%expect {| 547 |}]
|
||||||
printf "Day 4.2: %d\n" part2)
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 4.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 843 |}]
|
||||||
;;
|
;;
|
||||||
+8
-4
@@ -73,8 +73,12 @@ let solve crane_move =
|
|||||||
let part1 () = solve crane_move1
|
let part1 () = solve crane_move1
|
||||||
let part2 () = solve crane_move
|
let part2 () = solve crane_move
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 5.1" =
|
||||||
Printf.(
|
Printf.printf "%s" @@ part1 ();
|
||||||
printf "Day 5.1: %s\n" @@ part1 ();
|
[%expect {| PSNRGBTFT |}]
|
||||||
printf "Day 5.2: %s\n" @@ part2 ())
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 5.2" =
|
||||||
|
Printf.printf "%s" @@ part2 ();
|
||||||
|
[%expect {| BNTZFPMMW |}]
|
||||||
;;
|
;;
|
||||||
+8
-4
@@ -24,8 +24,12 @@ let find_start window =
|
|||||||
let part1 () = find_start 4
|
let part1 () = find_start 4
|
||||||
let part2 () = find_start 14
|
let part2 () = find_start 14
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 6.1" =
|
||||||
Printf.(
|
Printf.printf "%d" @@ part1 ();
|
||||||
printf "Day 6.1: %d\n" @@ part1 ();
|
[%expect {| 1833 |}]
|
||||||
printf "Day 6.2: %d\n" @@ part2 ())
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 6.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 3425 |}]
|
||||||
;;
|
;;
|
||||||
+8
-4
@@ -101,8 +101,12 @@ let part2 () =
|
|||||||
| None -> failwith "not possible!!"
|
| None -> failwith "not possible!!"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 7.1" =
|
||||||
Printf.(
|
Printf.printf "%d" @@ part1 ();
|
||||||
printf "Day 7.1: %d\n" @@ part1 ();
|
[%expect {| 1453349 |}]
|
||||||
printf "Day 7.2: %d\n" @@ part2 ())
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 7.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 2948823 |}]
|
||||||
;;
|
;;
|
||||||
+11
-22
@@ -1,28 +1,13 @@
|
|||||||
open Containers
|
open Containers
|
||||||
|
|
||||||
let parse_grid () =
|
let parse_grid () =
|
||||||
let lines = Utils.lines_of_input 8 in
|
Vec2.parse_grid Fun.(Char.to_string %> int_of_string) @@ Utils.lines_of_input 8
|
||||||
lines
|
|
||||||
|> Array.of_list
|
|
||||||
|> Array.map
|
|
||||||
Fun.(String.to_seq %> Seq.map (Char.to_string %> int_of_string) %> Seq.to_array)
|
|
||||||
;;
|
|
||||||
|
|
||||||
let solve grid fn =
|
|
||||||
let grid_h = Array.length grid in
|
|
||||||
let grid_w = Array.length grid.(0) in
|
|
||||||
for y = 0 to grid_h - 1 do
|
|
||||||
for x = 0 to grid_w - 1 do
|
|
||||||
let start = Vec2.of_tuple (x, y) in
|
|
||||||
fn start
|
|
||||||
done
|
|
||||||
done
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part1 () =
|
let part1 () =
|
||||||
let grid = parse_grid () in
|
let grid = parse_grid () in
|
||||||
let num_visible = ref 0 in
|
let num_visible = ref 0 in
|
||||||
solve grid (fun start ->
|
Vec2.iter_grid grid (fun start ->
|
||||||
let start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in
|
let start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in
|
||||||
let rec walk_shorter_trees start step =
|
let rec walk_shorter_trees start step =
|
||||||
let next = Vec2.(start + step) in
|
let next = Vec2.(start + step) in
|
||||||
@@ -43,7 +28,7 @@ let part1 () =
|
|||||||
let part2 () =
|
let part2 () =
|
||||||
let grid = parse_grid () in
|
let grid = parse_grid () in
|
||||||
let best_score = ref 0 in
|
let best_score = ref 0 in
|
||||||
solve grid (fun start ->
|
Vec2.iter_grid grid (fun start ->
|
||||||
let start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in
|
let start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in
|
||||||
let rec trees_in_view start in_view step =
|
let rec trees_in_view start in_view step =
|
||||||
let next = Vec2.(start + step) in
|
let next = Vec2.(start + step) in
|
||||||
@@ -59,8 +44,12 @@ let part2 () =
|
|||||||
!best_score
|
!best_score
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 8.1" =
|
||||||
Printf.(
|
Printf.printf "%d" @@ part1 ();
|
||||||
printf "Day 8.1: %d\n" @@ part1 ();
|
[%expect {| 1803 |}]
|
||||||
printf "Day 8.2: %d\n" @@ part2 ())
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 8.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 268912 |}]
|
||||||
;;
|
;;
|
||||||
+8
-4
@@ -61,8 +61,12 @@ let solve length =
|
|||||||
let part1 () = solve 2
|
let part1 () = solve 2
|
||||||
let part2 () = solve 10
|
let part2 () = solve 10
|
||||||
|
|
||||||
let print () =
|
let%expect_test "Day 9.1" =
|
||||||
Printf.(
|
Printf.printf "%d" @@ part1 ();
|
||||||
printf "Day 9.1: %d\n" @@ part1 ();
|
[%expect {| 6030 |}]
|
||||||
printf "Day 9.2: %d\n" @@ part2 ())
|
;;
|
||||||
|
|
||||||
|
let%expect_test "Day 9.2" =
|
||||||
|
Printf.printf "%d" @@ part2 ();
|
||||||
|
[%expect {| 2545 |}]
|
||||||
;;
|
;;
|
||||||
@@ -1,7 +1,12 @@
|
|||||||
(library
|
(library
|
||||||
(name aoc)
|
(name aoc)
|
||||||
(libraries re containers dune-site)
|
(libraries re containers dune-site)
|
||||||
(preprocess (pps ppx_regexp ppx_deriving.show)))
|
(inline_tests)
|
||||||
|
(preprocess (pps
|
||||||
|
ppx_regexp
|
||||||
|
ppx_deriving.show
|
||||||
|
ppx_expect
|
||||||
|
ppx_inline_test)))
|
||||||
|
|
||||||
(env
|
(env
|
||||||
(dev
|
(dev
|
||||||
|
|||||||
+17
@@ -1,6 +1,7 @@
|
|||||||
open Containers
|
open Containers
|
||||||
|
|
||||||
type t = int * int [@@deriving show]
|
type t = int * int [@@deriving show]
|
||||||
|
type 'a grid = 'a array array
|
||||||
|
|
||||||
let up = 0, 1
|
let up = 0, 1
|
||||||
let down = 0, -1
|
let down = 0, -1
|
||||||
@@ -19,3 +20,19 @@ let at grid point =
|
|||||||
let* row = Array.get_safe grid y in
|
let* row = Array.get_safe grid y in
|
||||||
Array.get_safe row x
|
Array.get_safe row x
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
let parse_grid parse_char lines =
|
||||||
|
lines
|
||||||
|
|> Array.of_list
|
||||||
|
|> Array.map Fun.(String.to_seq %> Seq.map parse_char %> Seq.to_array)
|
||||||
|
;;
|
||||||
|
|
||||||
|
let iter_grid grid callback =
|
||||||
|
let grid_h = Array.length grid in
|
||||||
|
let grid_w = Array.length grid.(0) in
|
||||||
|
for y = 0 to Int.(grid_h - 1) do
|
||||||
|
for x = 0 to Int.(grid_w - 1) do
|
||||||
|
callback (x, y)
|
||||||
|
done
|
||||||
|
done
|
||||||
|
;;
|
||||||
+4
-1
@@ -1,4 +1,5 @@
|
|||||||
type t [@@deriving show]
|
type t [@@deriving show]
|
||||||
|
type 'a grid
|
||||||
|
|
||||||
val up : t
|
val up : t
|
||||||
val down : t
|
val down : t
|
||||||
@@ -10,4 +11,6 @@ val to_tuple : t -> int * int
|
|||||||
val ( + ) : t -> t -> t
|
val ( + ) : t -> t -> t
|
||||||
val ( - ) : t -> t -> t
|
val ( - ) : t -> t -> t
|
||||||
val ( = ) : t -> t -> bool
|
val ( = ) : t -> t -> bool
|
||||||
val at : 'a array array -> t -> 'a option
|
val at : 'a grid -> t -> 'a option
|
||||||
|
val parse_grid : (char -> 'a) -> string list -> 'a grid
|
||||||
|
val iter_grid : 'a grid -> (t -> unit) -> unit
|
||||||
Reference in new issue
Block a user