aboutsummaryrefslogtreecommitdiff
path: root/challenge-009
diff options
context:
space:
mode:
authorFrancis Whittle <FJ.Whittle@gmail.com>2019-05-26 19:02:41 +1000
committerFrancis Whittle <FJ.Whittle@gmail.com>2019-05-26 19:02:41 +1000
commit99e98cec79114e66c141e5b1b0ad76aad8c9d096 (patch)
tree6d53b747f34e21183d6a4d328c4a542af78b6030 /challenge-009
parent9a0aff0c8ac061cb4a90fdd01f74db4ef834215c (diff)
downloadperlweeklychallenge-club-99e98cec79114e66c141e5b1b0ad76aad8c9d096.tar.gz
perlweeklychallenge-club-99e98cec79114e66c141e5b1b0ad76aad8c9d096.tar.bz2
perlweeklychallenge-club-99e98cec79114e66c141e5b1b0ad76aad8c9d096.zip
fjwhittle challenge 009 solutions
Diffstat (limited to 'challenge-009')
-rw-r--r--challenge-009/fjwhittle/perl6/ch-1.p69
-rw-r--r--challenge-009/fjwhittle/perl6/ch-2.p678
2 files changed, 87 insertions, 0 deletions
diff --git a/challenge-009/fjwhittle/perl6/ch-1.p6 b/challenge-009/fjwhittle/perl6/ch-1.p6
new file mode 100644
index 0000000000..05dd562c16
--- /dev/null
+++ b/challenge-009/fjwhittle/perl6/ch-1.p6
@@ -0,0 +1,9 @@
+#!/usr/bin/env perl6
+
+#| Find the first square number with at least <digits> unique digits
+unit sub MAIN(
+ #| Number of digits, in the range 1..10 (default 5)
+ Int $digits where 1..10 = 5
+);
+
+(^∞).map(* ** 2).grep(*.comb.Bag.elems >= $digits)[0].put;
diff --git a/challenge-009/fjwhittle/perl6/ch-2.p6 b/challenge-009/fjwhittle/perl6/ch-2.p6
new file mode 100644
index 0000000000..311d636d76
--- /dev/null
+++ b/challenge-009/fjwhittle/perl6/ch-2.p6
@@ -0,0 +1,78 @@
+#!/usr/bin/env perl6
+
+# Each of the ranking functions assumes a List of Pairs with scores as values,
+# and outputs the ranked scores as a sorted list of pairs.
+
+# Sample data according to these assumptions. Roll a d10 for score.
+
+my %scores = <Andrea Charis Coleman Denita Gale Georgina Glinda Isidra Jolyn
+ Kori Lenore Marcia Micha Mose Myriam Rachele Reginald Romona
+ Rosita Shoshana> Z=> (1...10).roll(*);
+
+enum RankMode <rank-standard rank-modified rank-dense>;
+
+my proto rank($, RankMode, &?) { * }
+
+# 1224 style ranking.
+my multi rank(@scores where { $_».?value.all ~~ Int },
+ rank-standard,
+ &ranking = {$^b.key <=> $^a.key}) {
+ my $n = 1; # Start at 1 for first rank
+ my @out;
+
+ # Convert Name => Score Pairs to a hash of lists of names, keyed by score, and
+ # append to output array.
+ for Hash.new.append(@scores.invert).pairs.sort(&ranking) {
+ # Invert the Pair again to append a list of (rank => (name => score));
+ @out.append: .invert.map({$n => $_ });
+ $n += .value.elems; # Increase rank only after appending values.
+ };
+
+ @out;
+}
+
+# 1334 style ranking
+my multi rank(@scores where { $_».?value.all ~~ Int },
+ rank-modified,
+ &ranking = {$^b.key <=> $^a.key}) {
+ my $n = 0; # Start at zero as we add the rank before appending
+ my @out;
+
+ # Convert Name => Score Pairs as above.
+ for Hash.new.append(@scores.invert).pairs.sort(&ranking) {
+ $n += .value.elems; # Increase rank before appending values.
+ @out.append: .invert.map({$n => $_ });
+ };
+
+ @out;
+}
+
+# 1223 style ranking
+my multi rank(@scores where { $_».?value.all ~~ Int },
+ rank-dense,
+ &ranking = {$^b.key <=> $^a.key}) {
+ my $n = 1; # Start at 1 for first rank
+ my @out;
+
+ # Convert Name => Score Pairs as above.
+ for Hash.new.append(@scores.invert).pairs.sort(&ranking) {
+ @out.append: .invert.map({$n => $_ });
+ $n++; # Invert rank after appending values, but only by one.
+ };
+
+ @out;
+}
+
+# Dispatch for a Hash.
+my multi rank(%scores, RankMode $mode, &ranking = {$^b.key <=> $^a.key}) {
+ rank(%scores.pairs, $mode, &ranking);
+}
+
+say 'Standard:';
+rank(%scores, rank-standard)».say;
+
+say 'Modified:';
+rank(%scores, rank-modified)».say;
+
+say 'Dense:';
+rank(%scores, rank-dense)».say;