# RogerBW's Blog

The Weekly Challenge 242: One Of Our Matrices Is Missing 12 November 2023

I’ve been doing the Weekly Challenges. The latest involved differentiating lists and processing matrices. (Note that this ends today.)

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

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.