Tâche
Étant donné une liste d'entrée d'entiers x 1 … x n , calculez une liste de rangs r 1 … r n (une permutation de {1… n} ) de sorte que x r 1 ≤ x r 2 ≤… ≤ x r n . Ensuite, pour chaque x i , remplacez son rang par la moyenne arithmétique des rangs de toutes les valeurs de x qui sont égales à x i . (Autrement dit, chaque fois qu'il existe un lien entre des valeurs égales dans x , redistribuez équitablement les rangs parmi tous.) Sortez la liste modifiée des rangs r ' n 1 … r' .
(Pour les geeks de statistiques: un tel classement des observations est utilisé dans le test de Mann-Whitney U (méthode deux, étape 1.))
Exemple
Étant donné une liste d'entrée [3, -6, 3, 3, 14, 3] , la première liste de rangs serait [2, 1, 3, 4, 6, 5] , qui trierait la liste en [-6, 3, 3, 3, 3, 14] . Ensuite, les rangs des 3 s de la liste d'entrée sont égalisés en (2 + 3 + 4 + 5) ÷ 4 = 3,5 . La sortie finale est [3,5, 1, 3,5, 3,5, 6, 3,5] .
Cas de test
[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]
Règles
Il s'agit de code-golf , donc le code le plus court en octets l'emporte.
Réponses:
Gelée ,
108 octetsEnregistré 2 octets en utilisant l'
cmp
astuce de la réponse de @ xnor .Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Pyth, 12
Suite de tests
Pour chaque valeur, cela calcule la moyenne arithmétique de
[1..frequency]
et ajoute le nombre de valeurs inférieures à la valeur actuelle.Cela fonctionne car pour chaque valeur, nous calculerions:
que nous pouvons simplifier pour:
et encore:
Cependant, en Pyth, il était golfeur de calculer le premier summand en utilisant la moyenne intégrée, plutôt que cette autre formule.
la source
Python 2, 51 octets
Pour chaque élément
y
, l'cmp
expression donne 2 points pour chaque plus petitx
et 1 point pour chaque égalx
. Cette somme est redimensionnée dans la bonne plage en ajoutant 1 et en divisant par deux. Le2.
est nécessaire pour éviter la division entière.Python 3, 52 octets
Python 3 manque
cmp
, nécessitant une expression booléenne (+2 octets), mais il a une division flottante (-1 octet).la source
MATL , 14 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test (version légèrement modifiée du code; chaque résultat est sur une ligne différente).
la source
05AB1E , 13 octets
Code:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
R,
1712 octetsPrend l'entrée des sorties STDIN vers STDOUT. Si la sortie est flexible, nous pouvons abandonner le
cat()
.Assez simple, utilise le rang intégré par défaut à la moyenne pour un bris d'égalité.
Utilisé:
la source
cat()
, si cela ne dépend que de moi. Je ne sais pas quel est le consensus communautaire, cependant.J, 18 octets
Basé sur la solution de Dennis utilisant xnor méthode .
L'utilisation d'une approche directe nécessite 24 octets pour moi.
Usage
la source
En fait, 18 octets
Essayez-le en ligne!
Il s'agit essentiellement d'un portage de la solution Python de xnor .
Explication:
la source
APL, 17 caractères
En supposant que la liste est stockée dans
X
.Explication:
Notez que APL évalue les expressions de droite à gauche. Ensuite:
∘.=⍨X
=X∘.=X
où∘.=
est le produit extérieur utilisant=
comme fonction dyadique. (Où vous vous multiplieriez normalement. Le produit mathématique externe peut donc s'écrire∘.×
.)y
ety
est directement pliée en utilisant+
pour donner un vecteur du nombre d'objets égaux pour chaque rang (appelons-lez←+/y
).⍋X
renvoie les rangs deX
y+.×⍋X
donne le produit intérieur de notre matrice y avec ce vecteur.z
.la source
Julia, 30 octets
Cela utilise une approche de la réponse de @ xnor . Julia a
cmp
, mais il ne vectorise pas.Essayez-le en ligne!
la source
JavaScript (ES6),
4948 octetsEdit: enregistré 1 octet en reformulant l'expression afin qu'elle ressemble maintenant à la réponse Python 3 de @ xnor.
la source