aboutsummaryrefslogtreecommitdiff
path: root/challenge-009
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-05-26 13:40:14 +0100
committerGitHub <noreply@github.com>2019-05-26 13:40:14 +0100
commit55dc9baa3803a52bd48c2c3c44f22dd54b0dc71d (patch)
treea868c624ca8164666d7c8234d8dff8f7baffa49f /challenge-009
parent44030a4f054d853cdf3a93639de369c843088774 (diff)
parent3d00d93e9983447d2e198ceb44fdc9855b74618c (diff)
downloadperlweeklychallenge-club-55dc9baa3803a52bd48c2c3c44f22dd54b0dc71d.tar.gz
perlweeklychallenge-club-55dc9baa3803a52bd48c2c3c44f22dd54b0dc71d.tar.bz2
perlweeklychallenge-club-55dc9baa3803a52bd48c2c3c44f22dd54b0dc71d.zip
Merge pull request #179 from fjwhittle/master
Presenting Challenge 009 solutions by fjwhittle!
Diffstat (limited to 'challenge-009')
-rw-r--r--challenge-009/fjwhittle/blog.txt1
-rw-r--r--challenge-009/fjwhittle/perl6/ch-1.p69
-rw-r--r--challenge-009/fjwhittle/perl6/ch-2.p678
3 files changed, 88 insertions, 0 deletions
diff --git a/challenge-009/fjwhittle/blog.txt b/challenge-009/fjwhittle/blog.txt
new file mode 100644
index 0000000000..b1f2dea632
--- /dev/null
+++ b/challenge-009/fjwhittle/blog.txt
@@ -0,0 +1 @@
+https://rage.powered.ninja/2019/05/26/unique-square-and-rank.html
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;