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

# thbel's solution

## to Pangram in the OCaml Track

Published at Apr 21 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)``````
``````open Base

let rec uniq lst_chr =
match lst_chr with
| [] -> []
| x::xs -> let unique = uniq xs in if List.mem unique x ~equal:Char.equal then unique else x::unique

let is_pangram s =
let alphabet = ['a';'b';'c';'d';'e';'f';'g';'h';'i';'j';'k';'l';'m';'n';'o';'p';'q';'r';'s';'t';'u';'v';'w';'x';'y';'z';]
in
s
|> String.lowercase
|> String.filter ~f:(fun x -> (List.mem alphabet x ~equal:Char.equal))
|> String.to_list
|> uniq
|> List.sort ~compare:Char.compare
|> List.equal Char.equal alphabet``````