diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-08-23 09:42:36 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-23 09:42:36 +0100 |
| commit | b7167b62c197549767374702977313cbca6f897d (patch) | |
| tree | bc95c5c803cb0488f48d45ce87b76ada0806f3f9 /challenge-074 | |
| parent | 4aea60ac324f2bd49497d3cbf81bcf41cfba3dd3 (diff) | |
| parent | 421c43c0346eeeaf994cba0481e66773b432a098 (diff) | |
| download | perlweeklychallenge-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.pl | 49 | ||||
| -rw-r--r-- | challenge-074/cheok-yin-fung/perl/ch-2.pl | 48 |
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 |
