Я не знаю ни одного способа использовать соединение пригонки для изменения заливки для 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"_
для совместимости.