2011-03-11 2 views
2

Можно ли указать значение по умолчанию для expand с !., подходящее соединение? Как правило, можно указать значение заполнения по умолчанию для #, но как насчет #^:_1?Fit joint (!.) Применяется для расширения

Например, что-то вроде

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

что это за язык – dynamic

+0

@ yes123: Это J, который развивается и похож на APL. –

+0

И да, мое смещение для J5 над J6 показано в боксах. – MPelletier

ответ

2

Я не знаю, какой-либо способ, чтобы использовать нужным конъюнкции, чтобы изменить заливку expand (#^:_1)

Метод, который я знаю, как использовать, состоит в том, чтобы написать эквивалент expand, для которого мы указываем элементы заполнения т.

Следующий код позволяет настраивать расширение, как вы описали. Он был написан для работы с версией 5, поскольку вы указали, что полагаетесь на это, но я тестировал его только под версией 6. Как обычно, это, вероятно, подвержено дальнейшей доработке.

xpand=: 1 :'((retention j. expansion)@:[ #!.u [email protected]:])' 
    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=: [email protected]:] }~ [:i.+/ 
    insert=: +/ * -. 

Обратите внимание, что u,~] часть не совместим с версией 5. Использование ],u"_ вместо совместимости.

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

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

5

Да:

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

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

+0

О, хороший! Думаю, мне это нравится лучше, чем у калейдистов. – MPelletier

+0

Извините, не работает в J 5. Это хороший ответ, но я несу этот код J 5, как какой-то туш, и я застрял на нем, пока он не гниет или на самом деле не мигрирует в J 6 (и есть к сожалению, более тонкости к нему, чем просто изменение 'x.' на' x'). – MPelletier