Aufgabe
Berechnen Sie aus einer eingegebenen Liste von Ganzzahlen x 1 … x n eine Liste von Rängen r 1 … r n (eine Permutation von {1… n} ), sodass x r 1 ≤ x r 2 ≤… ≤ x r n . Ersetzen Sie dann für jedes x i seinen Rang durch das arithmetische Mittel der Ränge aller Werte in x , die gleich x i sind . (Das heißt, wenn es einen Gleichstand zwischen gleichen Werten in x gibt , verteilen Sie die Ränge unter allen fair neu.) Geben Sie die modifizierte Liste der Ränge r ' n aus 1 … r' aus. .
(Für Statistikfreaks: Eine solche Rangfolge von Beobachtungen wird im Mann-Whitney- U- Test (Methode zwei, Schritt 1) verwendet.)
Beispiel
Bei einer Eingabeliste [3, -6, 3, 3, 14, 3] wäre die erste Rangliste [2, 1, 3, 4, 6, 5] , wodurch die Liste in [-6, 3, 3, 3, 3, 14] . Dann werden die Ränge für alle 3 s in der Eingabeliste auf (2 + 3 + 4 + 5) ÷ 4 = 3,5 ausgeglichen . Die endgültige Ausgabe ist [3.5, 1, 3.5, 3.5, 6, 3.5] .
Testfälle
[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]
Regeln
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Antworten:
Jelly ,
108 Bytes2 Bytes mit dem
cmp
Trick aus der Antwort von @ xnor gespeichert .Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Pyth, 12
Test Suite
Für jeden Wert berechnet dies das arithmetische Mittel von
[1..frequency]
und addiert die Anzahl der Werte, die kleiner als der aktuelle sind.Dies funktioniert, weil wir für jeden Wert Folgendes berechnen würden:
was wir vereinfachen können:
und nochmal zu:
In Pyth war es jedoch Golfspieler, den ersten Summanden mit dem eingebauten Mittelwert zu berechnen, anstatt mit dieser anderen Formel.
quelle
Python 2, 51 Bytes
Für jedes Element
y
gibt dercmp
Ausdruck 2 Punkte für jedes kleinerex
und 1 Punkt für jedes gleiche anx
. Diese Summe wird durch Addition von 1 und Halbierung in den richtigen Bereich skaliert. Das2.
wird benötigt, um eine Ganzzahldivision zu vermeiden.Python 3, 52 Bytes
Python 3 fehlt
cmp
, erfordert einen Booleschen Ausdruck (+2 Byte), hat aber eine Float-Division (-1 Byte).quelle
MATL , 14 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle (leicht geänderte Version des Codes; jedes Ergebnis steht in einer anderen Zeile).
quelle
05AB1E , 13 Bytes
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
R
1712 BytesÜbernimmt die Eingabe von STDIN-Ausgängen an STDOUT. Wenn der Ausgang flexibel ist, können wir den abwerfen
cat()
.Ziemlich einfach, verwendet den eingebauten Rang, der standardmäßig als Mittelwert für einen Tie Breaker verwendet wird.
In Benutzung:
quelle
cat()
, wenn es nach mir geht. Ich weiß jedoch nicht, wie der Konsens in der Community lautet.J, 18 Bytes
Basiert auf Dennis ' Lösung nach der Methode von xnor .
Die Verwendung eines einfachen Ansatzes erfordert für mich 24 Bytes .
Verwendung
quelle
Eigentlich 18 Bytes
Probieren Sie es online!
Dies ist im Wesentlichen ein Hafen von Python-Lösung xnor .
Erläuterung:
quelle
APL, 17 Zeichen
Angenommen, die Liste ist in gespeichert
X
.Erläuterung:
Beachten Sie, dass APL Ausdrücke von rechts nach links auswertet. Dann:
∘.=⍨X
=X∘.=X
Wo∘.=
wird das äußere Produkt=
als dyadische Funktion verwendet ? (Wo Sie normalerweise multiplizieren würden. So kann das mathematische äußere Produkt als geschrieben werden∘.×
.)y
undy
direkt gefaltet+
, um einen Vektor der Anzahl gleicher Objekte für jeden Rang zu erhalten (nennen wir esz←+/y
).⍋X
liefert die Ränge vonX
y+.×⍋X
gibt das innere Produkt unserer Matrix y mit diesem Vektor an.z
.quelle
Julia, 30 Bytes
Hierbei wird ein Ansatz aus der Antwort von @ xnor verwendet . Julia hat
cmp
, aber es vektorisiert nicht.Probieren Sie es online!
quelle
JavaScript (ES6),
4948 BytesBearbeiten: 1 Byte durch Neuformulierung des Ausdrucks gespeichert, sodass er jetzt wie die Antwort von @ xnor auf Python 3 aussieht.
quelle