是否可以使用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
答案 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版中正常工作。