Когда я пытаюсь добавить второй хук / форк в эту J-программу, я получаю неожиданные результаты. Кто-нибудь может объяснить почему? - PullRequest
3 голосов
/ 16 сентября 2011
((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, как только она ломает и терпит неудачу, и нули выходят.

Я подумал, что мог бы затем добавить еще один набор символов, снова получить ведущий элемент из списка и каким-то образом записать эти числа, возможной идеей будет другой этап, на котором я применяю инверсию вектора к исходному. list, а затем используйте $: чтобы вернуться для рекурсивного применения того же глагола. Вроде как пример быстрой сортировки, который, как мне показалось, я понял, но думаю, что нет.

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

Ответы [ 4 ]

2 голосов
/ 03 июля 2012

Вы искали что-то подобное?

f=.{.,+/@:({. E. ])

NB.f 1 1 1 3 2 4 1
NB.1 4
0 голосов
/ 24 июня 2015

часть 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 в двухэлементный список достигается с помощью двоичного кода , (приложение):

(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│
└─┴─┘
0 голосов
/ 01 октября 2011
   (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
0 голосов
/ 16 сентября 2011

J имеет индекс 0, поэтому вы можете попробовать это вместо:

((0&{~+/)*./\(=0&{))1 1 1 3 2 4 1
...