Skip to content

Commit

Permalink
Add acronym exercise (#704)
Browse files Browse the repository at this point in the history
* Add acronym exercise

* remove variable length lookbehind
  • Loading branch information
glennj authored Nov 29, 2024
1 parent 441435d commit c269bd6
Show file tree
Hide file tree
Showing 9 changed files with 201 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,14 @@
],
"difficulty": 1
},
{
"slug": "acronym",
"name": "Acronym",
"uuid": "79fce6b7-5af9-4ee5-bd41-743ecc00cebc",
"practices": [],
"prerequisites": [],
"difficulty": 3
},
{
"slug": "all-your-base",
"name": "All Your Base",
Expand Down
17 changes: 17 additions & 0 deletions exercises/practice/acronym/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Instructions

Convert a phrase to its acronym.

Techies love their TLA (Three Letter Acronyms)!

Help generate some jargon by writing a program that converts a long name like Portable Network Graphics to its acronym (PNG).

Punctuation is handled as follows: hyphens are word separators (like whitespace); all other punctuation can be removed from the input.

For example:

| Input | Output |
| ------------------------- | ------ |
| As Soon As Possible | ASAP |
| Liquid-crystal display | LCD |
| Thank George It's Friday! | TGIF |
19 changes: 19 additions & 0 deletions exercises/practice/acronym/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"glennj"
],
"files": {
"solution": [
"lib/Acronym.pm"
],
"test": [
"t/acronym.t"
],
"example": [
".meta/solutions/lib/Acronym.pm"
]
},
"blurb": "Convert a long phrase to its acronym.",
"source": "Julien Vanier",
"source_url": "https://github.com/monkbroc"
}
18 changes: 18 additions & 0 deletions exercises/practice/acronym/.meta/solutions/lib/Acronym.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package Acronym;

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

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

sub abbreviate ($phrase) {

# capture letters preceded by the start of the string
# or by a non-(letter or apostrophe)
my @letters = $phrase =~ /(?:^|[^'a-z])\K([a-z])/ig;
return uc join "", @letters;
}

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

properties:
abbreviate:
test: |-
use Data::Dmp;
sprintf(<<'END', map {dmp($_)} $case->{input}{phrase}, $case->{expected}, $case->{description});
is(
abbreviate( %s ),
%s,
%s,
);
END
example: |-
sub abbreviate ($phrase) {
# capture letters preceded by the start of the string
# or by a non-(letter or apostrophe)
my @letters = $phrase =~ /(?:^|[^'a-z])\K([a-z])/ig;
return uc join "", @letters;
}
stub: |-
sub abbreviate ($phrase) {
return undef;
}
37 changes: 37 additions & 0 deletions exercises/practice/acronym/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# 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.

[1e22cceb-c5e4-4562-9afe-aef07ad1eaf4]
description = "basic"

[79ae3889-a5c0-4b01-baf0-232d31180c08]
description = "lowercase words"

[ec7000a7-3931-4a17-890e-33ca2073a548]
description = "punctuation"

[32dd261c-0c92-469a-9c5c-b192e94a63b0]
description = "all caps word"

[ae2ac9fa-a606-4d05-8244-3bcc4659c1d4]
description = "punctuation without whitespace"

[0e4b1e7c-1a6d-48fb-81a7-bf65eb9e69f9]
description = "very long abbreviation"

[6a078f49-c68d-4b7b-89af-33a1a98c28cc]
description = "consecutive delimiters"

[5118b4b1-4572-434c-8d57-5b762e57973e]
description = "apostrophes"

[adc12eab-ec2d-414f-b48c-66a4fc06cdef]
description = "underscore emphasis"
12 changes: 12 additions & 0 deletions exercises/practice/acronym/lib/Acronym.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package Acronym;

use v5.40;

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

sub abbreviate ($phrase) {
return undef;
}

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

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

use Acronym qw<abbreviate>;

is( # begin: 1e22cceb-c5e4-4562-9afe-aef07ad1eaf4
abbreviate("Portable Network Graphics"),
"PNG",
"basic",
); # end: 1e22cceb-c5e4-4562-9afe-aef07ad1eaf4

is( # begin: 79ae3889-a5c0-4b01-baf0-232d31180c08
abbreviate("Ruby on Rails"),
"ROR",
"lowercase words",
); # end: 79ae3889-a5c0-4b01-baf0-232d31180c08

is( # begin: ec7000a7-3931-4a17-890e-33ca2073a548
abbreviate("First In, First Out"),
"FIFO",
"punctuation",
); # end: ec7000a7-3931-4a17-890e-33ca2073a548

is( # begin: 32dd261c-0c92-469a-9c5c-b192e94a63b0
abbreviate("GNU Image Manipulation Program"),
"GIMP",
"all caps word",
); # end: 32dd261c-0c92-469a-9c5c-b192e94a63b0

is( # begin: ae2ac9fa-a606-4d05-8244-3bcc4659c1d4
abbreviate("Complementary metal-oxide semiconductor"),
"CMOS",
"punctuation without whitespace",
); # end: ae2ac9fa-a606-4d05-8244-3bcc4659c1d4

is( # begin: 0e4b1e7c-1a6d-48fb-81a7-bf65eb9e69f9
abbreviate("Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me"),
"ROTFLSHTMDCOALM",
"very long abbreviation",
); # end: 0e4b1e7c-1a6d-48fb-81a7-bf65eb9e69f9

is( # begin: 6a078f49-c68d-4b7b-89af-33a1a98c28cc
abbreviate("Something - I made up from thin air"),
"SIMUFTA",
"consecutive delimiters",
); # end: 6a078f49-c68d-4b7b-89af-33a1a98c28cc

is( # begin: 5118b4b1-4572-434c-8d57-5b762e57973e
abbreviate("Halley's Comet"),
"HC",
"apostrophes",
); # end: 5118b4b1-4572-434c-8d57-5b762e57973e

is( # begin: adc12eab-ec2d-414f-b48c-66a4fc06cdef
abbreviate("The Road _Not_ Taken"),
"TRNT",
"underscore emphasis",
); # end: adc12eab-ec2d-414f-b48c-66a4fc06cdef

done_testing;

0 comments on commit c269bd6

Please sign in to comment.