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
cmp
truco 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
, lacmp
expresión da 2 puntos por cada más pequeñox
y 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∘.=X
donde∘.=
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∘.×
).y
yy
se pliega directamente usando+
para dar un vector del número de objetos iguales para cada rango (llamémosloz←+/y
).⍋X
devuelve las filas deX
y+.×⍋X
da 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