Removing "reversal duplicates" from a list

APL-related discussions - a stream of APL consciousness.
Not sure where to start a discussion ? Here's the place to be
Forum rules
This forum is for discussing APL-related issues. If you think that the subject is off-topic, then the Chat forum is probably a better place for your thoughts !

Removing "reversal duplicates" from a list

I have a nested numeric vector (though, of course, it could just as easily be a matrix) in which each item and its reversal are present; I wish to eliminate one of each of these paired items. The best (only) solution I have come up with is repeated application, using power, of
{1⌽⍵~⊂⌽⊃⍵}. Any suggestions?

Thanks,

Nicholas
nicholas.small

Posts: 21
Joined: Tue Mar 30, 2021 8:45 pm

Re: Removing "reversal duplicates" from a list

Hi,
if I understood you right, you have nested vector of vectors, something like
`      ⍪vec←{⍵[?⍨≢⍵]}↑,/10{{⍵(⌽⍵)}(??⊢)⍺}¨⍳5 10 3 6 9              9 3 6 10 4 1 7        10 8 3 7 6 5 1 9 4 2  7 1 4 10 6 3 9        1 8 10 6 2 9 4 3      3 4 9 2 6 10 8 1      2 4 9 1 5 6 7 3 8 10  1 6 8 3 2 10          10 2 3 8 6 1          9 6 3 10`

..and you want to remove one of the pairs (I suppose that there are no equal items when sorted), so I'd suggest something like (version 18.0 - if earlier, replace the leading ≠ with {(⍵⍳⍵)=⍳⍴⍵}):
`      ≠((⊂⍋)⌷⊢)¨vec1 1 1 0 1 0 0 1 0 0`

-Veli-Matti
Veli-Matti

Posts: 91
Joined: Sat Nov 28, 2009 3:12 pm

Re: Removing "reversal duplicates" from a list

Veli-Matti,
Each of the items in my nested array is an arrangement of the digits 2/⍳n. In the case of n=7, there are 380; here are the first 8, together with their reversals:

1 4 1 5 6 7 4 2 3 5 2 6 3 7
1 4 1 6 7 3 4 5 2 3 6 2 7 5
1 5 1 4 6 7 3 5 4 2 3 6 2 7
1 5 1 4 7 3 6 2 4 3 2 5 7 6
1 5 1 6 3 7 2 4 3 2 6 5 4 7
1 5 1 6 3 7 4 5 3 2 6 4 2 7
1 5 1 6 4 7 3 5 2 4 3 2 6 7
1 5 1 6 7 2 4 5 2 3 6 4 7 3
7 3 6 2 5 3 2 4 7 6 5 1 4 1
5 7 2 6 3 2 5 4 3 7 6 1 4 1
7 2 6 3 2 4 5 3 7 6 4 1 5 1
6 7 5 2 3 4 2 6 3 7 4 1 5 1
7 4 5 6 2 3 4 2 7 3 6 1 5 1
7 2 4 6 2 3 5 4 7 3 6 1 5 1
7 6 2 3 4 2 5 3 7 4 6 1 5 1
3 7 4 6 3 2 5 4 2 7 6 1 5 1

The object is to eliminate either the first half or the second half of these rows/items.

Thank you for your suggestion - I knew there was a primitive corresponding to nub but could not remember what it was and I must refresh my knowledge of function trains. However, you can see that it solves a different problem.

The data arose in connection with an obscure problem concerned with change ringing on handbells. You might like to see if you can spot how the numbers are constrained (clue: add 0 0 at the start of each of the 16 rows).

Nicholas
nicholas.small

Posts: 21
Joined: Tue Mar 30, 2021 8:45 pm

Re: Removing "reversal duplicates" from a list

OK, now I see it (vaguely).
Usually knowing the data helps a little bit :)

There might be some raw force approaches available (i.e. trad fns) - the best I can imagine now is something like:
`      z←clean x;b;i :For i :In ⍳≢b←1⊣¨x←(≠x)/x     :If ~i⊃b ⋄ :Continue ⋄ :End     b←b\(b/x)≢¨⊂⌽i⊃x :EndFor z←b/x`

But perhaps if you _know_ that all the items are reversed (and there are no duplicates), you could take the first value from each item, and proceed with that (e.g. if you sort the firsts and see that half of them are smaller than the others).

-Veli-Matti
Veli-Matti

Posts: 91
Joined: Sat Nov 28, 2009 3:12 pm

Re: Removing "reversal duplicates" from a list

That certainly does the job, incidentally selecting the same items as my function.

Thanks,

Nicholas
nicholas.small

Posts: 21
Joined: Tue Mar 30, 2021 8:45 pm

Re: Removing "reversal duplicates" from a list

I've thought of a more accessable was of describing the puzzle which gave rise to this thread. I shall post it in Chat.

Nicholas
nicholas.small

Posts: 21
Joined: Tue Mar 30, 2021 8:45 pm