diff options
| author | lancew <lw@judocoach.com> | 2020-08-22 15:22:42 +0100 |
|---|---|---|
| committer | lancew <lw@judocoach.com> | 2020-08-22 15:22:42 +0100 |
| commit | 09f81d31bdefdb08317b3e2fc5fd615ee5b45af4 (patch) | |
| tree | 13971fe9ba2e3f02e00ca1b4f4ea832cd26c0e74 | |
| parent | 5faf464232a61c231e06fbb066eff5efd23fce7e (diff) | |
| download | perlweeklychallenge-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.pl | 14 | ||||
| -rw-r--r-- | challenge-074/lance-wicks/perl/lib/FNR.pm | 36 | ||||
| -rw-r--r-- | challenge-074/lance-wicks/perl/t/FNR.t | 35 |
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; |
