Mein erster Code Golfpost, entschuldige mich für etwaige Fehler ...
Kontext
Beim Klettern ( speziell beim Bouldern ) beginnen die Kletternoten für V / Vermin (USA) bei "VB" (die einfachste Note) und gehen dann auf "V0", "V0 +", "V1", "V2", "V3". , 'V4', 'V5' usw. bis 'V17' (die härteste Note).
Aufgabe
Sie nehmen als Eingabe eine Liste / ein Array von Kletternoten und müssen eine Liste / ein Array der Noten, sortiert von der einfachsten bis zur schwierigsten, zurückgeben oder ausdrucken.
Wenn die Eingabe leer ist, geben Sie eine leere Datenstruktur zurück. Andernfalls ist die Eingabe immer gültig.
Testfälle
Input | Output
[] | []
['V1'] | ['V1']
['V7', 'V12', 'V1'] | ['V1', 'V7', 'V12']
['V13', 'V14', 'VB', 'V0'] | ['VB', 'V0', 'V13', 'V14']
['V0+', 'V0', 'V16', 'V2', 'VB', 'V6'] | ['VB', 'V0', 'V0+', 'V2', 'V6', 'V16']
Dies ist eine Code-Golf- Herausforderung.
code-golf
array-manipulation
sorting
Chris_Rands
quelle
quelle
Antworten:
Python 2 ,
5854 BytesProbieren Sie es online!
Wie es funktioniert
quelle
a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))
sind 58 Byte.a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))
ist 2 Bytes kürzer, aber das ist noch zu lang.JavaScript (ES6) / Firefox, 53 Byte
Testfälle
Für Firefox:
Code-Snippet anzeigen
Für Chrome oder Edge (+4 Byte):
Code-Snippet anzeigen
Wie?
Wir wenden 3 aufeinanderfolgende Transformationen an, die zu lexikografisch vergleichbaren Zeichenfolgen führen.
quelle
a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))
Chrome ausprobiert . Es gibt keine richtige Antwort.f(["VB","V0","V0+","V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17"])
Ich bin mir nicht sicher, warum. Die kantenkompatible Version funktioniert gut mit Chrom.Schale , 5 Bytes
Probieren Sie es online! Die Ergebnisse werden zeilenweise gedruckt, aber intern ist dies eine Funktion, die eine Liste von Zeichenfolgen aufnimmt und zurückgibt.
Erläuterung
Dies ist überraschend ähnlich zu Martins Retina-Antwort . Zuerst tun wir das
Öm±
, was "Reihenfolge durch Mapping ist eine Ziffer" bedeutet. Dies stelltVB
,V0
undV0+
in der richtigen Reihenfolge, da sie verglichen[0,0]
,[0,1]
und[0,1,0]
. Als nächstes tun wir dasÖi
, was "Reihenfolge nach ganzzahligem Wert" bedeutet. Gibt bei einer gegebenen Zeichenfolgei
die erste darin vorkommende Ziffernfolge als Ganzzahl oder 0 zurück, wenn keine gefunden wird. Die drei obigen Zeichenfolgen sind alle auf 0 abgebildet und die Sortierung ist stabil, sodass sie in der Ausgabe in der richtigen Reihenfolge angezeigt werden.quelle
Retina , 14 Bytes
Probieren Sie es online!
Erläuterung
Ersetzen Sie
B
durch,!
damit die lexikografische Reihenfolge der NotenVB
(oder dannV!
) vor allen numerischen Noten steht.Sortieren Sie alle Eingabezeilen lexikografisch. Dies gibt nicht das richtige Ergebnis, aber die Reihenfolge ist
V! < V0 < V0+
korrekt.Biegen Sie
V!
zurück inVB
.Sortieren Sie die Zeilen numerisch. Retina sucht einfach nach der ersten Dezimalzahl in einer Zeichenfolge, um den Sortierschlüssel zu bestimmen. Wenn es keine Zahl gibt (z. B. für
VB
), wird der Wert auf festgelegt0
. Das bedeutet , dass alleVB
,V0
undV0+
haben den gleichen Sortierschlüssel. Aber Retinas Sortierung ist stabil und wir haben sie bereits in die richtige relative Reihenfolge gebracht.quelle
V , 3 Bytes
Probieren Sie es online!
Wie funktioniert es?
Dieser Befehl ist fast eine gültige Lösung, da jede Zeile, die nicht nach Zahlen sortiert werden kann (AKA,
VB
), am Anfang platziert wird, ohne dass die Reihenfolge geändert wird. Da es sich jedoch nur um Zahlen handelt, kann es nicht zwischenV0
und unterscheidenV0+
. Da Vim eine stabile Sortierung verwendet, bleibt die zuerst eingegebene Sortierung nach der Sortierung erhalten. So...quelle
C #,
121838283 BytesGespeichert 39 Bytes dank TheLethalCoder und LiefdeWen
Probieren Sie es online!
Bytecount enthält
using System.Linq
.Wie?
VB
, setzen Sie den Wert auf -1, wenn sie gleich istVB0+
, setzen Sie den Wert auf 0.V
.Könnte ein bisschen hacken, aber es funktioniert! :)
quelle
ToArray()
eineIOrderedEnumerable
sollte in Ordnung sein..Remove(0,1)
für zusätzliche -1 Byte :)Ruby ,
52 4241 BytesProbieren Sie es online!
Wie es funktioniert:
Drehen Sie das Problem um, erstellen Sie die vollständige sortierte Liste und ermitteln Sie den Schnittpunkt mit unserer Eingabe.
Vielen Dank an Lynn für das Speichern von 1 Byte.
quelle
->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}
Speichert ein Byte.Pyth , 16 Bytes
Port of Python Antwort von OP.
Testsuite .
quelle
05AB1E ,
17138 BytesProbieren Sie es online!
quelle
†
ist besser alsD"VB"åiÁ
durch einen Long-Shot.Gelee , 9 Bytes
Ein monadischer Link, der eine Liste von Zeichenlisten erstellt und die sortierte Liste zurückgibt.
Probieren Sie es online! (die Fußzeile formatiert das Ergebnis schön)
Wie?
quelle
Haskell , 55 Bytes
Probieren Sie es online!
quelle
Zum Auftakt hier ist meine Python 3-Lösung ...Entschuldigung, habe dies zu früh gegen die Konvention gepostet und poste es jetzt erneut ...Python 3 ,
6967 BytesProbieren Sie es online!
quelle
Schnelle 3 , 102 Bytes
Dies ist eine Funktion. Sie können es als solches bezeichnen:
Probieren Sie es online!
Wie funktioniert das?
Dies ist im Grunde eine Portierung der erstaunlichen Javascript-Antwort von @Arnauld , die jedoch für Swift optimiert ist.
Es ordnet jeden der Werte lexikografisch sortierbaren Zeichenfolgen zu, wie in der folgenden Tabelle gezeigt:
Code Erklärung
String((Int($0,radix:32) ?? 992)%334)
- Konvertiert jeden String von einer Basis-32-Zahl in eine Dezimalzahl. Wenn der Wert "V0 +" ist, gibt der AufrufInt(_:radix:)
von "nil" zurück und wir nehmen den Wert von "V0", 992. Zusätzlich nehmen wir das Ergebnis vonmod 334
und konvertieren es schließlich in "String".+$0
- Fügt den aktuellen Wert zum oben erstellten String hinzu. Wenn zum Beispiel der String istV9
, gibt die obige Funktion zurück333
und wir addierenV9
, was dazu führt333V9
.var r={...}
- Deklariert eine Variabler
für einen anonymen Abschluss, da sie viele Bytes spart, da sie zweimal verwendet wird.func f(l:[String])
- Definiert eine Funktionf
mit einem Parameterl
, einer Liste von Strings.print(l.sorted(by:{r($0)<r($1)}))
- Gibt das Ergebnis der Sortierung der angegebenen Liste aus, wobei der Schlüssel dier
oben definierte Variable ist.quelle
PowerShell , 45 Byte
Probieren Sie es online!
Verwendet den gleichen Prozess wie die Ruby-Antwort von GB, um die vollständige Argumentliste in sortierter Reihenfolge zu erstellen, und wählt dann diejenigen aus, die
-in
die Eingabeliste darstellen.quelle
Google Sheets, 142 Bytes
Die Eingabe ist eine Zeichenfolge,
A1
bei der jeder Eintrag durch ein Komma getrennt ist.Ausgabe ist die Zelle der Formel plus die
n-1
Zellen darunter, in denenn
die Anzahl der Einträge angegeben istA1
.Es ist eine lange, chaotische Formel, also packen wir sie aus.
If(A1="","",~)
behebt die Null-Eingabe Ohne dies gibt eine leere Eingabe a zurück#VALUE!
Fehler zurück, da dieSplit
Funktion bei leeren Eingaben nicht funktioniert.Transpose(Split(A1,","))
spaltetA1
das Komma und transponiert es in eine Spalte, da dieSort
Funktion nur für Spalten funktioniert.Transpose(IfError(Find(),Value()+9))
ist bricht in diese Stücke:Find(Split(A1,","),"VBV0V0+")
versucht, jeden Parameter in dieser Zeichenfolge zu finden. Diese ersten drei sind die einzigen, die als Zeichenfolgen sortiert werden müssen, damit wir sie verwendenFind
ihre Sortierreihenfolge ermitteln können.Value(Mid(Split(A1,","),2,3))+9
Ruft den numerischen Wert der Note ab. Dies ist nur für V1 und höher von Bedeutung, sodass die Sortierung numerisch einwandfrei ist. Am+9
Ende ist sicherzustellen, dass V1 nach V0 + kommt, da seinFind
Wert wäre5
. Also nur technisch+5
erforderlich, aber es kostet mich keine weiteren Bytes, um sicherzustellen, dass es richtig sortiert ist.IfError(Find(~),Value(~))
gibt das zurückFind
Wert zurück, wenn die Zeichenfolge gefunden wurde (dh die Note ist VB, V0 oder V0 +). Wird es nicht gefunden, wird der numerische Wert der Note plus neun zurückgegeben.Transpose(IfError(~))
verwandelt es wieder in eine Spalte, damitSort
es verwendet werden kann.Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1)
Fassen Sie alles zusammen, indem Sie die geteilten Eingaben in aufsteigender Reihenfolge sortieren.ArrayFormula(~)
Bricht das Ganze so um, dass es die Ergebnisse als Array zurückgibt, anstatt nur den ersten Wert in diesem Array zurückzugeben. Dies bewirkt, dass die Formel in einer Zelle auch die Zellen darunter füllt.quelle
Bash + Coreutils, 21
Der GNU
sort
--V
Versionssortiermodus macht fast das, was wir wollen. Schalten Sie dieB
für ein.
und wir sind fertig.Probieren Sie es online aus .
quelle
Haskell ,
90848361 BytesProbieren Sie es online!
f
ist eine Funktion, die Kletternoten in vergleichbare Saiten umwandelt. Wenn konvertiert wirdVB
, um die leere Zeichenfolge zu sein, sodass sie die höchste Priorität erhält, wird sieV1
durchX
Zeichenfolgen ersetzt, die drei Zeichenfolgen lang sind, um die Priorität von zu verringernV10
- zuV17
. Für den Rest machen wir nichts.So sortieren Sie die Liste verwenden wir
Data.Lists
‚s -sortOn
Funktion (wie von Lynn vorgeschlagen) einen Punkt freie Funktion zu erstellen.quelle
g=sortOn f
, was auch drin istData.List
.f(_:'1':a)='X':a
speichert 4 Byte![a]
AnsonstenV1
muss das Muster angepasst werden. Dies ist das Problem, das ich zu umgehen versuche.R , 45 Bytes
Wie funktioniert das?
quelle
Python2, 77 Bytes
quelle
Jelly ,
1711 BytesProbieren Sie es online!
quelle
TXR Lisp : 45 Bytes
Lauf:
quelle
Perl 5 , 56 + 1 (-a) = 57 Bytes
Probieren Sie es online!
quelle