On Wednesday, 20 July 2022 at 20:47:28 UTC, ag0aep6g wrote:

(Aside: You don't need that many backticks to mark code fragments.)

Thought I was following the instructions but it looks like I got a bit carried away. lol.

You've got a bug there. This should pass, but fails with your version:

    assert(!isRectangular([[1, 2], [], [3, 4]]));

Once `result` becomes false, you cannot let it switch to true again.

Yeah, I noticed that. I actually fixed it at one point but since I was having problems scaling whole thing beyond 2D, I thought I got it wrong.

As for generalizing the function, instead of comparing the lengths of the elements, you want to compare their "shapes". The shape of a `Foo[] a1;` is `[a1.length]`. The shape of a rectangular `Foo[][] a2;` is `[a2.length, a2[0].length]`. And so on.

[...]

Thank you so much. That was super helpful.


I'm sure the function can be improved further, but I'm not going to get into that.

For task 3, I can visit each element of the array, but I have no idea how to compose the flattened (1D) version:

You've got the right idea there with `flatten` calling itself on each element. You only need to apply that idea when getting the element type, too (and actually append the result of the recursive call to `result`):

        import std.range.primitives: ElementType;
        template FlatElementType(A) if (isArray!A)
        {
            alias E = ElementType!A;
            static if (isArray!E)
            {
                alias FlatElementType = FlatElementType!E;
            }
            else
            {
                alias FlatElementType = E;
            }
        }

This is pure gold. Thank you.

                    result ~= flatten(i);

Wow. That simple. I actually printed out the contents of result and saw the entire thing got was flattened during the recursion, but for the life of me I couldn't figure out why the final output always be empty.


[...]
As for task 3, while I understand the concept of transposing a matrix, I'm not sure how to even begin.

I'm gonna leave that one for someone else.

Thanks again. I really appreciate the assistance.

--anonymouse

Reply via email to