适合连接(!。)应用于扩展

时间:2011-03-11 22:50:46

标签: j

是否可以使用expand指定!.的默认值?通常情况下,可以指定#的默认填充值,但#^:_1呢?

例如,像

    empty =. <0 0$''
    r =. 0 1 0 1 expand!.empty 'foo';'bar' NB. Actually a domain error
++---+---++
||foo|bar||
++---+---++
    $ each r
+---+-+-+---+
|0 0|3|3|0 0|
+---+-+-+---+

所有我尝试过抛出域名错误:

expand!.empty
#^:_1!.empty
#!.empty^:_1
(#!.empty)^:_1

3 个答案:

答案 0 :(得分:5)

是:

0 1 0 1 expand f.!.empty 'foo';'bar' NB. with f. works fine
++---++---+
||foo||bar|
++---++---+

诀窍是匿名使用f.#^:_1,以便!.#^:_1视为左参数,而不是expand。 Fit并不像它可能那么聪明。

答案 1 :(得分:2)

我不知道有任何方法可以使用fit fit来改变expand#^:_1)的填充

我知道如何使用的技术是写一个等价于我们指定fill元素的expand

以下代码允许自定义扩展,例如您所描述的。它已被编写为与第5版一起使用,因为您表示您依赖于它,但我仅在版本6下进行了测试。像往常一样,这很可能会进一步细化。

   xpand=: 1 :'((retention j. expansion)@:[ #!.u prep@:])'
   prep=: ,~ {.
   retention=: 0:, +/ # 1:
   expansion=: [:forwarddifference [:tallyzeros [:partition [:<\ pad
   forwarddifference=: 2&(-~/\)
   tallyzeros=: +/ @: -. &>
   partition=: #~ (1: = {:)&>
   pad=: 1&([,~ ,)

   NB. example of use
   empty =. <0 0$''
   ]r=. 0 1 1 0 empty xpand 'foo';'bar'
┌┬───┬───┬┐
││foo│bar││
└┴───┴───┴┘
   $ each r
┌───┬─┬─┬───┐
│0 0│3│3│0 0│
└───┴─┴─┴───┘

自从发布原始答案后,我获得了一个更简洁的选择:

   xpand =: 1 :' index @:[ { u,~] '
   index =:  retain + insert
   retain=:  I.@:] }~  [:i.+/
   insert=:  +/ * -.

请注意,u,~]部分与版本5不兼容。请使用],u"_代替兼容性。

答案 2 :(得分:1)

另一种方法可能是:

   inv=: ^:_1
   1 0 1 0 1 ((#inv #\) { 'z'&,@]) 'abc'
azbzc

用你想要使用的名词替换名词......

因此:

   fillExpand=:1 :'(#inv #\) { m&,@]'
   empty=:<i.0 0
   0 1 0 1 empty fillExpand ;:'foo bar'
++---++---+
||foo||bar|
++---++---+
   $&.>0 1 0 1 empty fillExpand ;:'foo bar'
+---+-+---+-+
|0 0|3|0 0|3|
+---+-+---+-+

那就是说,注意#在版本5下效率很低。在版本5中,我会将#\替换为1:+ i。@#

那说,请注意Dan Bron的建议#!. empty ^:_ 1对我来说很好,我认为应该在第5版中正常工作。