Skip to content

Commit

Permalink
add pangram exercise (#190)
Browse files Browse the repository at this point in the history
  • Loading branch information
BNAndras authored Feb 20, 2024
1 parent e68f5f5 commit 87e8d70
Show file tree
Hide file tree
Showing 13 changed files with 203 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,14 @@
"practices": [],
"prerequisites": [],
"difficulty": 1
},
{
"slug": "pangram",
"name": "Pangram",
"uuid": "d319360a-afef-4b65-be5f-da45d48367cb",
"practices": [],
"prerequisites": [],
"difficulty": 2
}
]
},
Expand Down
8 changes: 8 additions & 0 deletions exercises/practice/pangram/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Instructions

Your task is to figure out if a sentence is a pangram.

A pangram is a sentence using every letter of the alphabet at least once.
It is case insensitive, so it doesn't matter if a letter is lower-case (e.g. `k`) or upper-case (e.g. `K`).

For this exercise, a sentence is a pangram if it contains each of the 26 letters in the English alphabet.
16 changes: 16 additions & 0 deletions exercises/practice/pangram/.docs/introduction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Introduction

You work for a company that sells fonts through their website.
They'd like to show a different sentence each time someone views a font on their website.
To give a comprehensive sense of the font, the random sentences should use **all** the letters in the English alphabet.

They're running a competition to get suggestions for sentences that they can use.
You're in charge of checking the submissions to see if they are valid.

~~~~exercism/note
Pangram comes from Greek, παν γράμμα, pan gramma, which means "every letter".
The best known English pangram is:
> The quick brown fox jumps over the lazy dog.
~~~~
11 changes: 11 additions & 0 deletions exercises/practice/pangram/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## -*- conf -*-
.rebar3
_build/
ebin/
erl_crash.dump
rebar3.crashdump

tmp
bin/configlet
bin/configlet.exe
CHECKLIST
19 changes: 19 additions & 0 deletions exercises/practice/pangram/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"BNAndras"
],
"files": {
"solution": [
"src/pangram.lfe"
],
"test": [
"test/pangram-tests.lfe"
],
"example": [
".meta/example.lfe"
]
},
"blurb": "Determine if a sentence is a pangram.",
"source": "Wikipedia",
"source_url": "https://en.wikipedia.org/wiki/Pangram"
}
6 changes: 6 additions & 0 deletions exercises/practice/pangram/.meta/example.lfe
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
(defmodule pangram
(export (pangram? 1)))

(defun pangram? (sentence)
(ordsets:is_subset (lists:seq #\a #\z)
(ordsets:from_list (string:lowercase sentence))))
45 changes: 45 additions & 0 deletions exercises/practice/pangram/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[64f61791-508e-4f5c-83ab-05de042b0149]
description = "empty sentence"

[74858f80-4a4d-478b-8a5e-c6477e4e4e84]
description = "perfect lower case"

[61288860-35ca-4abe-ba08-f5df76ecbdcd]
description = "only lower case"

[6564267d-8ac5-4d29-baf2-e7d2e304a743]
description = "missing the letter 'x'"

[c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0]
description = "missing the letter 'h'"

[d835ec38-bc8f-48e4-9e36-eb232427b1df]
description = "with underscores"

[8cc1e080-a178-4494-b4b3-06982c9be2a8]
description = "with numbers"

[bed96b1c-ff95-45b8-9731-fdbdcb6ede9a]
description = "missing letters replaced by numbers"

[938bd5d8-ade5-40e2-a2d9-55a338a01030]
description = "mixed case and punctuation"

[2577bf54-83c8-402d-a64b-a2c0f7bb213a]
description = "case insensitive"
include = false

[7138e389-83e4-4c6e-8413-1e40a0076951]
description = "a-m and A-M are 26 different characters but not a pangram"
reimplements = "2577bf54-83c8-402d-a64b-a2c0f7bb213a"
21 changes: 21 additions & 0 deletions exercises/practice/pangram/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
ERL := $(shell which erl)
REBAR3 := $(shell which rebar3)

null :=
space := $(null) #
comma := ,

ifeq ($(ERL),)
$(error Can't find Erlang executable 'erl')
else ifeq ($(REBAR3),)
$(error Can't find rebar3)
endif

compile: ; $(REBAR3) compile

clean: ; $(REBAR3) clean

.PHONY: test
test:
$(REBAR3) eunit \
-m $(subst $(space),$(comma),$(basename $(notdir $(wildcard test/*.lfe))))
11 changes: 11 additions & 0 deletions exercises/practice/pangram/rebar.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{plugins, [{rebar3_lfe, "0.4.3"}]}.

{provider_hooks, [{post, [{compile, {lfe, compile}}]}]}.

{deps, [{lfe, "2.1.1"}]}.

{profiles,
[{test,
[{eunit_compile_opts, [{src_dirs, ["src", "test"]}]},
{deps,
[{ltest, "0.13.3"}]}]}]}.
8 changes: 8 additions & 0 deletions exercises/practice/pangram/rebar.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{"1.2.0",
[{<<"lfe">>,{pkg,<<"lfe">>,<<"2.1.1">>},0}]}.
[
{pkg_hash,[
{<<"lfe">>, <<"4A888B26172D198DC7A5AFEB897E8248AF7D56E1638D9C8249AAF933AE811B96">>}]},
{pkg_hash_ext,[
{<<"lfe">>, <<"C484D3B655D40DED58BC41B17B22F173711C681BF36063A234A9BAA9506947E1">>}]}
].
11 changes: 11 additions & 0 deletions exercises/practice/pangram/src/pangram.app.src
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
%% -*- erlang -*-
{application, 'pangram',
[{description, ""},
{vsn, "0.0.1"},
{modules,
['pangram']},
{registered, []},
{applications,
[kernel, stdlib]},
{included_applications, []},
{env, []}]}.
4 changes: 4 additions & 0 deletions exercises/practice/pangram/src/pangram.lfe
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
(defmodule pangram
(export (pangram? 1)))

; Please implement the pangram? function.
35 changes: 35 additions & 0 deletions exercises/practice/pangram/test/pangram-tests.lfe
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
(defmodule pangram-tests
(behaviour ltest-unit)
(export all))

(include-lib "ltest/include/ltest-macros.lfe")

(deftest empty-sentence
(is-not (pangram:pangram? "")))

(deftest perfect-lower-case
(is (pangram:pangram? "abcdefghijklmnopqrstuvwxyz")))

(deftest only-lower-case
(is (pangram:pangram? "the quick brown fox jumps over the lazy dog")))

(deftest missing-the-letter-x
(is-not (pangram:pangram? "a quick movement of the enemy will jeopardize five gunboats")))

(deftest missing-the-letter-h
(is-not (pangram:pangram? "five boxing wizards jump quickly at it")))

(deftest with-underscores
(is (pangram:pangram? "the_quick_brown_fox_jumps_over_the_lazy_dog")))

(deftest with-numbers
(is (pangram:pangram? "the 1 quick brown fox jumps over the 2 lazy dogs")))

(deftest missing-letters-replaced-by-numbers
(is-not (pangram:pangram? "7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog")))

(deftest mixed-case-and-punctuation
(is (pangram:pangram? "\"Five quacking Zephyrs jolt my wax bed.\"")))

(deftest a-to-m-and-A-to-M-are-twenty-six-different-characters-but-not-a-pangram
(is-not (pangram:pangram? "abcdefghijklm ABCDEFGHIJKLM")))

0 comments on commit 87e8d70

Please sign in to comment.