Hi everyone, and happy new year!
I'm an almost complete newbie to Perl6 and I'm not that good at Perl5
either, but I thought playing with these problems could be fun, so I
tried to solve #28.
My solution is attached, it seems to work, but I'd like to know from
people more expert than me if there could be a better solution.
The first part seems reasonable, the second could probably be a one-liner.
Probably I could replace usage of hash+for with gather/take and nested
lists, but I don't think this makes the solution cleaner.
Thanks in advance for any suggestion.
use v6-alpha;
use Test;
plan 2;
# P28 (**) Sorting a list of lists according to length of sublists
#
# a) We suppose that a list contains elements that are lists themselves. The
# objective is to sort the elements of this list according to their length. E.g.
# short lists first, longer lists later, or vice versa.
#
# Example:
# * (lsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o)))
# ((O) (D E) (D E) (M N) (A B C) (F G H) (I J K L))
#
# b) Again, we suppose that a list contains elements that are lists themselves.
# But this time the objective is to sort the elements of this list according to
# their length frequency; i.e., in the default, where sorting is done
# ascendingly, lists with rare lengths are placed first, others with a more
# frequent length come later.
#
# Example:
# * (lfsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o)))
# ((i j k l) (o) (a b c) (f g h) (d e) (d e) (m n))
#
# Note that in the above example, the first two lists in the result have length
4
# and 1, both lengths appear just once. The third and forth list have length 3
# which appears twice (there are two list of this length). And finally, the last
# three lists have length 2. This is the most frequent length.
#
# Arithmetic
my @input= [<a b c>],[<d e>],[<f g h>],[<d e>],[<i j k l>],[<m n>],[<o>];
my @expected= [<o>],[<d e>],[<d e>],[<m n>],[<a b c>],[<f g h>],[<i j k l>];
# we could use
# sort: {+$_}
# but pugs seem to not support this yet
my @[EMAIL PROTECTED]: {+$^a <=> +$^b};
is @expected,
@sorted,
"We should be able to sort a list of lists according to length of sublists";
# the list is not the same as in the sample text, when two lists have the
# same frequency of length the ordering is unspecified, so this should be ok
@expected= [<o>],[<i j k l>],[<a b c>],[<f g h>],[<d e>],[<d e>],[<m n>];
# group lists by length
my %grouped;
for (@input) {%grouped{+$_}.push($_)}
# now sort the values by frequency, again can't use
# sort: {+$_}
@sorted= %grouped.values.sort: {+$^a <=> +$^b};
is @expected,@sorted, "..or according to frequency of length of sublists"