Skip to content

Commit 7ee077a

Browse files
authored
Add pangram exercise (#700)
1 parent 341b8ac commit 7ee077a

10 files changed

Lines changed: 221 additions & 0 deletions

File tree

config.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,14 @@
496496
"prerequisites": [],
497497
"difficulty": 1
498498
},
499+
{
500+
"slug": "pangram",
501+
"name": "Pangram",
502+
"uuid": "dd2d617f-acfc-4821-b8e8-7323d84852d9",
503+
"practices": [],
504+
"prerequisites": [],
505+
"difficulty": 2
506+
},
499507
{
500508
"slug": "pascals-triangle",
501509
"name": "Pascal's Triangle",
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Instructions
2+
3+
Your task is to figure out if a sentence is a pangram.
4+
5+
A pangram is a sentence using every letter of the alphabet at least once.
6+
It is case insensitive, so it doesn't matter if a letter is lower-case (e.g. `k`) or upper-case (e.g. `K`).
7+
8+
For this exercise, a sentence is a pangram if it contains each of the 26 letters in the English alphabet.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Introduction
2+
3+
You work for a company that sells fonts through their website.
4+
They'd like to show a different sentence each time someone views a font on their website.
5+
To give a comprehensive sense of the font, the random sentences should use **all** the letters in the English alphabet.
6+
7+
They're running a competition to get suggestions for sentences that they can use.
8+
You're in charge of checking the submissions to see if they are valid.
9+
10+
~~~~exercism/note
11+
Pangram comes from Greek, παν γράμμα, pan gramma, which means "every letter".
12+
13+
The best known English pangram is:
14+
15+
> The quick brown fox jumps over the lazy dog.
16+
~~~~
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"authors": [
3+
"glennj"
4+
],
5+
"files": {
6+
"solution": [
7+
"lib/Pangram.pm"
8+
],
9+
"test": [
10+
"t/pangram.t"
11+
],
12+
"example": [
13+
".meta/solutions/lib/Pangram.pm"
14+
]
15+
},
16+
"blurb": "Determine if a sentence is a pangram.",
17+
"source": "Wikipedia",
18+
"source_url": "https://en.wikipedia.org/wiki/Pangram"
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package Pangram;
2+
3+
use strict;
4+
use warnings;
5+
use experimental qw<signatures postderef postderef_qq>;
6+
7+
use Exporter qw<import>;
8+
our @EXPORT_OK = qw<is_pangram>;
9+
10+
use List::Util qw(uniq);
11+
12+
sub is_pangram ($text) {
13+
my @letters = grep {/[[:alpha:]]/} split "", lc $text;
14+
return scalar( uniq @letters ) == 26;
15+
}
16+
17+
1;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../t/pangram.t
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
subs: is_pangram
2+
3+
properties:
4+
isPangram:
5+
test: |-
6+
use Data::Dmp;
7+
sprintf(<<'END', dmp($case->{input}{sentence}), $case->{expected} ? ('T', '# True') : ('DF', '# Defined but False'), dmp($case->{description}));
8+
is(
9+
is_pangram(%s),
10+
%s, %s
11+
%s
12+
);
13+
END
14+
15+
stub: |-
16+
sub is_pangram ($text) {
17+
return undef;
18+
}
19+
20+
example: |-
21+
use List::Util qw(uniq);
22+
23+
sub is_pangram ($text) {
24+
my @letters = grep { /[[:alpha:]]/ } split "", lc $text;
25+
return scalar(uniq @letters) == 26;
26+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# This is an auto-generated file.
2+
#
3+
# Regenerating this file via `configlet sync` will:
4+
# - Recreate every `description` key/value pair
5+
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
6+
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
7+
# - Preserve any other key/value pair
8+
#
9+
# As user-added comments (using the # character) will be removed when this file
10+
# is regenerated, comments can be added via a `comment` key.
11+
12+
[64f61791-508e-4f5c-83ab-05de042b0149]
13+
description = "empty sentence"
14+
15+
[74858f80-4a4d-478b-8a5e-c6477e4e4e84]
16+
description = "perfect lower case"
17+
18+
[61288860-35ca-4abe-ba08-f5df76ecbdcd]
19+
description = "only lower case"
20+
21+
[6564267d-8ac5-4d29-baf2-e7d2e304a743]
22+
description = "missing the letter 'x'"
23+
24+
[c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0]
25+
description = "missing the letter 'h'"
26+
27+
[d835ec38-bc8f-48e4-9e36-eb232427b1df]
28+
description = "with underscores"
29+
30+
[8cc1e080-a178-4494-b4b3-06982c9be2a8]
31+
description = "with numbers"
32+
33+
[bed96b1c-ff95-45b8-9731-fdbdcb6ede9a]
34+
description = "missing letters replaced by numbers"
35+
36+
[938bd5d8-ade5-40e2-a2d9-55a338a01030]
37+
description = "mixed case and punctuation"
38+
39+
[2577bf54-83c8-402d-a64b-a2c0f7bb213a]
40+
description = "case insensitive"
41+
include = false
42+
43+
[7138e389-83e4-4c6e-8413-1e40a0076951]
44+
description = "a-m and A-M are 26 different characters but not a pangram"
45+
reimplements = "2577bf54-83c8-402d-a64b-a2c0f7bb213a"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package Pangram;
2+
3+
use v5.40;
4+
5+
use Exporter qw<import>;
6+
our @EXPORT_OK = qw<is_pangram>;
7+
8+
sub is_pangram ($text) {
9+
return undef;
10+
}
11+
12+
1;
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#!/usr/bin/env perl
2+
use Test2::V0;
3+
4+
use FindBin qw<$Bin>;
5+
use lib "$Bin/../lib", "$Bin/../local/lib/perl5";
6+
7+
use Pangram qw<is_pangram>;
8+
9+
is( # begin: 64f61791-508e-4f5c-83ab-05de042b0149
10+
is_pangram(""),
11+
DF, # Defined but False
12+
"empty sentence"
13+
); # end: 64f61791-508e-4f5c-83ab-05de042b0149
14+
15+
is( # begin: 74858f80-4a4d-478b-8a5e-c6477e4e4e84
16+
is_pangram("abcdefghijklmnopqrstuvwxyz"),
17+
T, # True
18+
"perfect lower case"
19+
); # end: 74858f80-4a4d-478b-8a5e-c6477e4e4e84
20+
21+
is( # begin: 61288860-35ca-4abe-ba08-f5df76ecbdcd
22+
is_pangram("the quick brown fox jumps over the lazy dog"),
23+
T, # True
24+
"only lower case"
25+
); # end: 61288860-35ca-4abe-ba08-f5df76ecbdcd
26+
27+
is( # begin: 6564267d-8ac5-4d29-baf2-e7d2e304a743
28+
is_pangram("a quick movement of the enemy will jeopardize five gunboats"),
29+
DF, # Defined but False
30+
"missing the letter 'x'"
31+
); # end: 6564267d-8ac5-4d29-baf2-e7d2e304a743
32+
33+
is( # begin: c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0
34+
is_pangram("five boxing wizards jump quickly at it"),
35+
DF, # Defined but False
36+
"missing the letter 'h'"
37+
); # end: c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0
38+
39+
is( # begin: d835ec38-bc8f-48e4-9e36-eb232427b1df
40+
is_pangram("the_quick_brown_fox_jumps_over_the_lazy_dog"),
41+
T, # True
42+
"with underscores"
43+
); # end: d835ec38-bc8f-48e4-9e36-eb232427b1df
44+
45+
is( # begin: 8cc1e080-a178-4494-b4b3-06982c9be2a8
46+
is_pangram("the 1 quick brown fox jumps over the 2 lazy dogs"),
47+
T, # True
48+
"with numbers"
49+
); # end: 8cc1e080-a178-4494-b4b3-06982c9be2a8
50+
51+
is( # begin: bed96b1c-ff95-45b8-9731-fdbdcb6ede9a
52+
is_pangram("7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"),
53+
DF, # Defined but False
54+
"missing letters replaced by numbers"
55+
); # end: bed96b1c-ff95-45b8-9731-fdbdcb6ede9a
56+
57+
is( # begin: 938bd5d8-ade5-40e2-a2d9-55a338a01030
58+
is_pangram("\"Five quacking Zephyrs jolt my wax bed.\""),
59+
T, # True
60+
"mixed case and punctuation"
61+
); # end: 938bd5d8-ade5-40e2-a2d9-55a338a01030
62+
63+
is( # begin: 7138e389-83e4-4c6e-8413-1e40a0076951
64+
is_pangram("abcdefghijklm ABCDEFGHIJKLM"),
65+
DF, # Defined but False
66+
"a-m and A-M are 26 different characters but not a pangram"
67+
); # end: 7138e389-83e4-4c6e-8413-1e40a0076951
68+
69+
done_testing;

0 commit comments

Comments
 (0)