Отображение элементов по количеству вхождений в 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│
└──┴─┘
Надеюсь это поможет.