默认写 4 : 'x&{.&.;: y'

Write 4 : 'x&{.&.;: y' tacitly

Conor Hoekstra 最近解决了 APL 中的 Leetcode 问题 https://youtu.be/QtvvQ7MdwKY 问题是从字符串中取出前 x 个单词 y

在 J 中,使用 &.(Under)和 ;:(Words)我可以想出一个很好的明确的 one liner

solve =. 4 : 'x&{.&.;: y'         NB. Box words in y -> take first x-> unbox words in result while retaining spaces between
   s=. 'Hello how are you Contestant'
   4 solve s
Hello how are you

我遇到的麻烦是找到仍然包含 &. 的默认版本,主要是因为我认为 x 需要在创建动词期间绑定到 {.。 这也是魔术 13 : 转换没有帮助的示例

   13 : 'x&{.&.;: y'
4 : 'x&{.&.;: y'

我可以默认用;:^:_1创建;:

的逆来解决
   solve2=. (;:^:_1)@:({. ;:)
   4 solve2 s
Hello how are you

但这并不像 4 : 'x&{.&.;: y' 的默认版本那么漂亮。
任何人都有 4 : 'x&{.&.;: y'?

的默认解决方案

mainly because I believe x needs to be bound to {. during the creation of the verb.

如果用输入创建动词是关键,难道不应该使用副词吗?

   solve =: 1 : 'm&{.&.;:'
   4 solve
4&{.&.;:
   (4 solve ,: 2 solve) 'Hello how are you Contestant'
Hello how are you
Hello how        

solve 本身不是默认的(或动词),但 4 solve 是默认的动词。

semiduals(是用J902还是J903引入的?)可以写成4 {.&.(a:`;:) s。然后 ;: 仅应用于正确的论点,而稍后仍会执行相反的操作。 u&.(f`a:) 将仅在左侧参数上应用 f

我不认为你可以把它写成默认动词,但它很容易写成默认副词:]:&{.&.;:.