I’ve been doing the Weekly
Challenges. The
latest
involved splitting strings and sorting rows. (Note that this ends
today.)
Task 1: Split Strings
You are given an array of strings and a character separator.
Write a script to return all words separated by the given character
excluding empty string.
For everything except Perl and Raku, this is trivial—there's a
split
-like operator that breaks on substrings. (All right, except in
Lua and PostScript, where they're easy to write and I've already done
so.)
Perl and Raku insist on breaking on regexps, so the separator has to
be escaped.
PostScript:
/splitstrings {
0 dict begin
/sep exch def
[ exch
{
sep strsplit
aload pop
} forall
]
end
} bind def
Raku:
sub splitstrings(@a, $ssep) {
my @p;
my $sep = $ssep;
$sep ~~ s:g/(<[^A..Z0..9]>)/\\$1/;
for @a -> $s {
@p.append($s.split($sep).grep(/./));
}
return @p;
}
Task 2: Weakest Rows
You are given an m × n binary matrix i.e. only 0 and 1 where 1 always appear before 0.
A row i is weaker than a row j if one of the following is true: a) The number of 1s in row i is less than the number of 1s in row j. b) Both rows have the same number of 1 and i < j.
Write a script to return the order of rows from weakest to strongest.
Checking the sortedness of the row seemed like more work than simply
summing it to determine a proxy value for strength. Then it's just a
matter of sorting the row numbers based on that proxy value. (Stably.)
Perl:
sub weakestrows($aa) {
my @p = (0 .. $#{$aa});
my @bb = map {sum(@{$_})} @{$aa};
@p = sort {$bb[$a] <=> $bb[$b]} @p;
return \@p;
}
Full code on
github.
Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.