Отображение элементов по количеству вхождений в J

Используя язык J, я хочу получить отображение количества элементов в массиве.

В частности, я хочу ввести английское слово в нижнем регистре, содержащее от двух до многих букв, и получить обратно каждую пару букв в слове вместе с количеством случаев.

Мне нужен глагол, который дает что-то вроде этого в любой структуре J, которую вы считаете подходящей:

Для "какао":

co 2
oc 1
oa 1

Для банана:

ba 1
an 2
na 2

Для "молока":

mi 1
il 1
lk 1

Для "до":

to 1

(Для однобуквенных слов, таких как "а", задача не определена и не будет выполняться.)

(Порядок не важен, вот как я их перечислил.)

Я могу легко получить последовательные пары букв в слове в виде матрицы или списка блоков:

   2(] ;._3)'cocoa'
co
oc
co
oa
   ]
   2(< ;._3)'cocoa'
┌──┬──┬──┬──┐
│co│oc│co│oa│
└──┴──┴──┴──┘

Но мне нужна помощь, чтобы добраться оттуда до отображения пар на счет.

Я в курсе ~. и ~: но я не просто хочу возвращать уникальные элементы или индексы дубликатов. Я хочу составить карту отсчетов.

Страница NuVoc "Loopless" указывает, что / (или /\. Или /\) - это то место, где я должен искать проблемы накопления. Я знаком с / для арифметических операций над числовыми массивами, но для u/y я не знаю, что вам нужно, чтобы собрать список пар букв, которые бы составляли y.

(NB. Я уже могу сделать это на "нормальных" языках, таких как Java или Python, без посторонней помощи. Подобные вопросы по SO относятся к языкам с совершенно другим синтаксисом и семантикой к J. Меня интересует идиоматический J-подход к такого рода проблеме.)

2 ответа

Решение

Чтобы получить список двухбуквенных комбинаций, я бы использовал двоичный инфикс (\):

   2 ]\ 'banana'
ba
an
na
an
na

Для подсчёта случаев ключ, который сразу приходит в голову, является ключевым (/.)

   #/.~ 2 ]\ 'banana'
1 2 2

Если вы хотите сопоставить количество букв с комбинациями букв, вы можете расширить глагол до следующего разветвления:

   ({. ; #)/.~ 2 ]\ 'banana'
┌──┬─┐
│ba│1│
├──┼─┤
│an│2│
├──┼─┤
│na│2│
└──┴─┘

Я думаю, что вы хотите сопоставить количество уникальных предметов с предметами. Вы можете исправить меня, если я ошибаюсь.

Начиная с

 [t=. 2(< ;._3)'cocoa'
┌──┬──┬──┬──┐
│co│oc│co│oa│
└──┴──┴──┴──┘

Ты можешь использовать ~. (Nub), чтобы вернуть уникальные элементы в списке

   ~.t
┌──┬──┬──┐
│co│oc│oa│
└──┴──┴──┘

Затем, если вы сравните кусочек со списком в штучной упаковке, вы получите матрицу, где 1 - это позиции, которые соответствуют кусочку в штучной упаковке в вашей строке

   t =/ ~.t
1 0 0
0 1 0
1 0 0
0 0 1

Суммируйте столбцы этой матрицы, и вы получите количество раз, когда каждый элемент куска появляется

    +/  t =/ ~.t
2 1 1

Затем пометьте их так, чтобы вы могли комбинировать целые числа вдоль боксовых символов

   <"0 +/  t =/ ~.t
┌─┬─┬─┐
│2│1│1│
└─┴─┴─┘

Объедините их, соединив кусочек и граф, используя ,. (Стежка)

 (~.t) ,. <"0 +/  t =/ ~.t
┌──┬─┐
│co│2│
├──┼─┤
│oc│1│
├──┼─┤
│oa│1│
└──┴─┘
       [t=. 2(< ;._3)'banana'
┌──┬──┬──┬──┬──┐
│ba│an│na│an│na│
└──┴──┴──┴──┴──┘
   (~.t) ,. <"0 +/  t =/ ~.t
┌──┬─┐
│ba│1│
├──┼─┤
│an│2│
├──┼─┤
│na│2│
└──┴─┘
   [t=. 2(< ;._3)'milk'
┌──┬──┬──┐
│mi│il│lk│
└──┴──┴──┘
   (~.t) ,. <"0 +/  t =/ ~.t
┌──┬─┐
│mi│1│
├──┼─┤
│il│1│
├──┼─┤
│lk│1│
└──┴─┘

Надеюсь это поможет.

Другие вопросы по тегам