What you wanted is simply:
(⊂w) is_anagram_of¨ cl
Thank you! I knew I must have been missing it, it should have been so simple!
Send Bug-apl mailing list submissions to
bug-apl@gnu.org
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.gnu.org/mailman/listinfo/bug-apl
or, via email, send a message with subject or body 'help' to
bug-apl-request@gnu.org
You can reach the person managing the list at
bug-apl-owner@gnu.org
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Bug-apl digest..."
Today's Topics:
1. Question on scalar extension of left arg (Russtopia)
2. Re: Question on scalar extension of left arg (Kacper Gutowski)
3. Re: Question on scalar extension of left arg (Russtopia)
----------------------------------------------------------------------
Message: 1
Date: Thu, 29 Jul 2021 22:48:52 -0700
From: Russtopia <rmagee@gmail.com>
To: bug-apl@gnu.org
Subject: Question on scalar extension of left arg
Message-ID:
<CAN4yCu_7un-iaSsheqCJJgdU2MzZGXb4Lnzjs1_xpJC1+W3RKQ@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Hello, I am trying an exercise that finds anagrams of a word from a list of
candidate words.
I am having issues with scalar extension of the left arg, which I thought
should automatically repeat the scalar left arg to match each item in the
right vector arg. It seems to work only if I do the expansion manually
(that is, repeat the left arg explicitly rather than let APL do it).
(If formatting below is not readable, please convert it to a fixed-with
font)
w
> ┌→─────┐
> │listen│
> └──────┘
> cl
> ┌→────────────────────────────────────────────┐
> │┌→──────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
> ││enlists│ │google│ │inlets│ │banana│ │tinsel││
> │└───────┘ └──────┘ └──────┘ └──────┘ └──────┘│
> └∊────────────────────────────────────────────┘
> ⎕cr 'is_anagram_of'
> ┌→──────────────────────────────┐
> ↓r ← word is_anagram_of other │
> │r ← word[⍋word] ≡ other[⍋other]│
> └───────────────────────────────┘
> w is_anagram_of cl
> 0
> w is_anagram_of ¨ cl ⍝ <-- Should this not implicitly expand
> left arg?
> DOMAIN ERROR
> is_anagram_of[1] r←word[⍋word]≡other[⍋other]
> ^ ^
> w w w w w is_anagram_of cl ⍝ <-- this works, w w w w w matches
> ⍴cl
> 0
> w w w w w is_anagram_of ¨ cl
> ┌→────────┐
> │0 0 1 0 1│
> └─────────┘
> (w w w w w is_anagram_of ¨ cl)/cl
> ┌→────────────────┐
> │┌→─────┐ ┌→─────┐│
> ││inlets│ │tinsel││
> │└──────┘ └──────┘│
> └∊────────────────┘
> (∊1 (⍴cl))⍴⊂w
> ┌→───────────────────────────────────────────┐
> ↓┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
> ││listen│ │listen│ │listen│ │listen│ │listen││
> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
> └∊───────────────────────────────────────────┘
> w w w w w
> ┌→───────────────────────────────────────────┐
> │┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
> ││listen│ │listen│ │listen│ │listen│ │listen││
> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
> └∊───────────────────────────────────────────┘
> ((∊1 (⍴cl))⍴⊂w) is_anagram_of ¨ cl ⍝ <-- ?? Why does this not
> work as (w w w w w)?
> RANK ERROR
> ((∈1(⍴cl))⍴⊂w)is_anagram_of¨cl
> ^ ^
Advice appreciated,
Thank you,
-Russ
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gnu.org/archive/html/bug-apl/attachments/20210729/61a06b9e/attachment.html>
------------------------------
Message: 2
Date: Fri, 30 Jul 2021 08:14:58 +0200
From: Kacper Gutowski <mwgamera@gmail.com>
To: bug-apl@gnu.org
Subject: Re: Question on scalar extension of left arg
Message-ID: <YQOY4tE7weBhJ66j@hyper.mwgamera.name" target="_blank">YQOY4tE7weBhJ66j@hyper.mwgamera.name>
Content-Type: text/plain; charset=utf-8; format=flowed
Looking at this post I think there is a tiny bug
in the implementation of each:
(⍳6) {⍺,⍵}¨ ⍳5
1 1 2 2 3 3 4 4 5 5
(⍳5) {⍺,⍵}¨ ⍳6
INDEX ERROR
μ-Z__vA_LO_EACH_vB[2] (μ-N⊃μ-Z)←(μ-N⊃μ-A)μ-LO
^ ^
I think both should give a LENGTH ERROR.
On Thu, Jul 29, 2021 at 10:48:52PM -0700, Russtopia wrote:
>> w
>> ┌→─────┐
>> │listen│
>> └──────┘
>> cl
>> ┌→────────────────────────────────────────────┐
>> │┌→──────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
>> ││enlists│ │google│ │inlets│ │banana│ │tinsel││
>> │└───────┘ └──────┘ └──────┘ └──────┘ └──────┘│
>> └∊────────────────────────────────────────────┘
>> w is_anagram_of ¨ cl ⍝ <-- Should this not implicitly expand
>>left arg?
Look at the shapes, w is not a scalar but a vector of length 6 and cl is
a vector of length 5. No scalar extension is possible, but a length error.
What you wanted is simply:
(⊂w) is_anagram_of¨ cl
0 0 1 0 1
>> (∊1 (⍴cl))⍴⊂w
>> ┌→───────────────────────────────────────────┐
>> ↓┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
>> ││listen│ │listen│ │listen│ │listen│ │listen││
>> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
>> └∊───────────────────────────────────────────┘
>> w w w w w
>> ┌→───────────────────────────────────────────┐
>> │┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
>> ││listen│ │listen│ │listen│ │listen│ │listen││
>> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
>> └∊───────────────────────────────────────────┘
These are not the same. See that arrow on the left border of boxed
representation?
>> ((∊1 (⍴cl))⍴⊂w) is_anagram_of ¨ cl ⍝ <-- ?? Why does this not
>>work as (w w w w w)?
>> RANK ERROR
>> ((∈1(⍴cl))⍴⊂w)is_anagram_of¨cl
>> ^ ^
w w w w w ←→ 5⍴⊂w ⍝ a 5-element vector
((∊1 (⍴cl))⍴⊂w) ←→ 1 5⍴⊂w ⍝ a 1-by-5 matrix
-k
------------------------------
Message: 3
Date: Thu, 29 Jul 2021 23:42:04 -0700
From: Russtopia <rmagee@gmail.com>
To: bug-apl@gnu.org
Subject: Re: Question on scalar extension of left arg
Message-ID:
<CAN4yCu9zrGDPB-HhJJRX2aTnJtFs0OC+6P9N3o+CQfFnApm8qg@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Please excuse my bad form in replying to my own message. I see now there is
a subtle difference in the two expressions (namely, a down-arrow in the
left edge of the outermost box in the second form below):
(w w w w w)
> ┌→───────────────────────────────────────────┐
> │┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
> ││listen│ │listen│ │listen│ │listen│ │listen││
> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
> └∊───────────────────────────────────────────┘
> ⍴(w w w w w)
> ┌→┐
> │5│
> └─┘
> (∊1 (⍴cl))⍴⊂w
> ┌→───────────────────────────────────────────┐
> ↓┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
> ││listen│ │listen│ │listen│ │listen│ │listen││
> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
> └∊───────────────────────────────────────────┘
> ⍴(∊1 (⍴cl))⍴⊂w
> ┌→──┐
> │1 5│
> └───┘
> ⍴((∊1 (⍴cl))⍴⊂w)[1;] ⍝ Very ugly, but this seems to coerce to
> match the above ⍴(w w w w w)
> ┌→┐
> │5│
> └─┘
I suppose this is the reason one form works as an argument to my function,
where the other does not.
I still seek to understand why APL does not apply scalar extension on the
left arg though, to avoid needing either of these manual expansions to
match a single left arg with the list of right args.
-Russ
On Thu, 29 Jul 2021 at 22:48, Russtopia <rmagee@gmail.com> wrote:
> Hello, I am trying an exercise that finds anagrams of a word from a list
> of candidate words.
>
> I am having issues with scalar extension of the left arg, which I thought
> should automatically repeat the scalar left arg to match each item in the
> right vector arg. It seems to work only if I do the expansion manually
> (that is, repeat the left arg explicitly rather than let APL do it).
>
> (If formatting below is not readable, please convert it to a fixed-with
> font)
>
> w
>> ┌→─────┐
>> │listen│
>> └──────┘
>> cl
>> ┌→────────────────────────────────────────────┐
>> │┌→──────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
>> ││enlists│ │google│ │inlets│ │banana│ │tinsel││
>> │└───────┘ └──────┘ └──────┘ └──────┘ └──────┘│
>> └∊────────────────────────────────────────────┘
>> ⎕cr 'is_anagram_of'
>> ┌→──────────────────────────────┐
>> ↓r ← word is_anagram_of other │
>> │r ← word[⍋word] ≡ other[⍋other]│
>> └───────────────────────────────┘
>> w is_anagram_of cl
>> 0
>> w is_anagram_of ¨ cl ⍝ <-- Should this not implicitly expand
>> left arg?
>> DOMAIN ERROR
>> is_anagram_of[1] r←word[⍋word]≡other[⍋other]
>> ^ ^
>> w w w w w is_anagram_of cl ⍝ <-- this works, w w w w w matches
>> ⍴cl
>> 0
>> w w w w w is_anagram_of ¨ cl
>> ┌→────────┐
>> │0 0 1 0 1│
>> └─────────┘
>> (w w w w w is_anagram_of ¨ cl)/cl
>> ┌→────────────────┐
>> │┌→─────┐ ┌→─────┐│
>> ││inlets│ │tinsel││
>> │└──────┘ └──────┘│
>> └∊────────────────┘
>> (∊1 (⍴cl))⍴⊂w
>> ┌→───────────────────────────────────────────┐
>> ↓┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
>> ││listen│ │listen│ │listen│ │listen│ │listen││
>> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
>> └∊───────────────────────────────────────────┘
>> w w w w w
>> ┌→───────────────────────────────────────────┐
>> │┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐ ┌→─────┐│
>> ││listen│ │listen│ │listen│ │listen│ │listen││
>> │└──────┘ └──────┘ └──────┘ └──────┘ └──────┘│
>> └∊───────────────────────────────────────────┘
>> ((∊1 (⍴cl))⍴⊂w) is_anagram_of ¨ cl ⍝ <-- ?? Why does this not
>> work as (w w w w w)?
>> RANK ERROR
>> ((∈1(⍴cl))⍴⊂w)is_anagram_of¨cl
>> ^ ^
>
>
> Advice appreciated,
> Thank you,
> -Russ
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gnu.org/archive/html/bug-apl/attachments/20210729/d6cdee26/attachment.html>
------------------------------
Subject: Digest Footer
_______________________________________________
Bug-apl mailing list
Bug-apl@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-apl
------------------------------
End of Bug-apl Digest, Vol 94, Issue 7
**************************************