# RogerBW's Blog

The Weekly Challenge 253: You Are the Weakest String 28 January 2024

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
} 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.