aprende a usar ⍋⍋: la función inesperada de APL

Fuentes: What Does ⍋⍋ Even Mean?

Este artículo explora el significado y la utilidad de la función ⍋⍋ en el lenguaje de programación APL, un tema que inicialmente parecía carecer de sentido según Paul Mansour. Aunque inicialmente se considera inútil (equivalente a una versión más lenta de otra función), el artículo revela una aplicación general más interesante.

En esencia, ⍋ (Grade Up) toma un array (una estructura de datos en APL) y devuelve un array que indica el rango de cada item dentro del array original. Un item es una sub-array a lo largo del primer eje; para un vector, son los elementos individuales, y para una matriz, son las filas. El rango de un item es su posición si el array se ordenara de forma ascendente. Por ejemplo, si tenemos el vector l n p w b k m c x t, ⍋ lo transformaría en 4 7 5 0 6 1 2 9 3 8, indicando la posición de cada letra si se ordenara alfabéticamente.

Ahora, ⍋⍋ (Grade Up aplicado dos veces) no ordena el array original. En cambio, devuelve un array que contiene los rangos de los items del array original. Esto puede parecer confuso, pero es equivalente a calcular el 'Rank' de cada item. Una propiedad importante es que ⍋⍋ deja sin cambios las relaciones de orden entre los items (representadas como , donde i es el rango del item original y j es el rango del item en el resultado de ⍋). Esto significa que, para un vector de permutación, ⍋⍋ se comporta como la función identidad.

El artículo también explica cómo ⍋ y ⍒ (Grade Down, su función inversa) interactúan, definiendo cuatro combinaciones posibles (⍋⍋, ⍋⍒, ⍒⍋, ⍒⍒) que corresponden a diferentes formas de calcular rangos y 'ReverseRanks' (rangos calculados desde el final del array). La suma del Rank y el ReverseRank de cada item siempre es constante (el número total de items menos uno), a menos que haya items iguales en el array original, donde la dirección de ordenamiento no importa. Esta peculiaridad es la base para el 'AverageRank' mencionado por Mansour, que explota esta propiedad para realizar cálculos específicos.

En resumen, ⍋⍋, aunque aparentemente inútil, proporciona una forma de calcular rangos de items dentro de un array y ofrece una comprensión más profunda de las funciones de ordenamiento en APL.