将数字视为数组

时间:2018-09-02 18:10:34

标签: j

据我所知,不可能对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

1 个答案:

答案 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 会做些什么,以及这是否有用。