aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlancew <lw@judocoach.com>2020-08-22 15:22:42 +0100
committerlancew <lw@judocoach.com>2020-08-22 15:22:42 +0100
commit09f81d31bdefdb08317b3e2fc5fd615ee5b45af4 (patch)
tree13971fe9ba2e3f02e00ca1b4f4ea832cd26c0e74
parent5faf464232a61c231e06fbb066eff5efd23fce7e (diff)
downloadperlweeklychallenge-club-09f81d31bdefdb08317b3e2fc5fd615ee5b45af4.tar.gz
perlweeklychallenge-club-09f81d31bdefdb08317b3e2fc5fd615ee5b45af4.tar.bz2
perlweeklychallenge-club-09f81d31bdefdb08317b3e2fc5fd615ee5b45af4.zip
Challenge 74, task 2
-rw-r--r--challenge-074/lance-wicks/perl/ch-2.pl14
-rw-r--r--challenge-074/lance-wicks/perl/lib/FNR.pm36
-rw-r--r--challenge-074/lance-wicks/perl/t/FNR.t35
3 files changed, 85 insertions, 0 deletions
diff --git a/challenge-074/lance-wicks/perl/ch-2.pl b/challenge-074/lance-wicks/perl/ch-2.pl
new file mode 100644
index 0000000000..8b1fac125b
--- /dev/null
+++ b/challenge-074/lance-wicks/perl/ch-2.pl
@@ -0,0 +1,14 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use lib './lib';
+use FNR;
+
+my @A = @ARGV;
+my $fnr = FNR->new();
+
+my $output = $fnr->from_string($A[0]);
+
+print $output;
diff --git a/challenge-074/lance-wicks/perl/lib/FNR.pm b/challenge-074/lance-wicks/perl/lib/FNR.pm
new file mode 100644
index 0000000000..d76b60b3f7
--- /dev/null
+++ b/challenge-074/lance-wicks/perl/lib/FNR.pm
@@ -0,0 +1,36 @@
+package FNR;
+
+use strict;
+use warnings;
+
+use List::MoreUtils 'frequency';
+use Moo;
+
+sub from_string {
+ my ( $self, $string ) = @_;
+ my $sequence = '';
+
+ my $end = length $string;
+
+ for my $offset ( 1 .. $end ) {
+ my $chars = substr $string, 0, $offset;
+ $sequence .= $self->_fnr($chars);
+ }
+
+ return $sequence;
+}
+
+sub _fnr {
+ my ( $self, $chars ) = @_;
+ my @characters = split '', $chars;
+ my %frequencies = frequency( @characters );
+
+ for my $key ( reverse @characters ) {
+ return $key if $frequencies{$key} == 1;
+ }
+
+ return '#';
+}
+
+1;
+
diff --git a/challenge-074/lance-wicks/perl/t/FNR.t b/challenge-074/lance-wicks/perl/t/FNR.t
new file mode 100644
index 0000000000..8bb52b5133
--- /dev/null
+++ b/challenge-074/lance-wicks/perl/t/FNR.t
@@ -0,0 +1,35 @@
+use Test2::V0 -target => 'FNR';
+
+subtest 'from_string()' => sub {
+ subtest 'Example 1' => sub {
+ note "Input: ‘ababc’";
+ note "Output: ‘abb#c’";
+ is $CLASS->from_string('ababc'), 'abb#c',
+ 'The first example is correct';
+ };
+
+ subtest 'Example 2' => sub {
+ note "Input: ‘xyzzyx’";
+ note "Output: ‘xyzyx#’";
+
+ is $CLASS->from_string('xyzzyx'), 'xyzyx#',
+ 'The second example is correct';
+
+ };
+};
+
+subtest '_fnr()' => sub {
+ my %tests = (
+ 'a' => 'a',
+ 'ab' => 'b',
+ 'aba' => 'b',
+ 'abab' => '#',
+ 'ababc' => 'c'
+ );
+
+ while ( my ( $input, $expected ) = each %tests ) {
+ is $CLASS->_fnr($input), $expected, "$input should return $expected";
+ }
+};
+
+done_testing;