Обрабатывать число как массив - PullRequest
0 голосов
/ 02 сентября 2018

Насколько я знаю, невозможно выполнять операции с массивами над числами в 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 голосов
/ 02 сентября 2018

Ну, здесь есть немного, чтобы распаковать то, что вы ожидаете. Давайте начнем с

   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

так что, похоже, существует путаница между цифрами целого числа 234, которое будет равно 2 3 4, и тем фактом, что 234 является атомом, который имеет только один элемент со значением 234.

Переходя от этого, вы можете деконструировать свое целое число, используя 10 & #. ^: _1, которое состоит из инверсии (^:_1) от Base (#.) с левым аргументом 10, который позволяет выполнить разбиение в базе 10. Способ J инвертировать примитив состоит в том, чтобы использовать соединение Power (^:), возведенное в отрицательное значение 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

Я думаю, что это будет делать то, что вы хотите, но вы можете потратить немного больше времени на размышления о том, что вы ожидаете от +/ 234 и будет ли это полезным поведением.

...