Files
rose-ash/lib/ocaml/baseline/roman.ml
giles bc4f4a5477
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 51s
ocaml: phase 5.1 roman.ml baseline + top-level 'let () = expr'
Side-quest emerged from adding roman.ml baseline (Roman numeral greedy
encoding): top-level 'let () = expr' was unsupported because
ocaml-parse-program's parse-decl-let consumed an ident strictly. Now
parse-decl-let recognises a leading '()' as a unit binding and
synthesises a __unit_NN name (matching how parse-let already handles
inner-let unit patterns).

roman.ml exercises:
  * tuple list literal [(int * string); ...]
  * recursive pattern match on tuple-cons
  * String.length + List.fold_left
  * the new top-level let () support (sanity in a comment, even though
    the program ends with a bare expression for the test harness)

Bumped lib/ocaml/test.sh server timeout 180->360s — the recent surge in
test count plus a CPU-contended host was crowding out the sole epoch
reaching the deeper smarts.
2026-05-08 23:40:36 +00:00

21 lines
502 B
OCaml

let to_roman n =
let pairs = [
(1000, "M"); (900, "CM"); (500, "D"); (400, "CD");
(100, "C"); (90, "XC"); (50, "L"); (40, "XL");
(10, "X"); (9, "IX"); (5, "V"); (4, "IV"); (1, "I")
] in
let rec aux n pairs acc =
match pairs with
| [] -> acc
| (v, s) :: rest ->
if n >= v then aux (n - v) pairs (acc ^ s)
else aux n rest acc
in
aux n pairs ""
;;
List.fold_left
(fun acc n -> acc + String.length (to_roman n))
0
[1; 4; 9; 14; 49; 99; 444; 1994; 3888]