Tarefa
Dada uma lista de entrada de números inteiros x 1 … x n , calcule uma lista de classificações r 1 … r n (uma permutação de {1… n} ) para que x r 1 ≤ x r 2 ≤… ≤ x r n . Então, para cada x i , substitua sua classificação pela média aritmética das classificações de todos os valores em x iguais a x i . (Ou seja, sempre que houver um empate entre valores iguais em x , redistribua razoavelmente as classificações entre todas elas.) Crie a lista modificada de classificações r ' 1 … r'n .
(Para geeks de estatística: esse ranking de observações é usado no teste U de Mann – Whitney (método dois, etapa 1.))
Exemplo
Dada uma lista de entrada [3, -6, 3, 3, 14, 3] , a primeira lista de classificações seria [2, 1, 3, 4, 6, 5] , que classificaria a lista em [-6, 3, 3, 3, 3, 14] . Então, as classificações para todos os 3 s na lista de entrada são niveladas em (2 + 3 + 4 + 5) ÷ 4 = 3,5 . A saída final é [3.5, 1, 3.5, 3.5, 6, 3.5] .
Casos de teste
[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]
Regras
Isso é código-golfe , então o código mais curto em bytes vence.
Respostas:
Geléia ,
108 bytesEconomizou 2 bytes usando o
cmp
truque da resposta de @ xnor .Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Pyth, 12
Suíte de teste
Para cada valor, calcula a média aritmética de
[1..frequency]
e adiciona a contagem de valores menor que o atual.Isso funciona porque, para cada valor, calcularíamos:
que podemos simplificar para:
e novamente para:
No entanto, em Pyth, era mais golfista calcular a primeira demanda usando a média incorporada, em vez dessa outra fórmula.
fonte
Python 2, 51 bytes
Para cada elemento
y
, acmp
expressão fornece 2 pontos para cada menorx
e 1 ponto para cada igualx
. Essa soma é redimensionada para o intervalo correto adicionando 1 e diminuindo pela metade. O2.
é necessário para evitar a divisão inteira.Python 3, 52 bytes
O Python 3 não possui
cmp
, exigindo uma expressão booleana (+2 bytes), mas possui divisão flutuante (-1 byte).fonte
MATL , 14 bytes
Experimente online! Ou verifique todos os casos de teste (versão ligeiramente modificada do código; cada resultado está em uma linha diferente).
fonte
05AB1E , 13 bytes
Código:
Usa a codificação CP-1252 . Experimente online! .
fonte
R,
1712 bytesLeva a entrada das saídas STDIN para STDOUT. Se a saída é flexível, podemos abandonar o
cat()
.Bastante simples, usa a classificação interna que tem como padrão a média para um desempate.
Em uso:
fonte
cat()
, se depender de mim. Mas não sei qual é o consenso da comunidade.J, 18 bytes
Baseado na solução de Dennis usando o método xnor .
Usar uma abordagem direta requer 24 bytes para mim.
Uso
fonte
Na verdade, 18 bytes
Experimente online!
Essa é essencialmente uma porta da solução Python do xnor .
Explicação:
fonte
APL, 17 caracteres
Supondo que a lista esteja armazenada
X
.Explicação:
Observe que o APL avalia expressões da direita para a esquerda. Então:
∘.=⍨X
=X∘.=X
onde∘.=
está o produto externo usando=
como função diádica. (Onde você normalmente se multiplicaria. Portanto, o produto externo matemático pode ser escrito como∘.×
.)y
ey
é dobrada diretamente usando+
para fornecer um vetor do número de objetos iguais para cada classificação (vamos chamá-loz←+/y
).⍋X
retorna as fileiras deX
y+.×⍋X
fornece o produto interno de nossa matriz y com esse vetor.z
.fonte
Julia, 30 bytes
Isso usa uma abordagem da resposta do @ xnor . Julia tem
cmp
, mas não se vetoriza.Experimente online!
fonte
JavaScript (ES6),
4948 bytesEdit: Salvo 1 byte, reformulando a expressão para que agora pareça com a resposta Python 3 do @ xnor.
fonte