2

是否可以为expandwith指定默认值!.,fit 连词?通常,可以为 指定默认填充值#,但是 呢#^:_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
4

3 回答 3

5

是的:

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

诀窍是使用f.or#^:_1匿名,以便!.#^:_1其视为左参数,而不是expand. Fit 并没有想象中的那么聪明。

于 2011-03-25T13:38:32.140 回答
2

我不知道有什么方法可以使用 fit 连词来改变expand( #^:_1)的填充

我确实知道如何使用的技术是编写一个等效项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"_改为使用以实现兼容性。

于 2011-03-17T18:36:28.987 回答
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 中正常工作。

于 2011-03-25T13:25:52.463 回答