Zadanie
Biorąc pod uwagę wejściową listę liczb całkowitych x 1 … x n , oblicz listę rang r 1 … r n (permutacja {1… n} ), aby x r 1 ≤ x r 2 ≤… ≤ x r n . Następnie dla każdego x i zamień jego rangę na średnią arytmetyczną rang wszystkich wartości w x, które są równe x i . (To znaczy, ilekroć występuje remis między równymi wartościami w x , dość redystrybuuj rangi między nimi wszystkimi.) Wyprowadzaj zmodyfikowaną listę rang r „ 1 … r”n .
(W przypadku maniaków statystycznych: taki ranking obserwacji stosuje się w teście U Manna – Whitneya (metoda druga, krok 1.)
Przykład
Biorąc pod uwagę listę wejściową [3, -6, 3, 3, 14, 3] , pierwsza lista rang byłaby [2, 1, 3, 4, 6, 5] , co posortowałoby listę na [-6, 3, 3, 3, 3, 14] . Następnie szeregi dla wszystkich 3 s na liście wejść są wyrównywane do (2 + 3 + 4 + 5) ÷ 4 = 3,5 . Ostateczna wydajność wynosi [3,5, 1, 3,5, 3,5, 6, 3,5] .
Przypadki testowe
[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]
Zasady
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Odpowiedzi:
Galaretka ,
108 bajtówZaoszczędzono 2 bajty, wykorzystując
cmp
lewę z odpowiedzi @ xnor .Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Pyth, 12
Pakiet testowy
Dla każdej wartości oblicza to średnią arytmetyczną
[1..frequency]
i dodaje liczbę wartości mniejszą niż bieżąca.Działa to, ponieważ dla każdej wartości obliczamy:
które możemy uprościć:
i ponownie do:
Jednak w Pyth golfista obliczył pierwsze lato przy użyciu wbudowanej średniej, a nie innej formuły.
źródło
Python 2, 51 bajtów
Dla każdego elementu
y
Thecmp
ekspresja daje 2 punkty dla każdej mniejszejx
i 1 dla każdego punktu równex
. Suma ta jest przeskalowywana do odpowiedniego zakresu przez dodanie 1 i zmniejszenie o połowę. Jest2.
to konieczne, aby uniknąć podziału na liczby całkowite.Python 3, 52 bajty
Brakuje w Pythonie 3
cmp
, wymagając wyrażenia logicznego (+2 bajty), ale ma dzielenie zmiennoprzecinkowe (-1 bajt).źródło
MATL , 14 bajtów
Wypróbuj online! Lub zweryfikuj wszystkie przypadki testowe (nieco zmodyfikowana wersja kodu; każdy wynik znajduje się w innej linii).
źródło
05AB1E , 13 bajtów
Kod:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
R,
1712 bajtówPrzenosi dane wejściowe z wyjść STDIN do STDOUT. Jeśli wyjście jest elastyczne, możemy porzucić
cat()
.Dość proste, wykorzystuje wbudowaną pozycję, która domyślnie ustawia się jako średnia dla remisu.
W użyciu:
źródło
cat()
, jeśli to zależy ode mnie. Nie wiem jednak, jaki jest konsensus społeczności.J, 18 bajtów
Oparty na rozwiązaniu Dennisa z wykorzystaniem metody xnor .
Korzystanie z prostego podejścia wymaga dla mnie 24 bajtów .
Stosowanie
źródło
Właściwie 18 bajtów
Wypróbuj online!
Jest to zasadniczo port xnor w języku Python .
Wyjaśnienie:
źródło
APL, 17 znaków
Zakładając, że lista jest przechowywana w
X
.Wyjaśnienie:
Zauważ, że APL ocenia wyrażenia od prawej do lewej. Następnie:
∘.=⍨X
=X∘.=X
gdzie∘.=
jest produktem zewnętrznym=
używanym jako funkcja dyadyczna. (Gdzie normalnie byś się pomnożył. Tak więc matematyczny produkt zewnętrzny można zapisać jako∘.×
.)y
iy
jest bezpośrednio składana za pomocą,+
aby dać wektor liczby równych obiektów dla każdej rangi (nazwijmy toz←+/y
).⍋X
zwraca szeregiX
y+.×⍋X
daje iloczyn wewnętrzny naszej macierzy y z tym wektorem.z
.źródło
Julia, 30 bajtów
To wykorzystuje podejście z odpowiedzi @ xnor . Julia ma
cmp
, ale nie wektoryzuje.Wypróbuj online!
źródło
JavaScript (ES6),
4948 bajtówEdycja: Zapisano 1 bajt poprzez przeformułowanie wyrażenia, aby teraz wyglądało jak odpowiedź @ xnor na Python 3.
źródło