Когда я пытаюсь добавить второй хук/форк в эту 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, как только она ломается и терпит неудачу, и появляются нули.

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

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


person Nick    schedule 15.09.2011    source источник


Ответы (4)


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

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

NB.f 1 1 1 3 2 4 1
NB.1 4
person NMR    schedule 02.07.2012

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

((0&{~+/)*./\(=0&{))1 1 1 3 2 4 1
person MPelletier    schedule 15.09.2011
comment
Или придумать что-нибудь с {. Я не силен в молчаливых выражениях, поэтому не могу заставить это работать правильно, извините. - person MPelletier; 16.09.2011
comment
Это было глупо с моей стороны, не так ли... но должно было быть число в индексе 1, с которым я мог бы сравнить и получить неправильный результат... Все, что я могу сказать, это то, что вчера я играл с NARS2000. , которая является бесплатной версией APL в старом стиле, но использует индексацию 1 источника. Что ж, теперь я могу продолжить эксперименты. - person Nick; 16.09.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
person Tikkanz    schedule 01.10.2011

Часть 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│
└─┴─┘
person Alex Shroyer    schedule 24.06.2015