RosettaCodeData/Task/Abbreviations-easy/OCaml/abbreviations-easy.ml
2024-10-16 18:07:41 -07:00

47 lines
1.5 KiB
OCaml

let cmds = "\
Add ALTer BAckup Bottom CAppend Change SCHANGE CInsert CLAst COMPress COpy
COUnt COVerlay CURsor DELete CDelete Down DUPlicate Xedit EXPand EXTract Find
NFind NFINDUp NFUp CFind FINdup FUp FOrward GET Help HEXType Input POWerinput
Join SPlit SPLTJOIN LOAD Locate CLocate LOWercase UPPercase LPrefix MACRO
MErge MODify MOve MSG Next Overlay PARSE PREServe PURge PUT PUTD Query QUIT
READ RECover REFRESH RENum REPeat Replace CReplace RESet RESTore RGTLEFT
RIght LEft SAVE SET SHift SI SORT SOS STAck STATus TOP TRAnsfer Type Up"
let user =
"riG rePEAT copies put mo rest types fup. 6 poweRin"
let char_is_uppercase c =
match c with
| 'A'..'Z' -> true
| _ -> false
let get_abbr s =
let seq = String.to_seq s in
let seq = Seq.filter char_is_uppercase seq in
(String.of_seq seq)
let () =
let cmds = Str.split (Str.regexp "[ \r\n]+") cmds in
let cmds =
List.map (fun s ->
get_abbr s,
String.uppercase_ascii s
) cmds
in
let user = Str.split (Str.regexp "[ \r\n]+") user in
let r =
List.map (fun ucmd ->
let n = String.length ucmd in
let find_abbr (abbr, cmd) =
let na = String.length abbr in
let nc = String.length cmd in
if n < na || nc < n then false else
let sub = String.sub cmd 0 n in
(sub = String.uppercase_ascii ucmd)
in
match List.find_opt find_abbr cmds with
| Some (_, found) -> found
| None -> "*error*"
) user
in
print_endline (String.concat " " r)