diff options
| -rwxr-xr-x | challenge-074/perlboy1967/perl/ch-1.pl | 44 | ||||
| -rwxr-xr-x | challenge-074/perlboy1967/perl/ch-2.pl | 31 |
2 files changed, 75 insertions, 0 deletions
diff --git a/challenge-074/perlboy1967/perl/ch-1.pl b/challenge-074/perlboy1967/perl/ch-1.pl new file mode 100755 index 0000000000..d6de26a7d7 --- /dev/null +++ b/challenge-074/perlboy1967/perl/ch-1.pl @@ -0,0 +1,44 @@ +#!/usr/bin/perl + +# Perl Weekly Challenge - 074 +# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-074/ +# +# Task 1 - Majority Element +# +# Author: Niels 'PerlBoy' van Dijke + +use strict; +use warnings; + +use List::Util qw(max); +use POSIX q(floor); + +my @A = @ARGV; + +# Create a list with some random numbers if none provided +@A = map {int(rand(3))} (1 .. 3 + rand(5)) + if (!scalar @A); + +my $N = scalar(@A); +my %ME = (); +my $reason; +my $me; + +$ME{$_}++ foreach (@A); +my $max = max(values %ME); +my @max = grep { $_ if $ME{$_} == $max } keys %ME; + +if (scalar @max == 1 and + $max > floor($N/2)) { + ($me, $reason) = ($max[0], + sprintf('as %d appears %d times in list which is more than floor(%d/2).', + $max[0], $max, $N)); +} else { + ($me, $reason) = (-1, + sprintf('as none of the elements appears more than floor(%d/2).', + $N)); +} + +printf "Input: \@A = (%s)\n", join(', ', @A); +printf "Output: %d %s\n", $me, $reason; + diff --git a/challenge-074/perlboy1967/perl/ch-2.pl b/challenge-074/perlboy1967/perl/ch-2.pl new file mode 100755 index 0000000000..124fdaa412 --- /dev/null +++ b/challenge-074/perlboy1967/perl/ch-2.pl @@ -0,0 +1,31 @@ +#!/usr/bin/perl + +# Perl Weekly Challenge - 074 +# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-074/ +# +# Task 2 - FNR Character +# +# Author: Niels 'PerlBoy' van Dijke + +use strict; +use warnings; + +use Data::Dumper; +use Tie::IxHash; + +my @test = qw(ababc xyzzyx abcabdeabefaf); + +my ($S) = @ARGV; +$S //= $test[rand(scalar @test)]; + +my $O; +tie my %cf, 'Tie::IxHash'; + +foreach my $c (split(//, $S)) { + $cf{$c}++; + my @c = grep { $_ if $cf{$_} == 1 } keys %cf; + $O .= (scalar @c ? $c[-1] : '#'); +} + +printf "Input: \$S = '%s'\n", $S; +printf "Output: '%s'\n", $O; |
