solve day 9 :)
This commit is contained in:
parent
5e1c30637e
commit
1ee3a5a3c5
|
|
@ -8,5 +8,6 @@ let () =
|
|||
Day5.print ();
|
||||
Day6.print ();
|
||||
Day7.print ();
|
||||
Day8.print ()
|
||||
Day8.print ();
|
||||
Day9.print ()
|
||||
;;
|
||||
|
|
|
|||
2000
inputs/day9.tt
Normal file
2000
inputs/day9.tt
Normal file
File diff suppressed because it is too large
Load Diff
68
src/day9.ml
Normal file
68
src/day9.ml
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
open Containers
|
||||
|
||||
let parse_input () =
|
||||
Utils.lines_of_input 9
|
||||
|> List.concat_map (fun line ->
|
||||
match String.split ~by:" " line with
|
||||
| [ dir; count ] ->
|
||||
let count = int_of_string count in
|
||||
let dir =
|
||||
match dir with
|
||||
| "U" -> Vec2.up
|
||||
| "D" -> Vec2.down
|
||||
| "L" -> Vec2.left
|
||||
| "R" -> Vec2.right
|
||||
| _ -> failwith "failed to parse instructions"
|
||||
in
|
||||
List.init count (fun _ -> dir)
|
||||
| _ -> failwith "failed to parse instructions")
|
||||
;;
|
||||
|
||||
let next_pos head tail =
|
||||
let dx, dy = Vec2.(to_tuple @@ (tail - head)) in
|
||||
if abs dx <= 1 && abs dy <= 1
|
||||
then tail
|
||||
else (
|
||||
let x_dir = if dx > 0 then Vec2.right else Vec2.left in
|
||||
let y_dir = if dy > 0 then Vec2.up else Vec2.down in
|
||||
let dir =
|
||||
if abs dx = abs dy
|
||||
then Vec2.(x_dir + y_dir)
|
||||
else if abs dx > abs dy
|
||||
then x_dir
|
||||
else y_dir
|
||||
in
|
||||
Vec2.(head + dir))
|
||||
;;
|
||||
|
||||
let solve length =
|
||||
let moves = parse_input () in
|
||||
let start = Vec2.of_tuple (0, 0) in
|
||||
let tail = List.init (length - 1) (fun _ -> start) in
|
||||
let _, _, last_knot_hist =
|
||||
List.fold_left
|
||||
(fun (head, tail, last_knot_hist) dir ->
|
||||
let new_head = Vec2.(head + dir) in
|
||||
let last_knot, new_tail =
|
||||
List.fold_map
|
||||
(fun head knot ->
|
||||
let new_knot = next_pos head knot in
|
||||
new_knot, new_knot)
|
||||
new_head
|
||||
tail
|
||||
in
|
||||
new_head, new_tail, last_knot :: last_knot_hist)
|
||||
(start, tail, [ start ])
|
||||
moves
|
||||
in
|
||||
last_knot_hist |> List.uniq ~eq:Vec2.( = ) |> List.length
|
||||
;;
|
||||
|
||||
let part1 () = solve 2
|
||||
let part2 () = solve 10
|
||||
|
||||
let print () =
|
||||
Printf.(
|
||||
printf "Day 9.1: %d\n" @@ part1 ();
|
||||
printf "Day 9.2: %d\n" @@ part2 ())
|
||||
;;
|
||||
Loading…
Reference in New Issue
Block a user