Skip to content

Commit

Permalink
Add pangram exercise (#700)
Browse files Browse the repository at this point in the history
  • Loading branch information
glennj authored Nov 29, 2024
1 parent 341b8ac commit 7ee077a
Show file tree
Hide file tree
Showing 10 changed files with 221 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,14 @@
"prerequisites": [],
"difficulty": 1
},
{
"slug": "pangram",
"name": "Pangram",
"uuid": "dd2d617f-acfc-4821-b8e8-7323d84852d9",
"practices": [],
"prerequisites": [],
"difficulty": 2
},
{
"slug": "pascals-triangle",
"name": "Pascal's Triangle",
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.
~~~~
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": [
"glennj"
],
"files": {
"solution": [
"lib/Pangram.pm"
],
"test": [
"t/pangram.t"
],
"example": [
".meta/solutions/lib/Pangram.pm"
]
},
"blurb": "Determine if a sentence is a pangram.",
"source": "Wikipedia",
"source_url": "https://en.wikipedia.org/wiki/Pangram"
}
17 changes: 17 additions & 0 deletions exercises/practice/pangram/.meta/solutions/lib/Pangram.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package Pangram;

use strict;
use warnings;
use experimental qw<signatures postderef postderef_qq>;

use Exporter qw<import>;
our @EXPORT_OK = qw<is_pangram>;

use List::Util qw(uniq);

sub is_pangram ($text) {
my @letters = grep {/[[:alpha:]]/} split "", lc $text;
return scalar( uniq @letters ) == 26;
}

1;
1 change: 1 addition & 0 deletions exercises/practice/pangram/.meta/solutions/t/pangram.t
26 changes: 26 additions & 0 deletions exercises/practice/pangram/.meta/template-data.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
subs: is_pangram

properties:
isPangram:
test: |-
use Data::Dmp;
sprintf(<<'END', dmp($case->{input}{sentence}), $case->{expected} ? ('T', '# True') : ('DF', '# Defined but False'), dmp($case->{description}));
is(
is_pangram(%s),
%s, %s
%s
);
END
stub: |-
sub is_pangram ($text) {
return undef;
}
example: |-
use List::Util qw(uniq);
sub is_pangram ($text) {
my @letters = grep { /[[:alpha:]]/ } split "", lc $text;
return scalar(uniq @letters) == 26;
}
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"
12 changes: 12 additions & 0 deletions exercises/practice/pangram/lib/Pangram.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package Pangram;

use v5.40;

use Exporter qw<import>;
our @EXPORT_OK = qw<is_pangram>;

sub is_pangram ($text) {
return undef;
}

1;
69 changes: 69 additions & 0 deletions exercises/practice/pangram/t/pangram.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#!/usr/bin/env perl
use Test2::V0;

use FindBin qw<$Bin>;
use lib "$Bin/../lib", "$Bin/../local/lib/perl5";

use Pangram qw<is_pangram>;

is( # begin: 64f61791-508e-4f5c-83ab-05de042b0149
is_pangram(""),
DF, # Defined but False
"empty sentence"
); # end: 64f61791-508e-4f5c-83ab-05de042b0149

is( # begin: 74858f80-4a4d-478b-8a5e-c6477e4e4e84
is_pangram("abcdefghijklmnopqrstuvwxyz"),
T, # True
"perfect lower case"
); # end: 74858f80-4a4d-478b-8a5e-c6477e4e4e84

is( # begin: 61288860-35ca-4abe-ba08-f5df76ecbdcd
is_pangram("the quick brown fox jumps over the lazy dog"),
T, # True
"only lower case"
); # end: 61288860-35ca-4abe-ba08-f5df76ecbdcd

is( # begin: 6564267d-8ac5-4d29-baf2-e7d2e304a743
is_pangram("a quick movement of the enemy will jeopardize five gunboats"),
DF, # Defined but False
"missing the letter 'x'"
); # end: 6564267d-8ac5-4d29-baf2-e7d2e304a743

is( # begin: c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0
is_pangram("five boxing wizards jump quickly at it"),
DF, # Defined but False
"missing the letter 'h'"
); # end: c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0

is( # begin: d835ec38-bc8f-48e4-9e36-eb232427b1df
is_pangram("the_quick_brown_fox_jumps_over_the_lazy_dog"),
T, # True
"with underscores"
); # end: d835ec38-bc8f-48e4-9e36-eb232427b1df

is( # begin: 8cc1e080-a178-4494-b4b3-06982c9be2a8
is_pangram("the 1 quick brown fox jumps over the 2 lazy dogs"),
T, # True
"with numbers"
); # end: 8cc1e080-a178-4494-b4b3-06982c9be2a8

is( # begin: bed96b1c-ff95-45b8-9731-fdbdcb6ede9a
is_pangram("7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"),
DF, # Defined but False
"missing letters replaced by numbers"
); # end: bed96b1c-ff95-45b8-9731-fdbdcb6ede9a

is( # begin: 938bd5d8-ade5-40e2-a2d9-55a338a01030
is_pangram("\"Five quacking Zephyrs jolt my wax bed.\""),
T, # True
"mixed case and punctuation"
); # end: 938bd5d8-ade5-40e2-a2d9-55a338a01030

is( # begin: 7138e389-83e4-4c6e-8413-1e40a0076951
is_pangram("abcdefghijklm ABCDEFGHIJKLM"),
DF, # Defined but False
"a-m and A-M are 26 different characters but not a pangram"
); # end: 7138e389-83e4-4c6e-8413-1e40a0076951

done_testing;

0 comments on commit 7ee077a

Please sign in to comment.