Я некоторое время работал над функцией J, которая должна сканировать список и помещать последовательные копии элемента в отдельные, объединенные поля. Мои усилия приняли меня, насколько функцииАбстрактные структуры ячеек массива в 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:)
и применить его к оригиналу список ввода. (т. е. «Этот массив с боксами здесь имеет первый элемент, помещенный на глубину один, второй элемент, помещенный на первой, третьей, четвертой и пятой элементах, помещенных вместе на глубину 1, ..., поэтому возьмите этот список без списка и поместим его так же ».) Я попытался обмануть ;.
, S:
, L:
, L.
и &.
, чтобы произвести это поведение, но мне не повезло. Есть ли какой-то оператор или принцип, который мне не хватает, чтобы это произошло? Меня не удивило бы, если бы я задумался над всей проблемой, но у меня заканчиваются идеи.
РЕДАКТИРОВАТЬ:
На данный момент, единственный рабочий раствор у меня есть это:
isduplicate =: ((2&(~:/\)),1:)
testfun =: 3 : 0
numduplicates =. #S:0 ((<;.2) isduplicate y)
distinctboxes =. <"0 (isduplicate#]) y
numduplicates # each distinctboxes
)
Это двухступенчатый процесс генерации по длине прогона кодирование списка, а затем погибель кодирование без избавления от ящиков. Поскольку я изначально делаю это с целью решения 99 problems в тандеме с помощью J и Haskell, возникает вопрос, если я решаю проблему 9, сначала решая проблему 12.
Так вот как вы это делаете! Я провел несколько дней, собираясь с документацией, пытаясь сделать J применимыми к элементам элементы с использованием логического вывода. Спасибо за помощь. – estanford
Добро пожаловать. Оглядываясь на это снова, я, вероятно, должен * упомянуть, что это использует __dyadic__ cut ('; .2') вместо монадического использования разреза в вашем исходном коде. И последнее замечание: если бы мы пошли на краткость кода (а также ясность, imo), я бы, вероятно, написал это, используя вариант cut-1 (вместо cut-2), который разбивается на ведущие 1s: '(<;. 1 ~ 1,2 & (~:/\)) '- приятный и сочный! – earl