Ordnen Sie eine Liste der Ergebnisse mit "Überspringen"


8

Bei einer Liste von Bewertungen (nicht negative Ganzzahlen), die vom größten zum kleinsten vorsortiert sind:

[ 10, 10, 6,  6,  4,  0]

Weisen Sie jeder Punktzahl einen ganzzahligen Rang zu, beginnend mit 1 und aufsteigend, sodass gleiche Punktzahlen den gleichen Rang haben (dh sie sind gebunden):

[ 1, 1, 3, 3, 5, 6 ]

Bei Unentschieden werden die Ränge "übersprungen", z. B. da die erste und die zweitgrößte Punktzahl (10 und 10) unentschieden sind, haben beide Rang 1 und Rang 2 wird "übersprungen", also die drittgrößte Punktzahl ( 6) hat Rang 3.

Geben Sie eine Liste nicht absteigender Ränge aus, die den Eingabewerten entsprechen.

Beispiele

In:  10 10  6  6  4  0
Out:  1  1  3  3  5  6
In:  10  9  8
Out:  1  2  3
In:   0  0  0
Out:  1  1  1
In:  16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
Out:  1  2  2  4  5  5  7  8  8  8 11 12 12 12 15

Eingang

Angenommen, alle Punkte liegen zwischen 0 und einschließlich 1.000, und die Eingabe enthält nicht mehr als 500 Punkte. Die Eingabe kann in einem beliebigen Format erfolgen, das für die Sprache Ihrer Wahl geeignet ist (einschließlich, aber nicht beschränkt auf STDIN, Argumente für eine Funktion, ein Array, das bereits in einer Variablen gespeichert ist usw.).

Ausgabe

Rückgabe oder Speicher in einer Variablen die resultierende geordnete Liste von Reihen, oder schreiben Sie es auf STDOUT in eine menschenlesbare Art und Weise (zB 1 2 3, [1,2,3], 1\n2\n3\n, und { 1, 2, 3 }sind alle in Ordnung, 123ist nicht aus Mangel an Trennzeichen). Die Eingabewerte können zusammen mit den entsprechenden Ausgaberängen gespeichert / gedruckt werden, dies ist jedoch nicht erforderlich.

Beschränkungen

Sie können jede Standardbibliothek verwenden, die Ihre Sprache bietet. Es gelten Standardlücken.

Gewinnbedingungen

Dies ist , also gewinnt das kleinste Programm (in Bytes). Bei einem Unentschieden gewinnt die Antwort mit den meisten Stimmen.

Anmerkungen

Dies basiert auf einer Ruby-Frage zu SO , die einige interessante Antworten hervorgebracht hat, darunter eine sehr kurze. Ich ermutige Sie, Ihre eigenen Lösungen zu finden, bevor Sie sich dort umsehen.


1
Ich denke, dies wäre besser und würde bessere Antworten verbieten, wenn es nicht vorsortiert wäre und die Reihen ihre ursprüngliche Reihenfolge beibehalten müssten. Das heißt [10, 4, 6, 0, 6, 10] wäre [1, 5, 3, 6, 3, 1]
Cruncher

Das ist ein guter Punkt, @Cruncher; Fühlen Sie sich frei, einen neuen Thread zu starten.
Jordanien

Antworten:


8

J ( 7 6)

EDIT: Oh, warte! Es muss keine Funktion sein!

>:i.~y

Gott sei Dank für i.~...

>:@:i.~

Oder als benannte Funktion (3 Zeichen mehr, aber nicht funktional unterschiedlich):

f=:>:@:i.~

Führen Sie Tests durch:

   f=:>:@:i.~
   f 10 10  6  6  4  0
1 1 3 3 5 6
   f 10  9  8
1 2 3
   f 0  0  0
1 1 1
   f 16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
1 2 2 4 5 5 7 8 8 8 11 12 12 12 15

1
Möchten Sie kommentieren, was dies bewirkt?
CorsiKa

1
1+i.~ist die Art von Zug, die sowohl zugewiesen als auch inline verwendet werden kann und daher als Funktion ohne die üblichen Zugparens verwendet werden kann. Das sind 5 Zeichen. Und für die Aufzeichnung, @macht den gleichen Job wie @:in diesem Fall, so dass Sie einen einfachen Charakter dort gespeichert haben könnten.
Algorithmushai

8

T-SQL (40)

SELECT RANK()OVER(ORDER BY B DESC)
FROM @

Angenommen, es @handelt sich um eine Tabelle, die die Bewertungen als Zeilen enthält.


3

Pyth , 6

m'XYdY

Die Liste wird zunächst in Y gespeichert. Dies entspricht funktional der 22-stelligen Rubinlösung: Ordnen Sie d in Y dem Index von d in Y plus 1 zu und drucken Sie dann.

Beispiel:

$ echo "=Y[16 15 15 12 11 11 10 9 9 9 8 2 2 2 0)m'XYdY" | python3 pyth.py

[1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]

3

Python (33 Zeichen)

lambda x:[1+x.index(i)for i in x]

Funktionell das gleiche wie meine J-Antwort.


Da die Eingabe im Format Ihrer Wahl erfolgen kann, können Sie das Array, in dem gespeichert werden xsoll, zunächst deklarieren und "ausgeben", indem Sie das Ergebnis in einer Variablen speichern.
isaacg

3

APL, 2 Bytes

⍳⍨

In ⎕IO←1. Dyadic iota sucht sein rechtes Argument in sein linkes Argument. Der Operator kopiert das rechte Argument in das linke Argument, wenn der Operand monadisch verwendet wird. Daher sucht die Lösung einfach die Position jedes einzelnen Elements des Vektors in sich.

Proben:

    ⍳⍨10 10 6  6  4  0
1 1 3 3 5 6
    ⍳⍨0  0  0 
1 1 1 
    ⍳⍨16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
1 2 2 4 5 5 7 8 8 8 11 12 12 12 15

2

STATA (16)

egen b=rank(c),f

Ergebnis ist in b.

Angenommen, c ist eine Variable im Datensatz, die die Eingabe enthält.


1
Stata im Code Golf? Dieser öffnet wirklich eine Dose Würmer.
Shadowtalker

2

Haskell (31)

f x=succ.(`elemIndexJust`x)<$>x -- Requires the Safe module

Verwendungszweck:

f [10,10,6,6,4,0] --evaluates to [1,1,3,3,5,6]

Meine Lösung war r l=concat$tail$scanl(\s->map$const$length s+s!!0)[0]$group lmit 61 Zeichen
stolzer Haskeller

Außerdem funktioniert Ihre erste Lösung aufgrund von Monomorphismus-Einschränkungen nicht
stolzer Haskeller

Diese verdammte Einschränkung des Momoprophismus ... Ich habe es in GHCI zum Laufen gebracht, aber da es nicht kompiliert werden kann, sollte ich es entfernen ...
recursion.ninja

Sie könnten es neu machen, damit es funktioniert
stolzer Haskeller

1

Um eine Grundlinie festzulegen:

Rubin (38)

Angenommen, es ahandelt sich um ein Array:

r,i=1,0;a.map{|x|i+=1;x==a[i-2]?r:r=i}

(Dies basiert auf der Antwort von falsetru auf den ursprünglichen SO-Thread und ist nicht meine ursprüngliche Arbeit. Ich weiß, dass es eine Ruby-Lösung mit 22 Zeichen gibt, aber ich würde gerne sehen, dass jemand eine kürzere als die in Ruby findet.)


1

JavaScript (E6) 41

Eine Funktion mit einem Array-Argument, die ein Array zurückgibt

F=s=>s.map((n,i)=>p-n?(p=n,r=i+1):r,p=-1)

In der Firefox-Konsole testen

F([10,10,6,6,4,0])

Ausgabe: [1, 1, 3, 3, 5, 6]

F([16, 15, 15, 12, 11, 11, 10, 9, 9, 9, 8, 2, 2, 2, 0])

Ausgabe: [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]



1

Powershell (70)

$n=1;$c=0;$l=$a[0];$a|%{if($l-eq$_){$n}else{$n=$c+1;$n}$l=$a[$c];$c++}

Es sind nur 51 Zeichen, wenn Sie die Variablenzuweisungen zu Beginn herausnehmen, wodurch ich mich etwas weniger unangemessen fühle.

Angenommen, $ a wird zugewiesen und sortiert, wie vom Problem angegeben. $ n verfolgt den Rang, $ c ist nur ein Zähler, der mit $ l arbeitet, dem letzten im Array überprüften Element.

Wenn ich etwas tun kann, um dies zu verbessern, würde ich es gerne wissen.


1

Java (57)

Verwenden Sie die gleichen Regeln wie bei Allbeert :

Konstante iist als int[]Array definiert und enthält die Eingabe, zenthält die Größe der Eingabe. Andere, l, c, xund nsind definiert als int.

Der übrig gebliebene Codeausschnitt lautet:

l=0;c=1;for(x=0;x<z;x++){n=i[x];i[x]=n==l?c:(c=x+1);l=n;}

Das Ergebnis befindet sich im Eingabearray.


1

Ruby, 22

Ich habe mir den SO-Thread nicht angesehen, aber ich stelle mir vor, dass sie sich das ausgedacht haben.

a.map{|i|a.index(i)+1}

Edit: Ja, das ist es. Ich bezweifle, dass es in Ruby möglich ist, kleiner zu werden, es sei denn, Sie nehmen an, dass Sie es als Array-Methode definieren, dann können Sie es in 18 Zeichen mit tun

map{|i|index(i)+1)

Aber natürlich sieht das vollständige Programm rund um dieses Snippet so aus

class Array
  def ranks
    map{|i|index(i)+1)
  end
end

p [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15].ranks

1

> <> (47)

Nicht besonders optimiert, nur das Wasser mit meinem ersten Golf zu testen.

r:1:nr2&>ao$:@=?vr~&:|   
&1+&l3)?^;      >r:nr

Angenommen, die Eingabe ist im Stapel vorab ausgefüllt, sodass das erste Element der Eingabe das erste ist, das entfernt wird.

Testen:

fish.py ranks.fish -v 1 2 3 4 5 6 7 8 9 9 10 10

Ausgänge

1
1
3
3
5
6
7
8
9
10
11
12

1
"Testen des Wassers" in einem Fischbeitrag brachte mich zum Lächeln
Ingo Bürk

1

Clojure, 35

Mit etwas Java-Interop gemischt in:

(fn[l](map #(+ 1(.indexOf l %)) l))

REPL-Sitzung:

golf> ((fn[l](map #(+ 1(.indexOf l %)) l)) [10 10  6  6  4  0])
(1 1 3 3 5 6)
golf> ((fn[l](map #(+ 1(.indexOf l %)) l)) [16 15 15 12 11 11 10  9  9  9  8  2  2  2  0])
(1 2 2 4 5 5 7 8 8 8 11 12 12 12 15)

0

C - 62

Als Code-Snippet, da keine Funktion oder ein vollständiges Programm erforderlich war.

Annimmt a, n, j, und ksind bereits als definiert int*, int, int, und intsind, wobei aein Array der Eingangs enthält, und nenthält die Länge des Eingangs.

Dies schlägt bei der Eingabe der Länge 0 fehl. In diesem Fall werden 3 weitere Zeichen benötigt.

printf("1");for(k=j=1;++j<=n;)printf(" %d",*a-*(a+++1)?k=j:k);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.