word_freq.ml en OCaml
Una tabla de frecuencias con split_on_char, un Hashtbl y un orden.
(* Count word frequencies in a passage and chart the leaders. *)
let passage =
"the rain in maine falls mainly on the plain and "
^ "the rain stays on the plain"
let () =
let counts = Hashtbl.create 16 in
String.split_on_char ' ' passage
|> List.iter (fun word ->
let n = Option.value ~default:0 (Hashtbl.find_opt counts word) in
Hashtbl.replace counts word (n + 1));
(* Pull the pairs out and rank: count descending, ties by word. *)
let ranked =
Hashtbl.fold (fun word n acc -> (word, n) :: acc) counts []
|> List.sort (fun (w1, n1) (w2, n2) ->
if n1 <> n2 then compare n2 n1 else compare w1 w2)
in
Printf.printf "%d distinct words\n" (List.length ranked);
print_endline "word ct bar";
ranked
|> List.iter (fun (word, n) ->
Printf.printf "%-7s %2d %s\n" word n (String.make n '#'))
Cómo funciona
Hashtbl.find_optcon un defecto cuenta cada palabra.Hashtbl.foldsaca los pares para clasificarlos.String.make n '#'dibuja la barra de cada palabra.
Palabras clave y builtins usados aquí
elsefunifinletthen
El intento, en números
- Líneas
- 25
- Caracteres a escribir
- 790
- Tokens
- 176
- Ritmo de tres estrellas
- 60 tpm
Al ritmo de tres estrellas de 60 tokens por minuto, este intento toma unos 176 segundos.
Paso 1 de 3 en Bis; paso 27 de 29 en Fundamentos del lenguaje.