Fit соединение (!.) Применяется для расширения - PullRequest
2 голосов
/ 12 марта 2011

Можно ли указать значение по умолчанию для 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 ]

5 голосов
/ 25 марта 2011

Да

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

Хитрость заключается в том, чтобы использовать f. или #^:_1 анонимно, так что !. видит #^:_1 в качестве левого аргумента вместо expand. Fit не такой умный, как мог бы быть.

2 голосов
/ 17 марта 2011

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

1 голос
/ 25 марта 2011

Другой подход может быть:

   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. @ #

Тем не менее, обратите внимание, что предложение Дэна Брона # !. empty ^: _ 1 прекрасно работает для меня, и я подумал, что должно работать нормально в версии 5.

...