据我所知,不可能对J中的数字执行数组运算;例如
NB. In J, this won't work:
m =: 234
+/ m
9
*/ m
24
由于我无法直接进行操作,是否有办法像这样将数字拆分为列表然后再次返回?:
splitFunction 234
2 3 4
+/ (splitFunction 234)
9
|. (splitFunction 234)
4 3 2
concatenateFunction (4 3 2)
432
如果不可能,是否可以将数字转换为字符串然后再次返回? (因为J将字符串视为字符数组),例如
|. (toString 234)
432
答案 0 :(得分:4)
好吧,这里有您需要的一些东西。让我们从
开始public static int[] interleave(int[] a, int[] b)
{
int [] interleave = new int [a.length + b.length];
int j = 0, k = 0;
for (int i = 0; i < (a.length + b.length);i++)
{
if (((i % 2 == 0) || (k >= b.length)) && (j < a.length))
{
interleave[i] = a[j];
j++;
}
if (((i % 2 == 1) || (j >= a.length)) && (k < b.length))
{
interleave[i] = b[k];
k++;
}
所以在整数234的数字(应该为2 3 4)与234是一个原子中只有一个值为234的原子之间存在混淆。
接下来,您可以使用 m=:234 NB. m is the integer 234
+/ m NB. +/ sums across the items - only item is 234
234
*/ m NB. */ product across the items - only item is 234
234
来解构整数,该整数由底数(10 & #. ^: _1
)的反数(^:_1
)和左变量#.
组成。这样可以在基础10
中进行拆分。 J反转原语的方式是使用幂连词(10
)升为负1(^:
)
_1
我认为这可以满足您的要求,但是您可能需要花更多的时间考虑 splitFunction =: 10 & #.^:_1
concatenateFunction =: 10 & #.
splitFunction 234
2 3 4
+/ splitFunction 234
9
*/ splitFunction 234
24
|. splitFunction 234
4 3 2
concatenateFunction 2 3 4
234
concatenateFunction splitFunction 234
234
会做些什么,以及这是否有用。