2024 day 9 part 1.

This commit is contained in:
2024-12-09 15:48:11 +00:00
parent 6d551f5497
commit 02e1e3b8b6
2 changed files with 83 additions and 2 deletions

71
bin/day2409.ml Normal file
View File

@@ -0,0 +1,71 @@
let load_file fname =
match In_channel.with_open_text fname In_channel.input_line with
| Some x -> x
| None -> failwith "load_file"
(*
let disk_print disk =
let prnt c = if c = -1 then print_char '.' else print_int c in
Array.iter prnt disk;
print_newline();
*)
let disk_size disk_str =
let rec impl acc disk_str =
let len = String.length disk_str in
match len with
| 0 -> acc
| len ->
let h = int_of_string (String.sub disk_str 0 1) in
flush_all ();
let t = String.sub disk_str 1 (len - 1) in
flush_all ();
impl (acc + h) t
in
impl 0 disk_str
let disk_init disk_str =
let size = disk_size disk_str in
let disk = Array.make size (-1) in
let rec add_id offset id = function
| 0 -> offset
| x ->
disk.(offset) <- id;
add_id (offset + 1) id (x - 1)
in
let rec impl offset id disk_str =
match String.length disk_str with
| 0 -> ()
| 1 ->
let _ = add_id offset id (int_of_string (String.sub disk_str 0 1)) in
()
| str_len ->
let len = int_of_string (String.sub disk_str 0 1) in
impl
(add_id offset id len + int_of_string (String.sub disk_str 1 1))
(id + 1)
(String.sub disk_str 2 (str_len - 2))
in
impl 0 0 disk_str;
disk
let disk_defrag disk =
let rec impl front back =
if front >= back then ()
else if disk.(front) <> -1 then impl (front + 1) back
else if disk.(back) = -1 then impl front (back - 1)
else (
disk.(front) <- disk.(back);
disk.(back) <- -1;
impl (front + 1) (back - 1))
in
impl 0 (Array.length disk - 1);
disk
let calc_checksum disk =
let rec impl acc idx =
if disk.(idx) = -1 then acc else impl (acc + (disk.(idx) * idx)) (idx + 1)
in
impl 0 0
let part1 str = disk_init str |> disk_defrag |> calc_checksum
let _ = Aoc.main load_file [ (string_of_int, part1) ]

View File

@@ -7,6 +7,16 @@
day2405 day2405
day2406 day2406
day2407 day2407
day2408) day2408
(names day2401 day2402 day2403 day2404 day2405 day2406 day2407 day2408) day2409)
(names
day2401
day2402
day2403
day2404
day2405
day2406
day2407
day2408
day2409)
(libraries str aoc)) (libraries str aoc))