Konvertiert sortierte Ruby-Arrays in Ränge mit möglichen Wiederholungen

7

Ich habe das folgende Array von Zahlen in Ruby (höher ist besser), und ich möchte sie ordnen. Mit anderen Worten, ich möchte die folgende sortierte Liste konvertieren:

%Vor%

zu den folgenden Rängen:

%Vor%

Zum Beispiel bekommt der Gewinner den ersten Platz, es gibt einen Gleichstand für den zweiten Platz und so weiter. Der wichtige Punkt ist natürlich, dass Verbindungen möglich sind und diese Verbindungen dann die entsprechenden Ränge überspringen müssen. Eine beliebige Anzahl von Verbindungen ist möglich (3 Personen teilen sich den zweiten Platz).

Gibt es eine elegante Möglichkeit, diese Art von Operation durchzuführen?

    
aardvarkk 30.07.2014, 16:36
quelle

6 Antworten

11

Enumerable#group_by :

%Vor%

AKTUALISIEREN

%Vor%     
falsetru 30.07.2014 16:45
quelle
6

Verwenden Sie Enumerable#each_with_index um zu vermeiden, dass Sie die Array für jede Iteration:

%Vor%

Edit: Ich denke, ich sollte auch meinen Benchmark, hier sind die Ergebnisse

%Vor%

Nicht der beste, aber immer noch einen guten Kampf!

    
simongarnier 30.07.2014 18:42
quelle
5
%Vor%

Bearbeiten:

Benchmark von @Jordan gist ( Ссылка )

%Vor%     
Iceman 30.07.2014 17:31
quelle
4

Ich weiß nicht über "elegant", aber hier ist eine kurze, lesbare, super-unkomplizierte Lösung:

%Vor%

Benchmarked

Ich denke, wir machen das ...

Bearbeiten: Dieser Beitrag wurde viel zu lang, deshalb habe ich den Benchmark-Code in einen Gist verschoben: Ссылка

Hier sind die Ergebnisse:

%Vor%

Edit: Ich hatte einige Sachen hier über Enumerator :: Lazy < a, aber es stellt sich heraus, dass ich es falsch benutzt habe. Es hat die Performance in keinem Fall verbessert.

    
Jordan Running 30.07.2014 16:51
quelle
2
%Vor% %Vor%     
sawa 30.07.2014 16:45
quelle
1

Ein anderer Weg, der Enumerable # chunk verwendet.

Code

%Vor%

Beispiel

%Vor%

Erläuterung

Für das Array a oben:

%Vor%     
Cary Swoveland 31.07.2014 00:56
quelle

Tags und Links