diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-05-26 13:40:14 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-26 13:40:14 +0100 |
| commit | 55dc9baa3803a52bd48c2c3c44f22dd54b0dc71d (patch) | |
| tree | a868c624ca8164666d7c8234d8dff8f7baffa49f /challenge-009 | |
| parent | 44030a4f054d853cdf3a93639de369c843088774 (diff) | |
| parent | 3d00d93e9983447d2e198ceb44fdc9855b74618c (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-009/fjwhittle/perl6/ch-1.p6 | 9 | ||||
| -rw-r--r-- | challenge-009/fjwhittle/perl6/ch-2.p6 | 78 |
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; |
