Code:
(* Advent of Code, day7 part1 and part2 - on BPI-F3 RISC-V SBC *)(* OCaml code *)#load "utils.cmo"open Utilslet calculate1 result nums = let rec calc = function rr::[] -> rr = result | rr::a::t -> calc ((rr + a) :: t) || calc ((rr * a) :: t) | [] -> false in calc numslet cat a b = int_of_string (string_of_int a ^ (string_of_int b))let calculate2 result nums = let rec calc = function rr::[] -> rr = result | rr::a::t -> calc ((rr + a) :: t) || calc ((rr * a) :: t) || calc ((cat rr a) :: t) | [] -> false in calc numslet day7 file = let rawl = read_lines file in let nums = List.map ((List.map int_of_string) << (string_split [':'; ' '])) rawl in let r_tups = List.map (fun l -> (List.hd l, List.tl l)) nums in let all_terms = List.map (fun (r,ns) -> if calculate1 r ns then (r,[]) else (r,ns)) r_tups in let (ok_terms,wr_terms) = filter_split (fun x -> match x with (_,[]) -> true | _ -> false) all_terms in let cat_terms = List.map (fun (r,ns) -> if calculate2 r ns then r else 0) wr_terms in let (a,b) = (List.(fold_left (+) 0 (map fst ok_terms)), List.fold_left (+) 0 cat_terms) in (a, a + b)
Execution time: 16.006478s
- : int * int = (4364915411363, 38322057216320)
Part one is only 0.092s, but anyway, I'll have to use ocamlopt again.
hrvoje@BPI-F3:~/Projects/advent-of-code/2024/day-07/OCaml$ time ./day7 input.txt
4364915411363
38322057216320
real0m9.608s
user 0m9.594s
sys0m0.013s
Statistics: Posted by hrvoje064 — Sat Dec 07, 2024 4:08 pm