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

# kdbeall's solution

## to Pangram in the OCaml Track

Published at May 18 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 SS = Set.Make(Char)

let alphabet_array = Array.make 26 'a' |> Array.mapi (fun i c -> int_of_char c + i |> char_of_int);;
let alphabet_set = SS.of_list (Array.to_list alphabet_array);;
let explode s = List.init (String.length s) (String.get s);;

let is_pangram s =
let sentence = explode (String.lowercase_ascii s)
in let sentence_set = SS.of_list sentence
in if SS.subset alphabet_set sentence_set then true
else false``````