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

# fsouza's solution

## to Pangram in the OCaml Track

Published at Jul 06 2019 · 1 comment
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

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

``````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)``````

### pangram.ml

``````open Base

let init_set =
let a = Char.to_int 'a' in
Set.of_list (module Char)
@@ List.init ~f:(fun i -> i + a |> Char.of_int_exn) 26

let is_pangram phrase =
phrase
|> String.fold ~init:init_set ~f:(fun acc ch ->
ch |> Char.lowercase |> Set.remove acc)
|> Set.is_empty``````

### pangram.mli

``val is_pangram : string -> bool``