aboutsummaryrefslogtreecommitdiff
path: root/challenge-074
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-08-23 09:42:36 +0100
committerGitHub <noreply@github.com>2020-08-23 09:42:36 +0100
commitb7167b62c197549767374702977313cbca6f897d (patch)
treebc95c5c803cb0488f48d45ce87b76ada0806f3f9 /challenge-074
parent4aea60ac324f2bd49497d3cbf81bcf41cfba3dd3 (diff)
parent421c43c0346eeeaf994cba0481e66773b432a098 (diff)
downloadperlweeklychallenge-club-b7167b62c197549767374702977313cbca6f897d.tar.gz
perlweeklychallenge-club-b7167b62c197549767374702977313cbca6f897d.tar.bz2
perlweeklychallenge-club-b7167b62c197549767374702977313cbca6f897d.zip
Merge pull request #2124 from E7-87-83/master
Cheok Yin's submission for challenge #074
Diffstat (limited to 'challenge-074')
-rw-r--r--challenge-074/cheok-yin-fung/perl/ch-1.pl49
-rw-r--r--challenge-074/cheok-yin-fung/perl/ch-2.pl48
2 files changed, 97 insertions, 0 deletions
diff --git a/challenge-074/cheok-yin-fung/perl/ch-1.pl b/challenge-074/cheok-yin-fung/perl/ch-1.pl
new file mode 100644
index 0000000000..0b67899143
--- /dev/null
+++ b/challenge-074/cheok-yin-fung/perl/ch-1.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/perl
+# ref:
+# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm
+# Perl Weekly Challenge #074 Task 1 Majority Element
+# task statement:
+# Write a script to find the majority element.
+# If none found then print -1.
+# Usage: ch-1.pl [ARRAY]
+use strict;
+use warnings;
+#use Test::More tests => 3;
+
+
+sub verify {
+ my @array = @{$_[0]};
+ my $m = $_[1];
+ my $c = 0;
+ for (@array) {
+ $c++ if $m==$_;
+ }
+ return ($c > (scalar @array)/2.0 ? 1 : undef);
+}
+
+sub bm_majority_vote_alg {
+ my @array = @{$_[0]};
+ my $i = 0;
+ my $m;
+ for (@array) {
+ if ($i == 0) {
+ $m = $_;
+ $i++
+ }
+ else {
+ $m == $_ ? $i++ : $i--;
+ }
+ }
+
+
+ return ( verify(\@array, $m) ? $m : -1 );
+}
+
+
+print bm_majority_vote_alg(\@ARGV);
+
+=pod
+is_deeply( bm_majority_vote_alg( [1, 2, 2, 3, 2, 4, 2] ) , "2", "example1 provided");
+is_deeply( bm_majority_vote_alg( [1, 3, 1, 2, 4, 5] ) , "-1", "example2 provided");
+is_deeply( bm_majority_vote_alg( [2, 2, 2, 3, 1, 3, 4] ) , "-1", "array: 2223134");
+=cut
diff --git a/challenge-074/cheok-yin-fung/perl/ch-2.pl b/challenge-074/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..bae04b73b3
--- /dev/null
+++ b/challenge-074/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+# Perl Weekly Challenge #074 Task 2 FNR character
+# task statement:
+# You are given a string $S.
+# Write a script to print the series of
+# first non-repeating character
+# (left -> right) for the given string.
+# Print # if none found.
+# Usage: ch-2.pl [string]
+
+use strict;
+use warnings;
+#use Test::More tests => 5;
+
+sub fnr {
+ my @uniquestack;
+ my %charcount;
+ my $ans = "";
+ my @characters = split //, $_[0];
+ for my $char (@characters) {
+ if (!exists $charcount{$char} ) {
+ push @uniquestack , $char;
+ $charcount{$char} = 1;
+ $ans .= $char;
+ }
+ else {
+ $charcount{$char}++;
+ @uniquestack = grep { $charcount{$_} == 1 } @uniquestack;
+ $ans .= (scalar @uniquestack != 0) ? $uniquestack[-1] : "#";
+ }
+ }
+ return $ans;
+
+}
+
+print fnr("$ARGV[0]");
+
+=pod
+is_deeply( fnr("ababc") , "abb#c", "example1 provided");
+is_deeply( fnr("xyzzyx") , "xyzyx#", "example2 provided");
+is_deeply( fnr("abcdef") , "abcdef", "trival");
+is_deeply( fnr("aaabbb") , "a##b##", "repeats");
+is_deeply( fnr(
+ "thequickbrownfoxjumpsoverthelazydog") ,
+ "thequickbrownffxjjmpssvvvvvvlazyddg",
+ "long sentence"
+);
+=cut