Когда я пытаюсь добавить второй хук / форк в эту 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│
└─┴─┘
Другие вопросы по тегам