diff options
22 files changed, 1799 insertions, 1232 deletions
diff --git a/challenge-074/mohammad-anwar/perl/ch-1.pl b/challenge-074/mohammad-anwar/perl/ch-1.pl new file mode 100755 index 0000000000..470ad84154 --- /dev/null +++ b/challenge-074/mohammad-anwar/perl/ch-1.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl + +# +# Perl Weekly Challenge - 074 +# +# Task #1: Majority Element +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +use strict; +use warnings; +use POSIX qw(floor); + +print find_majority_element(prepare_list($ARGV[0])), "\n"; + +# +# +# METHODS + +sub find_majority_element { + my ($list) = @_; + + die "ERROR: Missing list.\n" unless defined $list; + die "ERROR: Invalid list [$list].\n" unless (ref($list) eq 'ARRAY'); + + print "List: ", join(", ", @$list), "\n"; + my $mid_point = floor(($#$list + 1) / 2); + my %elements = (); + $elements{$_}++ foreach (@$list); + + my $top = (sort { $elements{$b} <=> $elements{$a} } + keys %elements)[0]; + + ($elements{$top} >= $mid_point) + ? + (return $top) + : + (return -1); +} + +sub prepare_list { + my ($list) = @_; + + if (defined $list) { + $list =~ s/\s//g; + return [ split /\,/, $list ]; + } + else { + return [1, 2, 2, 3, 2, 4, 2]; + } +} diff --git a/challenge-074/mohammad-anwar/perl/ch-1.t b/challenge-074/mohammad-anwar/perl/ch-1.t new file mode 100755 index 0000000000..91a893c3f0 --- /dev/null +++ b/challenge-074/mohammad-anwar/perl/ch-1.t @@ -0,0 +1,49 @@ +#!/usr/bin/perl + +# +# Perl Weekly Challenge - 074 +# +# Task #1: Majority Element +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +package MajorityElement; + +use Moo; +use POSIX qw(floor); + +sub find_majority_element { + my ($self, $list) = @_; + + die "ERROR: Missing list.\n" unless defined $list; + die "ERROR: Invalid list [$list].\n" unless (ref($list) eq 'ARRAY'); + + print "List: ", join(", ", @$list), "\n"; + my $mid_point = floor(($#$list + 1) / 2); + my %elements = (); + $elements{$_}++ foreach (@$list); + + my $top = (sort { $elements{$b} <=> $elements{$a} } + keys %elements)[0]; + + ($elements{$top} >= $mid_point) + ? + (return $top) + : + (return -1); +} + +package main; + +use strict; +use warnings; + +use Test2::V0 -target => 'MajorityElement'; + +can_ok($CLASS, 'find_majority_element'); +isa_ok($CLASS, 'MajorityElement'); +is($CLASS->find_majority_element([1, 2, 2, 3, 2, 4, 2]), 2, 'example 1'); +is($CLASS->find_majority_element([1, 3, 1, 2, 4, 5]), -1, 'example 2'); + +done_testing; diff --git a/challenge-074/mohammad-anwar/perl/ch-2.pl b/challenge-074/mohammad-anwar/perl/ch-2.pl new file mode 100755 index 0000000000..a153afcfe2 --- /dev/null +++ b/challenge-074/mohammad-anwar/perl/ch-2.pl @@ -0,0 +1,44 @@ +#!/usr/bin/perl + +# +# Perl Weekly Challenge - 074 +# +# Task #2: FNR Character +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +use strict; +use warnings; + +my $S = $ARGV[0] || 'ababc'; + +print join "\n", (join ' => ', $S, fnr_character($S)), ''; + +sub fnr_character { + my ($string) = @_; + + my @fnr = (); + foreach my $i (0 .. length($string) - 1) { + my $s = substr($string, 0, $i + 1); + if (length($s) == 1) { + push @fnr, $s; + } + else { + my $found = 0; + my %count = (); + + $count{$_}++ for split //, $s; + foreach (split //, reverse $s) { + if ($count{$_} == 1) { + push @fnr, $_; + $found = 1; + last; + } + } + push @fnr, '#' unless ($found); + } + } + + return join '',@fnr; +} diff --git a/challenge-074/mohammad-anwar/perl/ch-2.t b/challenge-074/mohammad-anwar/perl/ch-2.t new file mode 100755 index 0000000000..8698c20a88 --- /dev/null +++ b/challenge-074/mohammad-anwar/perl/ch-2.t @@ -0,0 +1,55 @@ +#!/usr/bin/perl + +# +# Perl Weekly Challenge - 074 +# +# Task #2: FNR Character +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +package FNRCharacter; + +use Moo; + +sub fnr_character { + my ($self, $string) = @_; + + my @fnr = (); + foreach my $i (0 .. length($string) - 1) { + my $s = substr($string, 0, $i + 1); + if (length($s) == 1) { + push @fnr, $s; + } + else { + my $found = 0; + my %count = (); + + $count{$_}++ for split //, $s; + foreach (split //, reverse $s) { + if ($count{$_} == 1) { + push @fnr, $_; + $found = 1; + last; + } + } + push @fnr, '#' unless ($found); + } + } + + return join '',@fnr; +} + +package main; + +use strict; +use warnings; + +use Test2::V0 -target => 'FNRCharacter'; + +isa_ok($CLASS, 'FNRCharacter'); +can_ok($CLASS, 'fnr_character'); +is($CLASS->fnr_character('ababc'), 'abb#c', 'example 1'); +is($CLASS->fnr_character('xyzzyx'), 'xyzyx#', 'example 2'); + +done_testing; diff --git a/challenge-074/mohammad-anwar/raku/ch-1.raku b/challenge-074/mohammad-anwar/raku/ch-1.raku new file mode 100755 index 0000000000..58fd3d934c --- /dev/null +++ b/challenge-074/mohammad-anwar/raku/ch-1.raku @@ -0,0 +1,36 @@ +#!/usr/bin/env raku + +# +# Perl Weekly Challenge - 074 +# +# Task #1: Majority Element +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +use v6.d; + +sub MAIN(Str :$list = "1, 2, 2, 3, 2, 4, 2") { + find-majority-element($list).say; +} + +# +# +# METHOD + +sub find-majority-element(Str $list is copy) { + + die "ERROR: Invalid list [$list].\n" + unless $list ~~ /^[\s?\-?\d\,?\s?]+$/; + + say "List: $list"; + $list ~~ s:g/\s//; + my $l = [ $list.split(',') ]; + + my $mid_point = floor($l.elems / 2); + my %elements; + $l.map({ %elements{$_}++ }); + my $top = %elements.sort({ $^b.value <=> $^a.value }).head; + + return ($top.value >= $mid_point) ?? ($top.key) !! (-1); +} diff --git a/challenge-074/mohammad-anwar/raku/ch-1.t b/challenge-074/mohammad-anwar/raku/ch-1.t new file mode 100755 index 0000000000..d3db048e2b --- /dev/null +++ b/challenge-074/mohammad-anwar/raku/ch-1.t @@ -0,0 +1,36 @@ +#!/usr/bin/env raku + +# +# Perl Weekly Challenge - 074 +# +# Task #1: Majority Element +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +use Test; + +is find-majority-element("1, 2, 2, 3, 2, 4, 2"), 2, "example 1"; +is find-majority-element("1, 3, 1, 2, 4, 5"), -1, "example 2"; + +done-testing; + +# +# +# METHOD + +sub find-majority-element(Str $list is copy) { + + die "ERROR: Invalid list [$list].\n" + unless $list ~~ /^[\s?\-?\d\,?\s?]+$/; + + $list ~~ s:g/\s//; + my $l = [ $list.split(',') ]; + + my $mid_point = floor($l.elems / 2); + my %elements; + $l.map({ %elements{$_}++ }); + my $top = %elements.sort({ $^b.value <=> $^a.value }).head; + + return ($top.value >= $mid_point) ?? ($top.key) !! (-1); +} diff --git a/challenge-074/mohammad-anwar/raku/ch-2.raku b/challenge-074/mohammad-anwar/raku/ch-2.raku new file mode 100755 index 0000000000..af1df5a39d --- /dev/null +++ b/challenge-074/mohammad-anwar/raku/ch-2.raku @@ -0,0 +1,45 @@ +#!/usr/bin/env raku + +# +# Perl Weekly Challenge - 074 +# +# Task #2: FNR Character +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +use v6.d; + +sub MAIN(Str :$S = 'ababc') { + fnr-character($S).join(' => ').say; +} + +# +# +# METHOD + +sub fnr-character(Str $string) { + + my @fnr = (); + for 0 .. $string.chars - 1 -> $i { + my $s = $string.substr(0, $i + 1); + if $s.chars == 1 { + @fnr.push: $s; + } + else { + my $found = False; + my %count = (); + $s.comb.map({ %count{$_}++ }); + for $s.flip.comb -> $char { + if %count{$char} == 1 { + @fnr.push: $char; + $found = True; + last; + } + } + @fnr.push: '#' unless $found; + } + } + + return @fnr.join(''); +} diff --git a/challenge-074/mohammad-anwar/raku/ch-2.t b/challenge-074/mohammad-anwar/raku/ch-2.t new file mode 100755 index 0000000000..5874ba219d --- /dev/null +++ b/challenge-074/mohammad-anwar/raku/ch-2.t @@ -0,0 +1,46 @@ +#!/usr/bin/env raku + +# +# Perl Weekly Challenge - 074 +# +# Task #2: FNR Character +# +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 +# + +use Test; + +is fnr-character('ababc'), 'abb#c', 'example 1'; +is fnr-character('xyzzyx'), 'xyzyx#', 'example 2'; + +done-testing; + +# +# +# METHOD + +sub fnr-character(Str $string) { + + my @fnr = (); + for 0 .. $string.chars - 1 -> $i { + my $s = $string.substr(0, $i + 1); + if $s.chars == 1 { + @fnr.push: $s; + } + else { + my $found = False; + my %count = (); + $s.comb.map({ %count{$_}++ }); + for $s.flip.comb -> $char { + if %count{$char} == 1 { + @fnr.push: $char; + $found = True; + last; + } + } + @fnr.push: '#' unless $found; + } + } + + return @fnr.join(''); +} diff --git a/challenge-074/mohammad-anwar/swift/ch-1.swift b/challenge-074/mohammad-anwar/swift/ch-1.swift new file mode 100755 index 0000000000..f3e2f382f3 --- /dev/null +++ b/challenge-074/mohammad-anwar/swift/ch-1.swift @@ -0,0 +1,96 @@ +import Foundation + +/* + +Perl Weekly Challenge - 074 + +Task #1: Majority Element + +https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 + +*/ + +enum ParamError: Error { + case missingList + case invalidList +} + +do { + let paramCount:Int = Int(CommandLine.argc) + + if paramCount <= 1 { + throw ParamError.missingList + } + + let list:String = CommandLine.arguments[1] + + if isValidList(list) { + let array = list.components(separatedBy: ", ") + + if array.count >= 2 { + + let midPoint:Int = Int(floor(Double(array.count) / 2)) + var (topKey, topVal) = findTopElement(array) + + if topVal < midPoint { + topKey = -1 + } + + print("List: \(list)") + print("Majority Element: \(topKey)") + } + } + else { + throw ParamError.invalidList + } +} +catch ParamError.missingList { + print("Missing list.") +} +catch ParamError.invalidList { + print("Invalid list.") +} +catch let error { + print(error) +} + +// +// +// Functions + +func isValidList(_ list:String) -> Bool { + + let pattern = "^[\\-?\\d\\,?\\s?]+$" + let regex = try! NSRegularExpression(pattern: pattern) + let range = NSRange(location: 0, length: list.utf16.count) + + if regex.firstMatch(in: list, options: [], range: range) != nil { + return true + } + else { + return false + } +} + +func findTopElement(_ array:[String]) -> (Int, Int) { + + var dict = [Int: Int]() + for i in 0..<array.count { + let key:Int = Int(array[i])! + if dict.isEmpty { + dict[key] = 1 + } + else { + if dict[key] == nil { + dict[key] = 1 + } + else { + dict[key]! += 1 + } + } + } + + let sortedDict = dict.sorted { $0.1 > $1.1 } + + return (sortedDict[0].key, sortedDict[0].value) +} diff --git a/challenge-074/mohammad-anwar/swift/ch-2.swift b/challenge-074/mohammad-anwar/swift/ch-2.swift new file mode 100755 index 0000000000..946e42b707 --- /dev/null +++ b/challenge-074/mohammad-anwar/swift/ch-2.swift @@ -0,0 +1,89 @@ +import Foundation + +/* + +Perl Weekly Challenge - 074 + +Task #2: FNR Character + +https://perlweeklychallenge.org/blog/perl-weekly-challenge-074 + +*/ + +enum ParamError: Error { + case missingString +} + +do { + let paramCount:Int = Int(CommandLine.argc) + + if paramCount <= 1 { + throw ParamError.missingString + } + + let string:String = CommandLine.arguments[1] + let chars:[Character] = Array(String(string)) + + var fnr = [Character]() + if chars.count >= 2 { + + for i in 0..<chars.count { + let s = String(string.prefix(i+1)) + if s.count == 1 { + fnr.append(Character(s)) + } + else { + var found:Bool = false + let characters = getCharacters(s) + let revChars:[Character] = Array(String(s.reversed())) + + for i in 0..<revChars.count { + if characters[revChars[i]] == 1 { + fnr.append(revChars[i]) + found = true + break + } + } + + if found == false { + fnr.append("#") + } + } + } + + print(chars) + print(fnr) + } +} +catch ParamError.missingString { + print("Missing string.") +} +catch let error { + print(error) +} + +// +// +// Function + +func getCharacters(_ substring:String) -> [Character: Int] { + + let chars:[Character] = Array(String(substring)) + var characters = [Character: Int]() + for i in 0..<chars.count { + let char:Character = chars[i] + if characters.isEmpty { + characters[char] = 1 + } + else { + if characters[char] == nil { + characters[char] = 1 + } + else { + characters[char]! += 1 + } + } + } + + return characters +} diff --git a/stats/pwc-current.json b/stats/pwc-current.json index f4a9dcb806..969887b93c 100644 --- a/stats/pwc-current.json +++ b/stats/pwc-current.json @@ -1,51 +1,42 @@ { - "subtitle" : { - "text" : "[Champions: 1] Last updated at 2020-08-17 04:51:42 GMT" - }, - "legend" : { - "enabled" : 0 - }, - "chart" : { - "type" : "column" - }, "yAxis" : { "title" : { "text" : "Total Solutions" } }, - "xAxis" : { - "type" : "category" - }, - "tooltip" : { - "pointFormat" : "<span style='color:{point.color}'>{point.name}</span>: <b>{point.y:f}</b><br/>", - "followPointer" : 1, - "headerFormat" : "<span style='font-size:11px'>{series.name}</span><br/>" - }, - "title" : { - "text" : "Perl Weekly Challenge - 074" - }, "drilldown" : { "series" : [ { - "id" : "Mark Anderson", "name" : "Mark Anderson", "data" : [ [ "Raku", 1 ] - ] + ], + "id" : "Mark Anderson" + }, + { + "data" : [ + [ + "Perl", + 2 + ], + [ + "Raku", + 2 + ] + ], + "name" : "Mohammad S Anwar", + "id" : "Mohammad S Anwar" } ] }, - "plotOptions" : { - "series" : { - "dataLabels" : { - "format" : "{point.y}", - "enabled" : 1 - }, - "borderWidth" : 0 - } + "chart" : { + "type" : "column" + }, + "xAxis" : { + "type" : "category" }, "series" : [ { @@ -53,11 +44,39 @@ "colorByPoint" : 1, "data" : [ { - "y" : 1, + "drilldown" : "Mark Anderson", "name" : "Mark Anderson", - "drilldown" : "Mark Anderson" + "y" : 1 + }, + { + "name" : "Mohammad S Anwar", + "y" : 4, + "drilldown" : "Mohammad S Anwar" } ] } - ] + ], + "tooltip" : { + "headerFormat" : "<span style='font-size:11px'>{series.name}</span><br/>", + "followPointer" : 1, + "pointFormat" : "<span style='color:{point.color}'>{point.name}</span>: <b>{point.y:f}</b><br/>" + }, + "plotOptions" : { + "series" : { + "dataLabels" : { + "enabled" : 1, + "format" : "{point.y}" + }, + "borderWidth" : 0 + } + }, + "legend" : { + "enabled" : 0 + }, + "title" : { + "text" : "Perl Weekly Challenge - 074" + }, + "subtitle" : { + "text" : "[Champions: 2] Last updated at 2020-08-17 05:05:55 GMT" + } } diff --git a/stats/pwc-language-breakdown-summary.json b/stats/pwc-language-breakdown-summary.json index dd4d554d47..4746afda09 100644 --- a/stats/pwc-language-breakdown-summary.json +++ b/stats/pwc-language-breakdown-summary.json @@ -1,7 +1,31 @@ { + "legend" : { + "enabled" : "false" + }, + "subtitle" : { + "text" : "Last updated at 2020-08-17 05:05:55 GMT" + }, "title" : { "text" : "Perl Weekly Challenge Contributions [2019 - 2020]" }, + "yAxis" : { + "title" : { + "text" : null + }, + "min" : 0 + }, + "chart" : { + "type" : "column" + }, + "xAxis" : { + "labels" : { + "style" : { + "fontSize" : "13px", + "fontFamily" : "Verdana, sans-serif" + } + }, + "type" : "category" + }, "series" : [ { "data" : [ @@ -11,53 +35,29 @@ ], [ "Perl", - 3042 + 3044 ], [ "Raku", - 1982 + 1984 ] ], + "name" : "Contributions", "dataLabels" : { - "y" : 10, + "align" : "right", + "format" : "{point.y:.0f}", + "color" : "#FFFFFF", "style" : { "fontSize" : "13px", "fontFamily" : "Verdana, sans-serif" }, - "align" : "right", - "format" : "{point.y:.0f}", "rotation" : -90, "enabled" : "true", - "color" : "#FFFFFF" - }, - "name" : "Contributions" - } - ], - "xAxis" : { - "type" : "category", - "labels" : { - "style" : { - "fontSize" : "13px", - "fontFamily" : "Verdana, sans-serif" + "y" : 10 } } - }, + ], "tooltip" : { "pointFormat" : "<b>{point.y:.0f}</b>" - }, - "legend" : { - "enabled" : "false" - }, - "subtitle" : { - "text" : "Last updated at 2020-08-17 04:51:42 GMT" - }, - "chart" : { - "type" : "column" - }, - "yAxis" : { - "title" : { - "text" : null - }, - "min" : 0 } } diff --git a/stats/pwc-language-breakdown.json b/stats/pwc-language-breakdown.json index 5128a2dd0e..406de8fccd 100644 --- a/stats/pwc-language-breakdown.json +++ b/stats/pwc-language-breakdown.json @@ -2,13 +2,393 @@ "xAxis" : { "type" : "category" }, + "series" : [ + { + "colorByPoint" : "true", + "data" : [ + { + "drilldown" : "001", + "y" : 142, + "name" : "#001" + }, + { + "drilldown" : "002", + "name" : "#002", + "y" : 109 + }, + { + "name" : "#003", + "y" : 71, + "drilldown" : "003" + }, + { + "name" : "#004", + "y" : 91, + "drilldown" : "004" + }, + { + "name" : "#005", + "y" : 72, + "drilldown" : "005" + }, + { + "drilldown" : "006", + "name" : "#006", + "y" : 52 + }, + { + "y" : 59, + "name" : "#007", + "drilldown" : "007" + }, + { + "drilldown" : "008", + "name" : "#008", + "y" : 72 + }, + { + "y" : 68, + "name" : "#009", + "drilldown" : "009" + }, + { + "name" : "#010", + "y" : 60, + "drilldown" : "010" + }, + { + "y" : 79, + "name" : "#011", + "drilldown" : "011" + }, + { + "drilldown" : "012", + "y" : 83, + "name" : "#012" + }, + { + "name" : "#013", + "y" : 76, + "drilldown" : "013" + }, + { + "drilldown" : "014", + "y" : 96, + "name" : "#014" + }, + { + "drilldown" : "015", + "name" : "#015", + "y" : 93 + }, + { + "name" : "#016", + "y" : 66, + "drilldown" : "016" + }, + { + "drilldown" : "017", + "y" : 79, + "name" : "#017" + }, + { + "drilldown" : "018", + "name" : "#018", + "y" : 76 + }, + { + "drilldown" : "019", + "name" : "#019", + "y" : 97 + }, + { + "drilldown" : "020", + "y" : 95, + "name" : "#020" + }, + { + "drilldown" : "021", + "name" : "#021", + "y" : 67 + }, + { + "y" : 63, + "name" : "#022", + "drilldown" : "022" + }, + { + "drilldown" : "023", + "y" : 91, + "name" : "#023" + }, + { + "name" : "#024", + "y" : 70, + "drilldown" : "024" + }, + { + "name" : "#025", + "y" : 55, + "drilldown" : "025" + }, + { + "y" : 70, + "name" : "#026", + "drilldown" : "026" + }, + { + "drilldown" : "027", + "name" : "#027", + "y" : 58 + }, + { + "drilldown" : "028", + "name" : "#028", + "y" : 78 + }, + { + "drilldown" : "029", + "y" : 77, + "name" : "#029" + }, + { + "drilldown" : "030", + "name" : "#030", + "y" : 115 + }, + { + "drilldown" : "031", + "y" : 87, + "name" : "#031" + }, + { + "name" : "#032", + "y" : 92, + "drilldown" : "032" + }, + { + "drilldown" : "033", + "y" : 108, + "name" : "#033" + }, + { + "name" : "#034", + "y" : 62, + "drilldown" : "034" + }, + { + "drilldown" : "035", + "name" : "#035", + "y" : 62 + }, + { + "name" : "#036", + "y" : 66, + "drilldown" : "036" + }, + { + "y" : 65, + "name" : "#037", + "drilldown" : "037" + }, + { + "drilldown" : "038", + "name" : "#038", + "y" : 65 + }, + { + "drilldown" : "039", + "name" : "#039", + "y" : 60 + }, + { + "drilldown" : "040", + "name" : "#040", + "y" : 71 + }, + { + "drilldown" : "041", + "name" : "#041", + "y" : 74 + }, + { + "drilldown" : "042", + "y" : 88, + "name" : "#042" + }, + { + "drilldown" : "043", + "name" : "#043", + "y" : 66 + }, + { + "drilldown" : "044", + "y" : 82, + "name" : "#044" + }, + { + "name" : "#045", + "y" : 94, + "drilldown" : "045" + }, + { + "drilldown" : "046", + "y" : 85, + "name" : "#046" + }, + { + "name" : "#047", + "y" : 82, + "drilldown" : "047" + }, + { + "drilldown" : "048", + "name" : "#048", + "y" : 106 + }, + { + "drilldown" : "049", + "name" : "#049", + "y" : 85 + }, + { + "drilldown" : "050", + "name" : "#050", + " |
