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, 123
ist 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 Code-Golf , 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.
quelle
Antworten:
J (
76)EDIT: Oh, warte! Es muss keine Funktion sein!
Gott sei Dank für
i.~
...Oder als benannte Funktion (3 Zeichen mehr, aber nicht funktional unterschiedlich):
Führen Sie Tests durch:
quelle
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.T-SQL (40)
Angenommen, es
@
handelt sich um eine Tabelle, die die Bewertungen als Zeilen enthält.quelle
Pyth , 6
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:
quelle
Python (33 Zeichen)
Funktionell das gleiche wie meine J-Antwort.
quelle
x
soll, zunächst deklarieren und "ausgeben", indem Sie das Ergebnis in einer Variablen speichern.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:
quelle
STATA (16)
Ergebnis ist in b.
Angenommen, c ist eine Variable im Datensatz, die die Eingabe enthält.
quelle
Haskell (31)
Verwendungszweck:
quelle
r l=concat$tail$scanl(\s->map$const$length s+s!!0)[0]$group l
mit 61 ZeichenUm eine Grundlinie festzulegen:
Rubin (38)
Angenommen, es
a
handelt sich um ein Array:(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.)
quelle
JavaScript (E6) 41
Eine Funktion mit einem Array-Argument, die ein Array zurückgibt
In der Firefox-Konsole testen
Ausgabe: [1, 1, 3, 3, 5, 6]
Ausgabe: [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]
quelle
R, 15
mit als Vektor gespeicherter Eingabe
x
,quelle
Powershell (70)
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.
quelle
Java (57)
Verwenden Sie die gleichen Regeln wie bei Allbeert :
Konstante
i
ist alsint[]
Array definiert und enthält die Eingabe,z
enthält die Größe der Eingabe. Andere,l
,c
,x
undn
sind definiert alsint
.Der übrig gebliebene Codeausschnitt lautet:
Das Ergebnis befindet sich im Eingabearray.
quelle
Ruby, 22
Ich habe mir den SO-Thread nicht angesehen, aber ich stelle mir vor, dass sie sich das ausgedacht haben.
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
Aber natürlich sieht das vollständige Programm rund um dieses Snippet so aus
quelle
> <> (47)
Nicht besonders optimiert, nur das Wasser mit meinem ersten Golf zu testen.
Angenommen, die Eingabe ist im Stapel vorab ausgefüllt, sodass das erste Element der Eingabe das erste ist, das entfernt wird.
Testen:
Ausgänge
quelle
Clojure, 35
Mit etwas Java-Interop gemischt in:
REPL-Sitzung:
quelle
C - 62
Als Code-Snippet, da keine Funktion oder ein vollständiges Programm erforderlich war.
Annimmt
a
,n
,j
, undk
sind bereits als definiertint*
,int
,int
, undint
sind, wobeia
ein Array der Eingangs enthält, undn
enthä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.
quelle