Wir alle kennen verschiedene ausgefallene Sortieralgorithmen, aber keine davon gibt uns Zahlen auf eine Weise, die leicht auszusprechen ist. Um dem abzuhelfen, schlage ich die Verwendung von AusspracheSort ™ vor, der natürlichsten Methode zum Sortieren von Nummernlisten.
Aussprache
Die offiziellen Regeln zum Aussprechen von Zahlen (in dieser Herausforderung) lauten, dass die Ziffern einzeln ausgesprochen werden und die resultierende Zeichenfolge in lexikografischer Reihenfolge sortiert wird. Dies bedeutet beispielsweise, dass die Nummer 845
ausgesprochen "eight four five"
wird und entsprechend sortiert werden sollte.
Negative Zahlen
Negative Zahlen werden durch Voranstellen des Wortes ausgesprochen "minus"
. So -23
wird ausgesprochen als "minus two three"
. Beachten Sie, dass negative Zahlen in der Mitte der Ausgabe angezeigt werden, direkt zwischen den Zahlen, die mit 4
(vier) und 9
(neun) beginnen.
Die offizielle Reihenfolge der Wörter für AusspracheSort ™ lautet:
- acht
- fünf
- vier
- Minus
- neun
- eins
- Sieben
- sechs
- drei
- zwei
- Null
Das ist,
8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0
Eingang
Eine Liste von Ganzzahlen im Bereich , die höchstens 100 Elemente enthält. Die Eingabe als Liste von Zeichenfolgen ist nicht zulässig. Wenn Ihre Sprache die Eingabe als Liste nicht unterstützt, ist es zulässig, die Eingabe als separate Ganzzahlen vorzunehmen.
Die Eingabe enthält keine ungültigen Zahlen oder Zahlen, die mit einer 0 beginnen (mit Ausnahme der Zahl 0 selbst). Die Eingabe wird in der Regel nicht sortiert, sondern kann in beliebiger Reihenfolge erfolgen.
Ausgabe
Dieselben ganzen Zahlen in der Reihenfolge von AusspracheSort ™. Beachten Sie, dass die Zahlen nur in ihre Aussprachen konvertiert werden sollten, um die Sortierung zu erhalten. Die Ausgabe sollte keine Zeichenfolgen enthalten.
Beispiele
In den Beispielen dient der in Klammern gesetzte mittlere Schritt nur als Richtlinie und ist nicht Teil der Ausgabe.
[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]
Es gibt auch ein Skript zur Überprüfung Ihrer Ergebnisse .
Antworten:
05AB1E (Legacy) , 15 Byte
Probieren Sie es online!
Erläuterung
quelle
•ĆU‘•
. Sie fügt während des Mappings / Sortierens aus irgendeinem Grund eine neue Zeile hinzu.Σ•ĆU‘•"54-ÿ"sSk
hätte eine 15-Byte-Alternative sein können, an der ich gearbeitet habe, wäre da nicht dieser seltsame Fehler gewesen. Wenn ich•ĆU‘•
zum Literal wechsle ,9176320
funktioniert das ganz gut .…54-ì
geradeΣ•RT‹•Á…54-ìsSk
für 15 tun•t∍ýJ•'-ìÁÁ
würde auch funktionierenHaskell , 57 Bytes
Probieren Sie es online!
quelle
Jelly ,
15 bis13 BytesProbieren Sie es online!
Ein monadischer Link, der eine Liste von ganzen Zahlen akzeptiert, die eine Liste von ganzen Zahlen ergibt.
Wie?
Sortiert nach den Ordnungswerten der Ziffern der ganzen Zahlen (wobei
-
eine "Ziffer" von -1 ist), konvertiert in Zeichenfolgen unter Verwendung der Zeichen an ihrem 1-basierten und modularen Index in der magischen Zeichenfolge "murgeon lix".Die Sortierung ist praktisch alphabetisch, wobei ein Leerzeichen weniger als ein Buchstabe ist.
Die magische Zeichenfolge "murgeon lix" wurde gefunden, indem Jellys bei der Komprimierung verwendete Wörterbücher untersucht wurden. Es gibt keine Wörter mit 11 Buchstaben, die den Anforderungen entsprechen (und keine weiteren, die bei der Deduplizierung benötigt würden). da ein Leerzeichen vor Buchstaben sortiert ist, ist die nächste naheliegendste Wahl ein Wort der Länge sieben, gefolgt von einem Leerzeichen, gefolgt von einem Wort der Länge drei. "murgeon" und "lix" sind die einzig befriedigende Kombination, obwohl ohne Leerzeichen andere möglich sein könnten (zB
“£Py:ƥ»
"murgeonalix", das für die gleiche Byteanzahl arbeitet)Vorherige @ 15 Bytes :
Hier
“¡Zo⁶’Œ?¤
findet sich die erste Permutation natürlicher Zahlen, die sich am Index 21.340.635 befinden würde, wenn alle Permutationen der Zahlen lexikographisch sortiert wären - das ist[6,10,9,3,2,8,7,1,5,4,11]
. (“¡Zo⁶’
Ist eine Basis-250-Darstellung von 21340635, währendŒ?
die Berechnung und¤
Gruppierung dieser Anweisungen erfolgt.)quelle
Perl 6 , 30 Bytes
Probieren Sie es online!
Port der Ruby-Lösung von GB.
Ursprüngliche 35-Byte-Version
Probieren Sie es online!
Konvertieren Sie jede Zahl in eine Zeichenfolge, ermitteln Sie den Unicode-Namen jedes Zeichens, entfernen Sie das erste Wort ("DIGIT" oder "HYPHEN") und sortieren Sie es.
quelle
JavaScript (SpiderMonkey) , 69 Byte
Probieren Sie es online!
quelle
+''
, da Sie Eingaben als ein Array von Zeichenfolgen nehmen.K (NGN / k) ,
2120 BytesProbieren Sie es online!
{
}
Funktion mit Argumentx
$
Format als Zeichenfolgen"
..."?
Indizes einzelner Zeichen in der angegebenen Zeichenfolge suchen (oder für "nicht gefunden" - beachten Sie, dass das fehlt)"8"
<
berechne sortiere aufsteigende Permutationx@
das Argument bei diesen Indizesquelle
Python 3,
68 Bytes67 Bytes64 BytesVerwendet die eingebaute
sorted
Funktion mit einem anonymen Lambda für den Schlüssel. Codieren Sie die Sortierreihenfolge fest und vergleichen Sie jede Ziffer in jedem Wert in der Eingabeliste mit ihrer Position in der Sortierreihenfolge.Bearbeiten: 1 Byte durch Entfernen
8
aus der Sortierliste gespeichert , um diestr.find
Rückgabe zu nutzen,-1
wenn der Parameter nicht gefunden wird. Vielen Dank an maxb.Edit2: Speichert 3 Bytes, indem die markierte Entpackungssyntax in einem
list
Literal anstelle eineslist
Konstruktors verwendet wirdProbieren Sie es online!
quelle
lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Pyth,
1716 BytesVersuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .
1 Byte dank @ngn und ihrer K-Antwort gespeichert , indem 8 am Anfang der Wörterbuchzeichenfolge weggelassen wurde
quelle
Japt, 19 Bytes
Versuch es
quelle
S.n(s)
:ñ_s ®n"54-9176320
(anscheinendS.n(s)
ist es genau dasselbe wies.b(S)
fürS
Länge 1, außer dass es0
anstelle von zurückgegeben wird-1
)Retina 0,8,2 , 36 Bytes
Probieren Sie es online! Link enthält Testsuite. Erläuterung:
Übersetzen Sie das Minuszeichen und die Ziffern in der Aussprachereihenfolge an ihre Position, wobei Sie
:
für die zehnte Position verwenden.In der Reihenfolge der Aussprache sortieren.
Übersetzen Sie die Bestellung zurück in das ursprüngliche Minuszeichen und die Ziffern.
quelle
Ruby , 50 Bytes
Probieren Sie es online!
quelle
R , 58 Bytes
Probieren Sie es online!
Die Eingabe ist eine Liste von Zahlen, die implizit als Zeichenfolge konvertiert wird
chartr
.order
verwendet dann die lexigografische Reihenfolge, um die Reihenfolge abzurufen, nach der die ursprüngliche Liste sortiert werden soll.quelle
Java (JDK 10) , 123 Byte
Probieren Sie es online!
Dies ist eine naive Java-Implementierung. Sollte viel Golf sein.
Credits
quelle
.chars
-IntStream und.reduce
zu einer regelmäßigen Schleife speichert 2 Bytes:n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}
. Außerdem kann durch Ändern von10+"85
auf ein weiteres Byte gespeichert werden20+"5
, da die.indexOf
for-Ziffer8
dann zu -1 führen würde. Versuchen Sie es online 123 BytesJavaScript (SpiderMonkey) ,
8773 BytesProbieren Sie es online!
Vielen Dank an @Arnauld für den Hinweis, dass die Sortierung in SpiderMonkey stabil ist, sodass das
||-(F(q)>F(p))
Teil endgültig gelöscht werden kann.quelle
Rot , 114 Bytes
Probieren Sie es online!
Besser lesbar:
quelle
C ++, 353 Bytes
Dies ist eine Art Comedy-Eintrag, aber ich habe Zeit verschwendet und ihn geschrieben, daher kann ich ihn nicht veröffentlichen.
Ausgabe:
quelle
Mathematica, 68 Bytes
Funktion. Nimmt eine Liste von Ganzzahlen als Eingabe und gibt die sortierte Liste als Ausgabe zurück. Nur trennt die Ziffern von jeder Nummer mit
IntegerDigits
, wandelt jede Ziffer"zero"
,"one"
etc. mitIntegerName
, mit der Liste in eine durch Leerzeichen getrennte Zeichenfolge konvertiertStringRiffle
, prepends ein ,"m "
wenn die Zahl negativ ist, und Sortierungen auf dieser Zeichenfolge basiert. In der Tat war dies der kürzeste Ansatz, den ich finden kann, da Mathematica die lexikografische Sortierung nur für Listen gleicher Länge verwendet. Ein Ansatz, der darauf basiert854-9176320
, benötigt mehr Bytes, da Zeichenfolgenfunktionen so teuer sind.quelle
05AB1E ,
1514 Bytes-1 Byte dank @Emigna .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Komprimieren großer Ganzzahlen ) an, um zu verstehen, warum dies so
•ĆU‘•
ist9176320
.quelle