Tarea
Dada una lista de entrada de enteros x 1 ... x n , calcule una lista de rangos r 1 ... r n (una permutación de {1 ... n} ) para que x r 1 ≤ x r 2 ≤ ... ≤ x r n . Luego, para cada x i , reemplace su rango por la media aritmética de los rangos de todos los valores en x que sean iguales a x i . (Es decir, siempre que haya un vínculo entre los valores iguales en x , redistribuya bastante bien los rangos entre todos ellos). Genere la lista modificada de rangos r ' 1 ... r'n .
(Para geeks estadísticos: tal clasificación de observaciones se usa en la prueba U de Mann – Whitney (método dos, paso 1.))
Ejemplo
Dada una lista de entrada [3, -6, 3, 3, 14, 3] , la primera lista de rangos sería [2, 1, 3, 4, 6, 5] , que ordenaría la lista en [-6, 3, 3, 3, 3, 14] . Luego, los rangos de los 3 s en la lista de entrada se igualan en (2 + 3 + 4 + 5) ÷ 4 = 3.5 . El resultado final es [3.5, 1, 3.5, 3.5, 6, 3.5] .
Casos de prueba
[4, 1, 4] -> [2.5, 1.0, 2.5]
[5, 14, 14, 14, 14, 5, 14] -> [1.5, 5.0, 5.0, 5.0, 5.0, 1.5, 5.0]
[9, 9, -5, -5, 13, -5, 13, 9, 9, 13] -> [5.5, 5.5, 2.0, 2.0, 9.0, 2.0, 9.0, 5.5, 5.5, 9.0]
[13, 16, 2, -5, -5, -5, 13, 16, -5, -5] -> [7.5, 9.5, 6.0, 3.0, 3.0, 3.0, 7.5, 9.5, 3.0, 3.0]
Reglas
Este es el código de golf , por lo que gana el código más corto en bytes.

Respuestas:
Jalea ,
108 bytesAhorró 2 bytes usando el
cmptruco de la respuesta de @ xnor .Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Pyth, 12
Banco de pruebas
Para cada valor, esto calcula la media aritmética de
[1..frequency]y agrega el recuento de valores menores que el actual.Esto funciona porque para cada valor calcularíamos:
que podemos simplificar a:
y nuevamente a:
Sin embargo, en Pyth era más golfoso calcular el primer sumando usando la media incorporada, en lugar de esta otra fórmula.
fuente
Python 2, 51 bytes
Para cada elemento
y, lacmpexpresión da 2 puntos por cada más pequeñoxy 1 punto por cada igualx. Esta suma se reescala en el rango correcto agregando 1 y reduciendo a la mitad. Se2.necesita para evitar la división de enteros.Python 3, 52 bytes
Python 3 carece
cmp, lo que requiere una expresión booleana (+2 bytes), pero tiene división flotante (-1 byte).fuente
MATL , 14 bytes
Pruébalo en línea! O verifique todos los casos de prueba (versión ligeramente modificada del código; cada resultado está en una línea diferente).
fuente
05AB1E , 13 bytes
Código:
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
R,
1712 bytesToma la entrada de las salidas STDIN a STDOUT. Si la salida es flexible, podemos deshacernos del
cat().Bastante simple, usa el rango incorporado que por defecto es el promedio para un desempate.
En uso:
fuente
cat(), si depende de mí. Sin embargo, no sé cuál es el consenso de la comunidad.J, 18 bytes
Basado en la solución de Dennis usando el método de xnor .
Usar un enfoque directo requiere 24 bytes para mí.
Uso
fuente
En realidad, 18 bytes
Pruébalo en línea!
Esto es esencialmente un puerto de la solución Python de xnor .
Explicación:
fuente
APL, 17 caracteres
Suponiendo que la lista esté almacenada en
X.Explicación:
Tenga en cuenta que APL evalúa las expresiones de derecha a izquierda. Luego:
∘.=⍨X=X∘.=Xdonde∘.=se usa el producto externo=como función diádica. (Donde normalmente se multiplicaría. Por lo tanto, el producto externo matemático puede escribirse como∘.×).yyyse pliega directamente usando+para dar un vector del número de objetos iguales para cada rango (llamémosloz←+/y).⍋Xdevuelve las filas deXy+.×⍋Xda el producto interno de nuestra matriz y con este vector.z.fuente
Julia, 30 bytes
Esto utiliza un enfoque de la respuesta de @ xnor . Julia sí
cmp, pero no se vectoriza.Pruébalo en línea!
fuente
JavaScript (ES6),
4948 bytesEditar: se guardó 1 byte reformulando la expresión para que ahora se vea como la respuesta Python 3 de @ xnor.
fuente