Я некоторое время работал над функцией J, которая должна сканировать список и помещать последовательные копии элемента в отдельные соединенные блоки. Мои усилия привели меня к функции
(<;. 2) ((2&(~:/\)),1:)
, который проверяет последовательные записи списка на неравенство, возвращает список логических значений и разрезает список на блоки, которые заканчиваются каждый раз, когда появляется число 1. Вот пример приложения:
(<;. 2) ((2&(~:/\)),1:) 1 2 3 3 3 4 1 1 1
+-+-+-----+-+-----+
|1|1|0 0 1|1|0 0 1|
+-+-+-----+-+-----+
Задача была бы завершена, если бы я мог тогда заменить все эти логические значения на соответствующие значения во входном аргументе. Я искал какую-то загадочную функцию, которая позволила бы мне сделать что-то вроде
final =: mysteryfunction @ (<;. 2) ((2&(~:/\)),1:)
final 1 2 3 3 3 4 1 1 1
+-+-+-----+-+-----+
|1|2|3 3 3|4|1 1 1|
+-+-+-----+-+-----+
В идеальной ситуации был бы какой-то способ абстрактно представить шаблон вложения, сгенерированный (<;. 2) ((2&(~:/\)),1:)
, и применить его к исходному списку ввода. (т. е. «Этот штучный массив здесь имеет первый элемент, заключенный в бок на глубине один, второй элемент, заключенный в бок на глубине один, третий, четвертый и пятый элементы, заключенные в бок на глубине один, ... и упаковать его таким же образом. ") Я пытался дурачиться с ;.
, S:
, L:
, L.
и &.
, чтобы произвести такое поведение, но мне не повезло. Есть ли какой-то оператор или принцип, который я упускаю, чтобы это могло произойти? Меня не удивило бы, если бы я переосмыслил весь вопрос, но у меня заканчиваются идеи.
EDIT:
На данный момент единственное рабочее решение, которое у меня есть, это:
isduplicate =: ((2&(~:/\)),1:)
testfun =: 3 : 0
numduplicates =. #S:0 ((<;.2) isduplicate y)
distinctboxes =. <"0 (isduplicate#]) y
numduplicates # each distinctboxes
)
Это двухэтапный процесс генерации кодировки длин серий, а затем отмены кодирования без избавления от полей. Поскольку я изначально делаю это с целью решения 99 задач в тандеме с использованием J и Haskell, мне кажется, что мне нужно задаться вопросом, решу ли я проблему 9, сначала решив проблему 12.