diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-08-17 12:21:16 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-17 12:21:16 +0100 |
| commit | e622495a3812e73f143a679df820df8484103f34 (patch) | |
| tree | 37436be62f9795472ce971b41f1a6b6907f999df | |
| parent | 0d0bd69b7022165761acd21986ab296a282e7283 (diff) | |
| parent | cd44f407cd0d1d9b875ff816b937187e9a7aa4bd (diff) | |
| download | perlweeklychallenge-club-e622495a3812e73f143a679df820df8484103f34.tar.gz perlweeklychallenge-club-e622495a3812e73f143a679df820df8484103f34.tar.bz2 perlweeklychallenge-club-e622495a3812e73f143a679df820df8484103f34.zip | |
Merge pull request #2091 from JavierLuque/javier/solutions-74
Solutions to challenge 74
| -rw-r--r-- | challenge-074/javier-luque/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-074/javier-luque/perl/ch-1.pl | 21 | ||||
| -rw-r--r-- | challenge-074/javier-luque/perl/ch-2.pl | 48 | ||||
| -rw-r--r-- | challenge-074/javier-luque/raku/ch-1.p6 | 22 | ||||
| -rw-r--r-- | challenge-074/javier-luque/raku/ch-2.p6 | 48 |
5 files changed, 140 insertions, 0 deletions
diff --git a/challenge-074/javier-luque/blog.txt b/challenge-074/javier-luque/blog.txt new file mode 100644 index 0000000000..f80d0a983b --- /dev/null +++ b/challenge-074/javier-luque/blog.txt @@ -0,0 +1 @@ +https://perlchallenges.wordpress.com/2020/08/17/perl-weekly-challenge-074/ diff --git a/challenge-074/javier-luque/perl/ch-1.pl b/challenge-074/javier-luque/perl/ch-1.pl new file mode 100644 index 0000000000..9e064f50a9 --- /dev/null +++ b/challenge-074/javier-luque/perl/ch-1.pl @@ -0,0 +1,21 @@ +#!/usr/bin/perl +# Test: ./ch-1.pl +use Modern::Perl; +use POSIX qw/ floor /; +use Test::More; + +is majority_element(1, 2, 2, 3, 2, 4, 2), 2, '(1, 2, 2, 3, 2, 4, 2)'; +is majority_element(1, 3, 1, 2, 4, 5), -1, '(1, 3, 1, 2, 4, 5)'; +done_testing; + +sub majority_element { + my %counts; + map { $counts{$_}++ } @_; + + # Majority element + my ($m) = sort { $counts{$b} <=> $counts{$a} } + keys %counts; + + return ($counts{$m} > floor(scalar(@_)/2)) ? + $m : -1; +} diff --git a/challenge-074/javier-luque/perl/ch-2.pl b/challenge-074/javier-luque/perl/ch-2.pl new file mode 100644 index 0000000000..2b8d68763b --- /dev/null +++ b/challenge-074/javier-luque/perl/ch-2.pl @@ -0,0 +1,48 @@ +#!/usr/bin/perl +# Test: ./ch-2.pl +use Modern::Perl; +use Test::More; + +is fnr('ababc'), 'abb#c', 'ababc'; +is fnr('xyzzyx'), 'xyzyx#', 'xyzzyx'; +done_testing; + +sub fnr { + my @S = split('', shift); + my %counts; + my $output; + + for (my $i = 0; $i < scalar(@S); $i++) { + my $c = $S[$i]; #character + my $fnr; + + # If this is the first time the + # letter exists use it + $fnr = $c + if (not defined($counts{$c})); + + # Increment counts + $counts{$c}++; + + # Use the first non repeating + # if there is no duplicate + unless ($fnr) { + for (my $j = $i - 1; $j >= 0; $j--) { + my $c2 = $S[$j]; + if ( defined($counts{$c2}) && + $counts{$c2} == 1 ) { + $fnr = $c2; + last; + } + } + } + + # If we didn't find a possible + # frn use a # + $fnr = '#' unless($fnr); + + $output .= $fnr; + } + + return $output +} diff --git a/challenge-074/javier-luque/raku/ch-1.p6 b/challenge-074/javier-luque/raku/ch-1.p6 new file mode 100644 index 0000000000..41ed69d741 --- /dev/null +++ b/challenge-074/javier-luque/raku/ch-1.p6 @@ -0,0 +1,22 @@ +# Test: perl6 ch-1.p6 +use Test; + +sub MAIN() { + is majority_element((1, 2, 2, 3, 2, 4, 2)), 2, '(1, 2, 2, 3, 2, 4, 2)'; + is majority_element((1, 3, 1, 2, 4, 5)), -1, '(1, 3, 1, 2, 4, 5)'; + done-testing(); +} + +sub majority_element(@A) { + my %counts; + @A.map({ %counts{$_}++ }); + + # Majority element + my $m = %counts.keys + .sort({ %counts{$^b} <=> %counts{$^a} }) + .first; + + + return (%counts{$m} > floor(@A.elems/2)) ?? + $m !! -1; +} diff --git a/challenge-074/javier-luque/raku/ch-2.p6 b/challenge-074/javier-luque/raku/ch-2.p6 new file mode 100644 index 0000000000..befb597903 --- /dev/null +++ b/challenge-074/javier-luque/raku/ch-2.p6 @@ -0,0 +1,48 @@ +# Test: perl6 ch-2.p6 +use Test; + +sub MAIN() { + is fnr('ababc'), 'abb#c', 'ababc'; + is fnr('xyzzyx'), 'xyzyx#', 'xyzzyx'; + done-testing(); +} + +sub fnr(Str $S) { + my @S = $S.comb; + my %counts; + my $output; + + loop (my $i = 0; $i < @S.elems; $i++) { + my $c = @S[$i]; #character + my $fnr; + + # If this is the first time the + # letter exists use it + $fnr = $c + if (not defined(%counts{$c})); + + # Increment counts + %counts{$c}++; + + # Use the first non repeating + # if there is no duplicate + unless ($fnr) { + loop (my $j = $i - 1; $j >= 0; $j--) { + my $c2 = @S[$j]; + if ( defined(%counts{$c2}) && + %counts{$c2} == 1 ) { + $fnr = $c2; + last; + } + } + } + + # If we didn't find a possible + # frn use a # + $fnr = '#' unless ($fnr); + + $output ~= $fnr; + } + + return $output +} |
