🎉 Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io 🎉

# foocraft's solution

## to Pangram in the OCaml Track

Published at May 05 2020 · 0 comments
Instructions
Test suite
Solution

Determine if a sentence is a pangram. A pangram (Greek: παν γράμμα, pan gramma, "every letter") is a sentence using every letter of the alphabet at least once. The best known English pangram is:

The quick brown fox jumps over the lazy dog.

The alphabet used consists of ASCII letters `a` to `z`, inclusive, and is case insensitive. Input will not contain non-ASCII symbols.

## Getting Started

1. For library documentation, follow Useful OCaml resources.

## Running Tests

A `Makefile` is provided with a default target to compile your solution and run the tests. At the command line, type:

``````make
``````

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

## Feedback, Issues, Pull Requests

The exercism/ocaml repository on GitHub is the home for all of the Ocaml exercises.

If you have feedback about an exercise, or want to help implementing a new one, head over there and create an issue or submit a PR. We welcome new contributors!

## Source

### test.ml

``````(* pangram - 1.4.1 *)
open OUnit2
open Pangram

let ae exp got _test_ctxt = assert_equal ~printer:string_of_bool exp got

let tests = [
"sentence empty" >::
ae false (is_pangram "");
"recognizes a perfect lower case pangram" >::
ae true (is_pangram "abcdefghijklmnopqrstuvwxyz");
"pangram with only lower case" >::
ae true (is_pangram "the quick brown fox jumps over the lazy dog");
"missing character 'x'" >::
ae false (is_pangram "a quick movement of the enemy will jeopardize five gunboats");
"another missing character, e.g. 'h'" >::
ae false (is_pangram "five boxing wizards jump quickly at it");
"pangram with underscores" >::
ae true (is_pangram "the_quick_brown_fox_jumps_over_the_lazy_dog");
"pangram with numbers" >::
ae true (is_pangram "the 1 quick brown fox jumps over the 2 lazy dogs");
"missing letters replaced by numbers" >::
ae false (is_pangram "7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog");
"pangram with mixed case and punctuation" >::
ae true (is_pangram "\"Five quacking Zephyrs jolt my wax bed.\"");
"upper and lower case versions of the same character should not be counted separately" >::
ae false (is_pangram "the quick brown fox jumps over with lazy FX");
]

let () =
run_test_tt_main ("pangram tests" >::: tests)``````
``````module CharSet = Set.Make(Char)

let rec range start end' =
if start >= end' then []
else start :: (range (start + 1) end')

let alphabet start end' =
let chars_list = List.map Char.chr (range (Char.code start) (Char.code end')) in
CharSet.of_list chars_list

let is_pangram s =
let chars = alphabet 'a' 'z' in
let lower_case = Char.lowercase_ascii next_char in
match CharSet.find_opt lower_case chars with
| None -> unused_chars
| Some(_) -> CharSet.remove lower_case unused_chars in
String.to_seq s |> List.of_seq |> List.fold_left read_char chars |>
CharSet.is_empty``````