2013-07-03 4 views
2

Первые идиомы из FinnAPL Library, который называется «Progressive индекс (без замены)«достаточно просто, насколько то, что операции:Index-Прогрессивной Idiom в APL

X←'dog food' 
Y←'fod' 
((⍴X)⍴⍋⍋X⍳X,Y)⍳(⍴Y)⍴⍋⍋X⍳Y,X ⍝ output 5 2 1 

Для каждого значения inY, он возвращает позицию индекса в X. Если значение Y имеет одно и то же значение дважды, оно возвращает индекс второго события в X. Например, если Y было «fodd», выход был бы 5 2 1 8, так как второй «d» в X находится в восьмом положении. Для любого значения в Y, которое не найдено в X, оно возвращает значение индекса вне диапазона X. Например, если Y был «fudd», выход будет 5 9 1 8.

Эта идиома похожа на зеркальное изображение, вращающееся вокруг индекса оператора . Правильный аргумент объединяет Y, за которым следует X, выполняет операцию индекса с X и затем усекает его до длины Y. Левый аргумент почти тот же, за исключением того, что он меняет роли X и Y. Он объединяет X после по Y, выполняет индекс операции с X и усекает его до длины Y.

Хотя легко видеть, что происходит, трудно понять, почему это работает. Итак, это мой вопрос.

ответ

2

Как краткий обзор операторов. Индекс-оператора возвращает позицию индекса в левом аргументе значений в правом аргументе. ascending cardinal numbers idiom⍋⍋, который я хотел бы назвать «рангом», возвращает позицию, которую значение ввода будет занимать после сортировки. И, наконец, использование формы-оператора в выражении (⍴Y)⍴A возвращает первые значения A как вектор равной длины Y. Другими словами, он действует как подстрочная функция (по крайней мере, как она применяется здесь) ,

Пройдя через это, давайте рассмотрим, как формируются левые и правые аргументы конечного индекса-операции:

1 2 3 4 5 2 2 1 5 2 1 X⍳X,Y left 
1 8 11 2 6 7 10 3 4 5 9 ⍋X⍳X,Y 
1 4 8 9 10 5 6 2 11 7 3 ⍋⍋X⍳X,Y 

5 2 1 1 2 3 4 5 2 2 1 X⍳Y,X right 
3 4 11 2 5 9 10 6 7 1 8 ⍋X⍳Y,X 
10 4 1 2 5 8 9 11 6 7 3 ⍋⍋X⍳Y,X 

1 4 8 9 10 5 6 2    left (⍴X)⍴⍋⍋X⍳X,Y 
10 4 1       right (⍴Y)⍴⍋⍋X⍳Y,X 
5 2 1       result 

Глядя на правый аргумент '10 4 1,»вы можете увидеть, чем ранг был присвоен значениям индекса букв «fod» в выражении «X⍳Y, X». Другими словами, после сортировки сортировки «f» будет находиться в позиции 10, «o» в 4 и «d» в позиции 1. Это можно увидеть более четко, применяя значения индекса к буквам после сортировки :

(Y,X)[⍋X⍳Y,X]      ⍝ dddoooog ff 

Это тот же самый результат, когда значения индекса левого аргумента применяются к конкатенации X с последующим Y:

(X,Y)[⍋X⍳X,Y]      ⍝ dddoooog ff 

несмотря на то, что они такие же, они являются результаты применения индексных значений к двум различным строкам: «корм для кормления» и «корм для собак». Применяя оператор повышения класса второй раз вместе с взятием подстроки, система отсчета возвращается d к исходным строкам, «собачьей еде» и «корму». Однако теперь у них есть общая точка зрения, поскольку левые и правые аргументы являются «рангами», относящимися к общей строке «dddoooog ff». Будучи рангами, как я обсуждал в другие post, они также относятся к исходным позициям. Поэтому, применяя конечный индекс-оператора, индекс ссылается не только на позицию левого аргумента, но и на позиции индекса в исходной строке, хранящейся в X, «корм для собак».

Общая форма многих из этих сортировочных идиом - индекс-ранг-индекс, где ранг действует как мост, связывая входные данные с выходом. Это возможно, поскольку в качестве набора пар ключ-значение элементы ранга-вектора одновременно могут ссылаться на две вещи.В примере 10 в правильном аргументе имеет ключевое значение 1, относящееся к значению индекса «f» в «fud». 10 в левом аргументе имеют значение ключа 5, относящееся к значению индекса «f» в «собачьей еде». В дополнение к этому значения равны 10, связывающие один ранг-вектор с другим. Следовательно, оба ключа и значения относятся к букве «f», но двумя разными способами.

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