diff options
| author | Francis Whittle <FJ.Whittle@gmail.com> | 2019-05-26 19:02:41 +1000 |
|---|---|---|
| committer | Francis Whittle <FJ.Whittle@gmail.com> | 2019-05-26 19:02:41 +1000 |
| commit | 99e98cec79114e66c141e5b1b0ad76aad8c9d096 (patch) | |
| tree | 6d53b747f34e21183d6a4d328c4a542af78b6030 /challenge-009 | |
| parent | 9a0aff0c8ac061cb4a90fdd01f74db4ef834215c (diff) | |
| download | perlweeklychallenge-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.p6 | 9 | ||||
| -rw-r--r-- | challenge-009/fjwhittle/perl6/ch-2.p6 | 78 |
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; |
