I’ve been doing the Weekly
Challenges. The
latest
involved differentiating lists and processing matrices. (Note that
this ends today.)
Task 1: Missing Members
You are given two arrays of integers.
Write a script to find out the missing members in each other arrays.
I.e. return [[members of A not in B], [members of B not in A]].
If I'm doing the same thing twice, I usually try to segment it off
somewhere. So let's do half the problem, based on a list and a set of
entries (here in Perl):
sub halfmissing($a, $bh) {
return [uniq grep {!exists $bh->{$_}} @{$a}];
}
The function "return only the distinct elements in this list" is the
sort of thing I'd normally do by flipping them into a set and back
(and if we had no repeats it could be a set intersection), but in this
case we do have repeats and the implication of the examples is that
the returns should be in the original order. Most of the languages I'm
using have something like "distinct" or "unique" that'll do this,
though in a few cases I ended up writing one.
Then I calculate the sets in advance.
sub missingmembers($a, $b) {
my $ah = {map {$_ => 1} @{$a}};
my $bh = {map {$_ => 1} @{$b}};
return [
halfmissing($a, $bh),
halfmissing($b, $ah),
];
}
(I'm not sure now why I didn't do this set conversion in the
halfmissing
function, except that I was probably considering
extending it to an N-array version.)
Task 2: Flip Matrix
You are given n x n binary matrix.
Write a script to flip the given matrix as below.
Which turns out to be: 0 turns to 1, 1 turns to 0,and each row is
reversed.
I think this is most cleanly done in a functional style, here in Ruby:
def flipmatrix(a)
return a.collect{|r| r.collect{|m| 1-m}.reverse}
end
or Kotlin:
fun flipmatrix(a: List<List<Int>>): List<List<Int>> {
return a.map{row -> row.map{1 - it}.reversed()}
}
or (my extended) PostScript:
/flipmatrix {
{
{
1 exch sub
} map
reverse
} map
} bind def
Where I had to deviate from that pattern, it tended to be because the
language only provided a reverse-in-place function rather than one
that would return a reversed copy of the input—or in the case of Lua
no reversing function at all.
function flipmatrix(a)
local b = {}
for _, row in ipairs(a) do
local r2 = {}
for _b, v in ipairs(row) do
table.insert(r2, 1, 1 - v)
end
table.insert(b, r2)
end
return b
end
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.