typestar

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

  1. Hashtbl.find_opt con un defecto cuenta cada palabra.
  2. Hashtbl.fold saca los pares para clasificarlos.
  3. String.make n '#' dibuja la barra de cada palabra.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 3 en Bis; paso 27 de 29 en Fundamentos del lenguaje.

← Anterior Siguiente →