Eingang:
- Ein Array mit drei ganzen Zahlen:
0
,1
und2
in beliebiger Reihenfolge (dh[2, 0, 1]
) - Und eine Zeichenfolge mit einer Länge> = 2, die nur alphabetische Buchstaben (sowohl Groß- als auch Kleinbuchstaben) und Ziffern (dh
a1B2c3
) enthält.
Ausgabe:
Basierend auf dem Array sortieren wir den String und geben ihn aus.
Wie funktioniert das?
- Die Anordnung gibt die Reihenfolge der Priorität
a-z
,A-Z
und0-9
, wobei die ersten0
; zweites Wesen1
; und drittes Wesen2
. - Darauf aufbauend können dann die einzelnen Zeichen des Strings geordnet werden.
Beispiel:
- Array:
[2, 0, 1]
- Zeichenfolge:
a1B2c3
Aufgrund des Arrays wissen wir, dass unsere Reihenfolge Vorrang hat 0-9a-zA-Z
.
Auf dieser Basis können wir die Zeichenfolge konvertieren und Ausgang: 123acB
.
Herausforderungsregeln:
- Für das Array können Sie zwischen einer 0-indizierten und einer 1-indizierten Eingabe wählen. Dies
[3, 1, 2]
ist auch eine gültige Eingabe, wenn Sie 1-indizierte Arrays bevorzugen. - Die Zeichenfolge (Eingang und Ausgang) enthält nur gültige Zeichen:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
. - Wenn Ihre Sprache Arrays nicht unterstützt (oder wenn Sie wählen), können Sie Strings anstelle von Arrays für den ersten Parameter (dh
012
,[0,1,2]
usw.).
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Testfälle:
[2, 0, 1] & a1B2c3 -> 123acB
[2, 1, 0] & aAaA909UuHWw9gh2 -> 02999AAHUWaaghuw
[2, 1, 0] & 6Bx43 -> 346Bx
[1, 0, 2] & jfjf33g -> ffgjj33
[0, 2, 1] & AbC13 -> b13AC
[1, 2, 0] & Qfl0l -> Q0fll
[0, 1, 2] & 9870abcABC -> abcABC0789
[0, 2, 1] & test123 -> estt123
[2, 0, 1] & WHAT -> AHTW
[2, 0, 1] & WhAt -> htAW
[1, 0, 2] & 102BACbac -> ABCabc012
code-golf
string
array-manipulation
sorting
Kevin Cruijssen
quelle
quelle
"123"
ein gültiges Format für den ersten Parameter?123
,012
,[0,1,2]
,[0, 1, 2]
,0;1;2
oder was immer Sie bevorzugen.Antworten:
05AB1E ,
151412 BytesCode:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
²
und using₂
anstelle von entfernen26
.Python 2,
6766 BytesTeste es auf Ideone .
quelle
JavaScript (ES6), 87 Byte
Wenn das Eingabearray die Reihenfolge der drei Bereiche anstelle der Rangfolge angegeben hätte (dies macht nur einen Unterschied für
[1, 2, 0]
und[2, 1, 0]
deren Effekte werden vertauscht), hätte dies für 80 Bytes funktioniert:Ich habe die Frage falsch verstanden und trotzdem 7 positive Stimmen erhalten. Zögern Sie nicht, Ihre Upvotes zu entfernen und geben Sie sie stattdessen an @CharlieWynn weiter, der die beste Korrektur für meinen Ansatz gefunden hat.
quelle
Array.sort
den optionalen Funktionsparameter zu verwenden, aber das ist viel besser.Jelly , 13 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Pyth,
171615 BytesTestsuite.
Vielen Dank an @FryAmTheEggman für ein Byte und @Jakube für ein anderes!
quelle
'UT
anstelle von verwendens'MT
.'UT
aber ein Fehler und`UT
führt nicht zur selben Zeichenfolge.Javascript es6 77 Bytes
quelle
?
s zu jedem regulären Ausdruck wird sichergestellt, dass die Übereinstimmung Ergebnisse zurückgibt (meist leere Zeichenfolgen, die jedoch trotzdem verschwinden), wodurch(||[])
insgesamt 3 Byte gespart werden.TSQL,
199191 BytesGolf gespielt:
Ungolfed:
Geige
quelle
APLX , 19 Bytes
⎕a⎕A⎕D
untere obere Ziffern(
…)[a]
Nach Array neu anordnen a∊
ebnen(
...)⍋s
nach diesem „Alphabet“, geben die Indizes , die Zeichenfolge sortieren würde ss[
...]
benutze das, um s nachzubestellenquelle
⎕a
, da es sich um einen Quad-Namen handelt, bei dem die Groß- und Kleinschreibung beachtet wird. Viel besser (zum Golfen und im Allgemeinen), wofür ich Lobbying betreibe; Groß-⌈
und⌊
Kleinschreibung auf Charakterdaten zu bekommen und zu klappen, genau wie in K. Dann haben wir⌊⎕A
statt⎕a
.Python 2, 121 Bytes
quelle
Clojure, 74 Bytes
Ruft für jeden Wert in der ersten Liste den entsprechenden regulären Ausdruck ab und wendet ihn auf die Eingabezeichenfolge an. Das Ergebnis ist eine Liste von Symbollisten, die dem regulären Ausdruck entsprechen. Sortieren Sie dann jeden Eintrag, verknüpfen Sie das Ergebnis zu einer Liste und transformieren Sie es in einen String.
Sie können es hier online sehen: https://ideone.com/dqAkxg
quelle
Retina ,
4339 BytesDie Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus. Der Zeilenvorschub am Ende ist signifikant.
Als Eingabe wird die Sortierreihenfolge als nullbasierte Liste ohne Begrenzer in der ersten Zeile und die zu sortierende Zeichenfolge in der zweiten Zeile erwartet, z
Probieren Sie es online!
Erläuterung
Ich werde das obige Eingabebeispiel verwenden, um Sie durch den Code zu führen:
Stufe 1: Substitution
Die Regex selbst ist einfach
.
(entspricht jedem Nicht-Zeilenvorschub-Zeichen), mit dem umgeben!..."
. Dies2=
ist jedoch eine Einschränkung , die Retina anweist, die Auswechslung nur auf das zweite Match der Regex anzuwenden. Also bekommen wir das:Stufe 2: Transliteration
Eine Transliterationsstufe führt einfach eine zeichenweise Substitution durch. Das
¶
stellt einen Zeilenumbruch dar undd
erweitert sich zu0123456789
(obwohl wir danach alle Ziffern ignorieren können2
). Das heißt, diese Transliteration entspricht dem folgenden Mapping:Die
04
an der Vorderseite sind zwei Grenzen, die zusammen zeigen , dass nur die ersten vier Zeichen aus dieser Menge transkribiert werden sollen. Das sind zufällig die Ziffern in der ersten Zeile sowie der Zeilenvorschub, der die beiden Zeilen trennt.Am Anfang der Zeichenfolge befinden sich nun drei Paare dieser Zeichen:
Beachten Sie, dass die zweiten Zeichen der Paare einfach in ihrer normalen ASCII-Reihenfolge sind (und immer gleich sein werden). Wir werden diese später verwenden, um die Zeichengruppen in der Haupteingabe in der erforderlichen Reihenfolge zu sortieren.
Die ersten Zeichen sind etwas interessanter: Ihre Bedeutung liegt
%
vor den Ziffern in der ASCII-Tabelle,@
vor den Großbuchstaben (aber nach den Ziffern) und^
vor den Kleinbuchstaben (aber nach den Großbuchstaben). Dies hilft uns, die Positionsmarkierungen (dh das zweite Zeichen in jedem Paar) mit dem richtigen Zeichensatz zu gruppieren.Stufe 3: Sortieren
Dies ist eine einfache Sortierstufe. Es stimmt mit zwei Zeichen überein, wenn das erste kein Wortzeichen ist (und damit mit allen drei Paaren, über die ich gerade gesprochen habe) oder mit einem einzelnen Zeichen (und stimmt mit jedem Zeichen der Haupteingabe einzeln überein), und sortiert diese Zeichenfolgen. Dies hat zwei Zwecke: Es bringt die Zeichen in jeder Gruppe in die richtige Reihenfolge (und da die Sortierung stabil ist, wird diese Reihenfolge in der nächsten Stufe nicht durcheinander gebracht) und
%@^
es fügt aufgrund der Markierungen die Paare in das Feld ein richtige positionen:Stufe 4: Sortieren
Diese Stufe sortiert alle Übereinstimmungen des
.\w+
regulären Ausdrucks, die aufgrund von Gier mit einer Positionsmarkierung (dh einer von!"#
) zusammen mit allen Wortzeichen danach übereinstimmen . Das heißt, es werden diese drei Zeichenfolgen sortiert, deren Reihenfolge ausschließlich durch das Markierungszeichen bestimmt wird:"24! BOR #afo
Während dies um diese Marker schlurft (während die anderen drei Marker an Ort und Stelle bleiben), bringt es vor allem die Ziffern und Buchstaben in die richtige Reihenfolge:
Stufe 5: Substitution
Alles, was übrig bleibt, ist eine kleine Bereinigung, bei der wir alle Markierungen entfernen, indem wir sie abgleichen und durch nichts ersetzen.
quelle
JavaScript (ES6), 65
Hinweis: Die 'natürliche' ASCII-Reihenfolge ist 0-9, AZ, az, das ist genau das Gegenteil von OP 0,1,2. So
quelle
Haskell,
6263 BytesAnwendungsbeispiel:
"cD12ab" # [2,0,1]
->"12abcD"
.Wie es funktioniert:
Edit: @Christian Sievers hat einen Fehler gefunden. Vielen Dank! Behoben für 1 zusätzliches Byte.
quelle
Stax , 15 Bytes
Führen Sie es online aus und debuggen Sie es
Diese 15-Byte-Übermittlung ist in eine Variante des CP437-Zeichensatzes gepackt . Die entsprechende ASCII-Darstellung benötigt 18 Byte:
Ziemlich sicher, dass es weiter reduziert werden kann.
VlVd+
kann auch seinVLA|(
, welches links das0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
um zehn elemenets dreht . Es kann auch der gesamte Code seinVlVd+26/,e@:f,{[Io
, der den Eingabestapel zweimal liest, anstatt sie alle zu Beginn des Hauptstapels zu lesen, und ein anderes (traditionelleres) Eingabeformat verwendet, wie in dieser Abbildung gezeigt .quelle
Dyalog APL , 22 Bytes
(819⌶⎕A)
falten Sie das Großbuchstaben in Kleinbuchstaben(
…)⎕A⎕D[a]
Untere obere Ziffern neu sortiert nach Array a∊
ebnens⍋⍨
für den String s erhalten Sie die Indizes, die s nach diesem "Alphabet" sortieren würdens[
...]
benutze das, um s nachzubestellenquelle
PowerShell v2 +, 107 Byte
Ich erforsche Algorithmen mit Regex, aber bisher scheinen sie alle länger zu sein.
Übernimmt Eingaben als explizites Array
$n
(siehe Beispiele unten) und als String,$s
der sofort in ein char-Array umgewandelt wird. Wir sind dann die Konstruktion drei Elemente eines neuen dynamischen Arrays, von denen jeder mit einem gekapselten-join
:-
(($s=$s|sort)|?{$_-ge97})
-
($s|?{$_-in65..96})
-
($s|?{$_-lt58})
Das erste nehmen wir
$s
und laufen es durchSort-Object
. Zum Glück wird bei der Sortierung zwischen Groß- und Kleinschreibung unterschieden, da wir sie bereits als Zeichen-Array umgewandelt haben. Das wird in a gespeichert$s
und dannWhere-Object
mit einer Klausel größer als97
(dh ASCII-Kleinbuchstabena-z
) weitergeleitet. Der zweite ist fürA-Z
und der dritte für0-9
.Somit haben wir jetzt ein Array von Zeichenfolgen, wobei jede Zeichenfolge aus einem der drei Zeichentypen besteht und sortiert ist. Wir schneiden das mit
[$n]
und dann-join
das Ergebnis zusammen, um unsere endgültige Ausgabezeichenfolge zu bilden. Das bleibt in der Pipeline und das Drucken ist implizit.Testfälle
quelle
Ruby, 56 Bytes
Portiert von @Dennis Antwort.
Eine alternative 58-Byte-Lösung, die mir besser gefällt, die von @Neil inspiriert und leicht von seiner Antwort abgeändert wurde.
Probieren Sie eine der beiden Versionen online aus! (Auskommentierte Version ist die alternative Lösung)
quelle
32-Bit-x86-Computercode, 70 Byte
In hex:
Diese Prozedur erwartet, dass die Sortierreihenfolge
ESI
der Zeichenklassen eine nullterminierte Zeichenfolge mit drei Zeichen (0..2) ist und dass die Zeichenfolge sortiert wirdEDI
. Die Sortierung erfolgt vor Ort unter Verwendung einer extrem suboptimalen (leistungsbezogenen) Version der Blasensortierung.quelle
Emacs Lisp, 183 Bytes
Etwas kürzer als Java ...
quelle
Clojure, 77 Bytes
Nicht ganz so kurz wie die
re-seq
Basis, und ich konnte nicht herausfinden, wie ich das "(apply str(mapcat sort(map(...))))
" in weniger Raum ausdrücken kann.group-by
Erstellt eine Hash-Map, die als Funktion verwendet werden kann. Wenn sie mit einem Ingeger zwischen 0 und 2 abgefragt wird, gibt sie die entsprechende Gruppe zurück. Dies ordnet die drei verschiedenen Klassen von Zeichen an.Dies wäre kompakter als die
re-seq
Lösung, wenn mehr Zeichenklassen zu handhaben wären, da dies nur 5 zusätzliche Zeichen / Gruppen wie57 1,
anstelle von 8 für den Ausdruck wie benötigt#"[a-z]"
.quelle
Python 2,
14011710110099 BytesAlle sagen "Ewww!". Zumindest ist es lesbar ... Husten nicht wirklich Husten
Probieren Sie es online aus
quelle
R 101 Bytes
Erstellt einen Vektor mit az, AZ und 0-9 in der angegebenen Reihenfolge und ordnet die Zeichen der Eingabezeichenfolge entsprechend dieser Reihenfolge neu an.
Probieren Sie es online!
quelle
J, 40 Bytes
quelle
Java 8,
221212193156 BytesIch sollte natürlich auch versuchen, meine eigene Herausforderung zu beantworten. :) (Und wie üblich in Java.)
-28 Bytes gespart dank @cliffroot .
Erläuterung:
Probieren Sie es hier aus.
quelle
[^a-z]
[^A-Z]
[^0-9]
undgetBytes()
stattdessentoCharArray()
^
(nicht) war ziemlich dumm ..;)replaceAll
String c(int[]a,String z){String r[]={"[^a-z]","[^A-Z]","[^0-9]"},o="";for(byte c[],i=0;i<3;){c=z.replaceAll(r[a[i++]],"").getBytes();java.util.Arrays.sort(c);o+=new String(c);}return o;}