Когда я пытаюсь добавить второй хук / форк в эту J-программу, я получаю неожиданные результаты. Кто-нибудь может объяснить почему?
((1&{~+/)*./\(=1&{))1 1 1 3 2 4 1
Я всегда получаю ошибку индекса.
Смысл состоит в том, чтобы вывести два числа, одно из которых совпадает с первым числом в списке, второе - с количеством повторений этого числа.
Так что это много работает:
*./\(=1&{)1 1 1 3 2 4 1
1 1 1 0 0 0 0
Я сравниваю первое число с остальной частью списка. Затем я делаю вставку и сжатие - и это дает мне 1, пока у меня есть непрерывная строка 1, как только она ломает и терпит неудачу, и нули выходят.
Я подумал, что мог бы затем добавить еще один набор паренов, снова получить ведущий элемент из списка и каким-то образом записать эти числа, в конечном итоге идея состояла бы в том, чтобы иметь другой этап, на котором я применяю инверсию вектора к исходному списку, и затем используйте $: чтобы вернуться для рекурсивного применения того же глагола. Вроде как пример быстрой сортировки, который, как мне показалось, я понял, но думаю, что нет.
Но я даже не могу подобраться. Я задам это как отдельный вопрос, чтобы люди получали должную оценку за ответы.
4 ответа
Вы искали что-то подобное?
f=.{.,+/@:({. E. ])
NB.f 1 1 1 3 2 4 1
NB.1 4
J имеет индекс 0, поэтому вы хотите попробовать это вместо:
((0&{~+/)*./\(=0&{))1 1 1 3 2 4 1
(0&{ , +/@(*./\)@(= 0&{)) 1 1 1 3 2 4 1
1 3
Я не совсем уверен по твоему вопросу, был ли это первоначальный результат, к которому ты стремился?
Это может быть более простой способ получить количество повторений первого элемента.
=/\ 1 1 1 3 2 4 1
1 1 1 0 0 0 0
У меня сложилось впечатление, что вы хотите закончить чем-то похожим на следующее? (который дает количество последовательных повторов в списке)
([: #/.~ 0 , [: +/\ 2 ~:/\ ]) 1 1 1 3 2 2 4 1
3 1 2 1 1
Часть 1
Там встроенный глагол {.
чтобы получить первый элемент из массива, так что первая часть готова.
Часть 2
Для второй части мы можем объединить это с e.
которая, если дан вектор, возвращает таблицу, показывающую, где находятся элементы:
e. 1 3 1 1
1 0 1 1
0 1 0 0
1 0 1 1
1 0 1 1
Используйте первую строку (или столбец!):
{.e. 1 3 1 1
1 0 1 1
Суммируйте этот результат:
+/{.e. 1 3 1 1
3
скомбинировать
Объединение частей 1 и 2 в список из 2 элементов достигается с помощью двоичного ,
(Добавить):
(result of {.) , (result of sum of first row (or column!) of e.)
Я всегда обманываю и использую явный к молчанию конвертер (13 :
) для таких вещей:
13 : '({.y) , +/{. e.y'
{. , [: +/ [: {. e.
Но в этот момент вы можете заметить, что это немного тяжело с [:
(шапка) и ответ ЯМР чище.
Бонус за чтение этого далеко
Если вы возвращаете в штучной упаковке массив (с помощью ;
вместо ,
), вы можете распространить эту функцию на списки вещей, отличных от чисел:
f =: 13 : '({.y) ; +/{. e.y'
f 'abracadabra'
┌─┬─┐
│a│5│
└─┴─┘