From 315bbc80a049f04530698fd94f9baaa7e70a4f63 Mon Sep 17 00:00:00 2001 From: "Jaldhar H. Vyas" Date: Mon, 27 May 2019 02:09:48 -0400 Subject: Challenge 9 by Jaldhar H. Vyas --- challenge-009/jaldhar-h-vyas/perl5/ch-1.pl | 16 +++++ challenge-009/jaldhar-h-vyas/perl5/ch-2.pl | 110 +++++++++++++++++++++++++++++ challenge-009/jaldhar-h-vyas/perl6/ch-1.p6 | 15 ++++ challenge-009/jaldhar-h-vyas/perl6/ch-2.p6 | 81 +++++++++++++++++++++ 4 files changed, 222 insertions(+) create mode 100755 challenge-009/jaldhar-h-vyas/perl5/ch-1.pl create mode 100755 challenge-009/jaldhar-h-vyas/perl5/ch-2.pl create mode 100755 challenge-009/jaldhar-h-vyas/perl6/ch-1.p6 create mode 100755 challenge-009/jaldhar-h-vyas/perl6/ch-2.p6 diff --git a/challenge-009/jaldhar-h-vyas/perl5/ch-1.pl b/challenge-009/jaldhar-h-vyas/perl5/ch-1.pl new file mode 100755 index 0000000000..0140ac3e32 --- /dev/null +++ b/challenge-009/jaldhar-h-vyas/perl5/ch-1.pl @@ -0,0 +1,16 @@ +#!/usr/bin/perl +use warnings; +use strict; +use 5.010; + +my $n = 100; # first number with a 5-digit square +while(1) { + my $nsquared = $n * $n; + my %digits; + map { $digits{$_} = 1; } (split //, $nsquared); + if (scalar keys %digits == 5) { + say "$nsquared ($n * $n)"; + last; + } + $n++; +}; diff --git a/challenge-009/jaldhar-h-vyas/perl5/ch-2.pl b/challenge-009/jaldhar-h-vyas/perl5/ch-2.pl new file mode 100755 index 0000000000..5096c30444 --- /dev/null +++ b/challenge-009/jaldhar-h-vyas/perl5/ch-2.pl @@ -0,0 +1,110 @@ +#!/usr/bin/perl +use warnings; +use strict; +use 5.010; +use experimental 'smartmatch'; +no warnings 'experimental::smartmatch'; + +sub usage { + print <<"-USAGE-"; + Usage: + $0 -d + $0 -m + $0 -s + + -d dense ranking + -m modified ranking + -s standard ranking + a list of items to rank +-USAGE- + exit(1); +} + +sub group { + my ($items) = @_; + my %groups; + my $rank = 1; + my $current = $items->[0]; + + for my $item (@{$items}) { + if ($item !~ $current) { + $rank++; + $current = $item; + } + push @{$groups{$rank}}, $item; + } + + return \%groups; +} + +sub denseRank { + my ($groups) = @_; + + my @results; + for my $rank (sort keys %{$groups}) { + for my $item (@{$groups->{$rank}}) { + push @results, [ $rank, $item]; + } + } + + return \@results; +} + +sub modifiedRank { + my ($groups) = @_; + + my @results; + my $total = 0; + for my $rank (sort keys %{$groups}) { + $total += scalar @{$groups->{$rank}}; + for my $item (@{$groups->{$rank}}) { + push @results, [ $total, $item ]; + } + } + + return \@results; +} + +sub standardRank { + my ($groups) = @_; + + my @results; + my $total = 1; + for my $rank (sort keys %{$groups}) { + for my $item (@{$groups->{$rank}}) { + push @results, [ $total, $item ]; + } + $total += scalar @{$groups->{$rank}}; + } + + return \@results; +} + +sub display { + my ($results) = @_; + + for my $result (@{$results}) { + say "$result->[0] -> $result->[1]"; + } +} + +if (scalar @ARGV < 2) { + usage(); +} + +my $opt = shift @ARGV; +my @items = sort @ARGV; + +if ($opt eq '-d') { + display(denseRank(group(\@items))); + +} elsif ($opt eq '-m') { + display(modifiedRank(group(\@items))); + +} elsif ($opt eq '-s') { + display(standardRank(group(\@items))); + +} else { + usage(); +} + diff --git a/challenge-009/jaldhar-h-vyas/perl6/ch-1.p6 b/challenge-009/jaldhar-h-vyas/perl6/ch-1.p6 new file mode 100755 index 0000000000..13f2cdff34 --- /dev/null +++ b/challenge-009/jaldhar-h-vyas/perl6/ch-1.p6 @@ -0,0 +1,15 @@ +#!/usr/bin/perl6 + +sub MAIN() { + my $n = 100; # first number with a 5-digit square + loop { + my $nsquared = $n * $n; + my %digits; + $nsquared.comb.map({ %digits{$_} = True; }); + if (%digits.elems == 5) { + say "$nsquared ($n * $n)"; + last; + } + $n++; + } +} diff --git a/challenge-009/jaldhar-h-vyas/perl6/ch-2.p6 b/challenge-009/jaldhar-h-vyas/perl6/ch-2.p6 new file mode 100755 index 0000000000..6284659f20 --- /dev/null +++ b/challenge-009/jaldhar-h-vyas/perl6/ch-2.p6 @@ -0,0 +1,81 @@ +#!/usr/bin/perl6 + +sub group(@items) { + my %groups; + my $rank = 1; + my $current = @items[0]; + + for @items -> $item { + if $item !~~ $current { + $rank++; + $current = $item; + } + %groups{$rank}.push($item); + } + + return %groups; +} + +sub denseRank(%groups) { + my @results; + for %groups.keys.sort -> $rank { + for %groups{$rank}.list -> $item { + @results.push(Pair.new($rank, $item)); + } + } + + return @results; +} + +sub modifiedRank(%groups) { + my @results; + my $total = 0; + for %groups.keys.sort -> $rank { + $total += %groups{$rank}.elems; + for %groups{$rank}.list -> $item { + @results.push(Pair.new($total, $item )); + } + } + + return @results; +} + +sub standardRank(%groups) { + my @results; + my $total = 1; + for %groups.keys.sort -> $rank { + for %groups{$rank}.list -> $item { + @results.push(Pair.new($total, $item )); + } + $total += %groups{$rank}.elems; + } + + return @results; +} + +sub display(@results) { + for @results -> Pair $result { + say $result.key, ' -> ', $result.value; + } +} + +multi sub MAIN ( + *@items, #= a list of items to rank + Bool :$d! where .so #= dense ranking +) { + @items.sort ==> group() ==> denseRank() ==> display(); +} + +multi sub MAIN ( + *@items, + Bool :$m! where .so #= modified ranking +) { + @items.sort ==> group() ==> modifiedRank() ==> display(); +} + +multi sub MAIN ( + *@items, + Bool :$s! where .so #= standard ranking +) { + @items.sort ==> group() ==> standardRank() ==> display(); +} -- cgit