Ganzzahlen alphabetisieren

19

Ganzzahlen alphabetisieren

Ordnen Sie die Zahlen für einen bestimmten Satz in alphabetischer Reihenfolge zu, wenn sie buchstabiert sind (z. B. 1: eins, 2: zwei, 90: neunzig, 19: neunzehn). Ihr Code sollte für den Bereich funktionieren[-999999, 999999] . Die Ausgabe muss ein Trennzeichen zwischen den Zahlen enthalten. Ein Leerzeichen funktioniert genauso wie ein Leerzeichen und ein Komma, wie in den folgenden Beispielen gezeigt. Die Eingabe kann ein Array von Ganzzahlen sein, eine Zeichenfolge von durch Trennzeichen getrennten Zahlen, oder wie Sie es für richtig halten. Es wird angenommen, dass alle Ganzzahlen eindeutig sind.

Zahlen werden für diese Herausforderung nicht mit Bindestrich getrennt und Leerzeichen werden vor anderen Zeichen in alphabetischer Reihenfolge angezeigt. Es wird angenommen, dass negative Zahlen mit dem Wort ausgedrückt werden minus. Beispielsweise fourwürde vorausgehen four thousandund die Nummer -40würde anhand der Zeichenfolge sortiert werden minus forty. Angenommen, alle Zahlen bestehen ausschließlich aus Zahlenwörtern und keinen Konjunktionen (z. B. Verwendung two thousand forty twoanstelle von two thousand and forty two).


Testfälle

Einstellige ganze Zahlen:

Eingang:

1, 2, 3, 4, 5

Ausgabe:

5, 4, 1, 3, 2

Mehrstellige Ganzzahlen:

Eingang:

-1002, 5, 435012, 4, 23, 81, 82

Ausgabe:

81, 82, 5, 4, 435012, -1002, 23

Leerzeichen zwischen Wörtern, keine Bindestriche, Kommas oder "und":

Eingang:

6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804

Ausgabe:

6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204

Denken Sie daran, das ist , also gewinnt der Code mit den wenigsten Bytes. Keine Lücken erlaubt!

Wubs
quelle
Hier ist der Link zum jeweiligen Sandbox-Beitrag.
Wubs
Enthält die Eingabe jemals mehr als eine einzelne Ganzzahl?
ETHproductions
@ETHproductions Nein, das wird es nicht. Ich werde das in der Frage angeben.
Wubs
8
Willkommen bei PPCG. Schöner Avatar. : D Schöne erste Frage.
AdmBorkBork
@TimmyD Danke! Ich freue mich darauf, alles, was ich kann, hier in PowerShell zu präsentieren.
Wubs

Antworten:

5

JavaScript (ES6), 189 179 186 Bytes

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

Die Grundidee besteht darin, jede eingegebene Zahl in eine kurze Zeichenfolge umzuwandeln, die sich im Vergleich zu allen anderen Zahlen-Zeichenfolgen-Paaren an der richtigen lexografischen Position befindet. Hier ist das verwendete Wörterbuch: (Führen Sie das Snippet nicht aus; es dient nur zum Ausblenden der langen Liste.)

Dies schafft eine sehr präzise Möglichkeit, jede Zahl ihrer lexographisch korrekten Position zuzuordnen. Das macht die rekursive qFunktion:

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

Das 0am Anfang der Zeichenkette soll sicherstellen, dass zB 100 ( one hundred, umgerechnet auf PK0) vor 101( one hundred one, umgerechnet auf PKP) sortiert wird . Dies erzeugt ein seltsames Szenario, in dem 0 ( zero) an der Vorderseite des Arrays sortiert ist. Um dies zu umgehen, sortieren wir in der Sortierfunktion zuerst alle Nullen nach rechts mit !x-!y||(....

ETHproductions
quelle
Sieht so aus, als würde es nicht funktionieren [1100, 1000]. Ich würde erwarten 1000 (one thousand), 1100 (one thousand one hundred), dass die Ausgabe ist, aber die Ausgabe ist die gleiche Reihenfolge wie die Eingabe.
Milch
@milk Hmm ... Ich bin mir nicht sicher, warum das passiert, aber ich werde es untersuchen.
ETHproductions
@milk Ah, 1000wird analysiert als one thousand zero; Ich werde das gleich beheben. Müssen wir uns aber selbst unterstützen 0? Es ist ein einzigartiger Fall, der meinem Code etwa 15 Bytes hinzufügt.
ETHproductions
11

Informieren Sie 7, 214 201 118 Bytes

Inform 7 ist eine absolut schreckliche Sprache fürs Golfen, deshalb wollte ich es hier mal probieren.

Einrückung sollte Tabulatorzeichen ( \t) verwenden, HTML mag diese jedoch nicht. Umgekehrt mag Inform keine Leerzeichen für Einrückungen, daher müssen Sie die Leerzeichen durch Tabulatoren ersetzen, wenn Sie den Code von hier kopieren und einfügen, um ihn zu testen. Oder kopieren Sie sie einfach aus der Markdown-Quelle.

Golf gespielt:

Zu X:
    Wiederholen Sie durch Tabelle 1:
        jetzt ist Q entry "[R entry in words]";
    sortiere Tabelle 1 in Q-Reihenfolge;
    sagen Sie "[R in Tabelle 1]".

Die Eingabe sollte wie folgt in einer Inform-Tabelle erfolgen ( \tzwischen den Spalten):

Tabelle 1
R (Nummer) Q (Text)
-1002
5
435012
4
23
81
82

Ausgabe:

81, 82, 5, 4, 435012, -1002, 23

Diese Funktion durchläuft die Tabelle einmal und fügt eine Textdarstellung jeder Zahl in einer neuen Spalte hinzu. Anschließend werden die Tabellenzeilen entsprechend der Textspalte sortiert. In Inform werden Zeichenfolgen lexikografisch sortiert. Schließlich wird die ursprüngliche Spalte in der neuen Reihenfolge ausgedruckt. Praktischerweise stellt sich heraus, dass Inform 7s "rohes, aber manchmal nützliches" Format zum Ausdrucken von Tabellenspalten genau wie gewünscht durch Kommas getrennt ist.

Ungolfed, mit einem Kesselschild, das zeigt, wie die Funktion aufgerufen wird:

So drucken Sie die Zahlen in alphabetischer Reihenfolge:
    Wiederholen Sie die Tabelle der sortierbaren Zahlen:
        jetzt lautet der Namenseintrag "[der Indexeintrag in Worten]";
    sortiere die Tabelle der sortierbaren Zahlen in der Reihenfolge ihrer Namen;
    Sagen Sie "[die Indexspalte in der Tabelle der sortierbaren Zahlen]".

Tabelle der sortierbaren Zahlen
Index (Nummer) Name (Text)
-1002
5
435012
4
23
81
82

Es gibt ein Zimmer.
Bei Spielbeginn: Zahlen in alphabetischer Reihenfolge ausdrucken.
Draconis
quelle
1
Das verwirrt mich ein wenig. Ist wordsein Verweis auf die in Inform 7 enthaltenen buchstabierten Versionen von Zahlen vorhanden?
Pavel
1
@Pavel In der Tat! "(Zahl) in Worten" gibt eine Zeichenfolge mit einer Textdarstellung der Zahl zurück. Es verwendet "Minus" für negative Zahlen und setzt zwar Bindestriche zwischen Wörter, ordnet dies jedoch konsequent an und alphabetisiert Bindestriche vor allen Buchstaben (das Endergebnis ist also dasselbe).
Draconis
2
+1 für die Sprachauswahl. Ich müsste das überprüfen, aber ich vermute, dass noch einige Möglichkeiten zum Golfen vorhanden sind. Benötigt der Parser beispielsweise wirklich alle diese "The" -Artikel? Und Sie müssten das OP fragen, aber ich sehe keinen offensichtlichen Grund, warum "und" kein gültiges Trennzeichen sind. Auch wenn dies nicht der Fall ist, ist ein einzelnes Leerzeichen explizit zulässig und say "[R entry] "sollte daher ausreichen.
Ilmari Karonen
Ich würde sagen, das "und" am Ende ist in Ordnung. Ich habe nicht gesagt, dass die Begrenzer einheitlich sein müssen, daher ist dies eine völlig akzeptable Antwort. Wenn ich Punkte für die interessanteste Antwort geben könnte, würde ich es Ihnen geben. Ich mag die Lesbarkeit dieser Sprache sehr, auch wenn ich Golf spiele. Gute Arbeit!
Wubs
Endlich hatte ich die Gelegenheit, ein bisschen mit Inform7 zu spielen, und es gelang mir, Ihren Einstieg auf nur 118 Byte zu re-golfen. Da das Posten des Inform-Codes in Kommentaren nicht sehr gut funktioniert, habe ich ihn direkt in Ihre Antwort eingearbeitet. Ich hoffe, es macht Ihnen nichts aus, Sie können meine Änderungen jederzeit wieder rückgängig machen und / oder ändern.
Ilmari Karonen
4

Mathematica, 67 Bytes

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

Unbenannte Funktion, die eine Liste von Ganzzahlen als Argument verwendet und eine Liste von Ganzzahlen als Wert zurückgibt. #~IntegerName~"Words"ist eine integrierte Funktion, die eine Ganzzahl in ihren Namen in Englisch ändert. IntegerNameManchmal enthält die Ausgabe Kommas und Bindestriche, sodass der StringReplaceAufruf diese entfernt. (Leider ist der Bindestrich tatsächlich das 3-Byte-Zeichen 8208 in UTF-8.) Anschließend wird SortBydie ursprüngliche Liste alphabetisch nach dem Wert des geänderten Ganzzahlnamens sortiert.

Ein schöner Zufall: IntegerNameverwendet negativeanstelle von minusin seiner Ausgabe - aber kein Wort, das in den Namen einer der zulässigen Zahlen vorkommt, ist alphabetisch zwischen diesen beiden Wörtern, sodass kein Ersatz erforderlich ist!

(Hutspitze an Genisis, weil sie mich daran erinnert hat Sortby .)

Greg Martin
quelle
Ein dickes Lob! Ich war sehr nahe dran, diese Lösung zu bekommen, aber dieser Schuss bereitete mir Kopfschmerzen!
Genisis
Verwendet Ihre Antwort hier tatsächlich den richtigen Bindestrich? Wenn ich das, was Sie hier haben, in Mathematica kopiere, werden die Bindestriche von nicht ersetzt IntegerName. Die Wolfram-Dokumentation besagt, dass es sich um das Unicode-Zeichen 2010 handelt .
Genisis
Wahrscheinlich nicht - ich habe versucht, den richtigen Bindestrich in dieser Antwort zu finden, aber es scheint, als hätte ich keinen Erfolg gehabt.
Greg Martin
Ich habe deine Antwort in zwei Hälften geteilt;)
J. Antonio Perez
Und dann einige ... Sie nehmen unnötige Änderungen an der Zeichenfolge vor.
J. Antonio Perez
4

Bash + GNU utils + bsdgames, 52

  • 4 Bytes gespart dank @izabera.
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

E / A sind Zeilen mit Zeilenumbrüchen.

  • Der erste sed-Ausdruck ersetzt jede numerische Zahl durch einen Shell-Befehl, der die Wortform der Zahl ausgibt (wie vom Dienstprogramm bsdgames angegebennumber ), gefolgt von :der numerischen Form der Zahl.
  • Das ist dann sort ed.
  • Der zweite sedStreifen führt die Zeichen bis einschließlich zu und :lässt die numerische Form nach Bedarf sortiert.

number behandelt "minus" richtig und seine Ausgabe ist nahe genug an dem angegebenen Format, das das sort wie erforderlich funktioniert. Es wird "vierundvierzig" anstelle von "vierundvierzig" ausgegeben, aber dies sollte aus Sicht der Sortierung keine Rolle spielen.

Das bsdgames-Paket muss möglicherweise installiert werden:

sudo apt-get install bsdgames

Die sedund sortDienstprogramme sind mit ziemlicher Sicherheit bereits in Ihrer Distribution.

Digitales Trauma
quelle
-t:ist nutzlos und Sie können verwendennumber<<<&
Izabera
@izabera Ja - danke - ich habe das entfernt -t:. Die eval-Funktion von sed führt jedoch Befehle mit aus sh, sodass bash-Funktionen wie <<<nicht funktionieren.
Digitales Trauma
es funktioniert gut, solange dein sh bash ist: P
izabera
@izabera Nope - wenn bash so gestartet wird, wie shes versucht, Posix sh so weit wie möglich zu emulieren, bedeutet dies, dass bashisms wie ausgeschaltet <<<sind. sedDie Funktion eval von GNU startet Befehle mit /bin/sh -c ...und nicht /bin/bash -c .... Hast du das versucht?
Digitales Trauma
Bash schaltet sich nie aus <<<, auch nicht im Posix-Modus
Izabera
1

Python + Flex, 97 91 89 Bytes

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

Verwendete die inflectBibliothek, um das wordsArray von Ganzzahlen in ihre phonetische / Zeichenfolgendarstellung umzuwandeln . In einem Wörterbuch mit k / v-Paaren gespeichert, wobei die Tasten die numerische Darstellung und die Werte die Zeichenfolgendarstellung waren. Gibt die Liste der Schlüssel sortiert nach Werten zurück.

EDIT: 5 und 3 Bytes gespart, dank ETHproductions und Alex.S!

9814072356
quelle
Willkommen bei PPCG! Sie können Golf spielen, indem Sie Leerzeichen entfernen . Beispielsweise kann die zweite Zeile sein a={x:inflect.engine().number_to_words(x)for x in words}.
ETHproductions
Sie können zwei Bytes speichern, from inflect import*indem Sie inflect.die zweite Zeile verwenden und wegwerfen .
Alex.S
Leider sieht es so aus, als würde die Liste 40, 44, 40000, 40804, 40004, 40204 (die in dieser Reihenfolge bleiben sollte) auch nicht richtig sortiert.
Ilmari Karonen
0

Mathematica, 30 Bytes

Die Antwort unten gibt eine reine Funktion aus, die eine Liste von Ganzzahlen als Eingabe verwendet und diese nach ihrem alphabetischen Namen sortiert. Genau das, was der Arzt bestellt hat;)

SortBy[#~IntegerName~"Words"&]

Hier ist die ungolfed Version:

SortBy[IntegerName[#, "Words"]&]

Und hier ist ein Anwendungsbeispiel:

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

Welches könnte auch als geschrieben werden

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

Sie erzeugen identische Ergebnisse - in Mathematica f[x]ist dies gleichbedeutend mit f@x.

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

Es gibt eine viel längere Antwort, die ein anderer Benutzer in Mathematica gepostet hat. Diese Antwort versucht, einige kleine Unterschiede zwischen der Art und Weise zu korrigieren, wie mathematica Zahlen alphebatisiert, um sie besser an die Art und Weise anzupassen, in der die vom OP angegebenen Zahlen alphebatisiert werden sollten.

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)
J. Antonio Perez
quelle
Eine großartige Untersuchung! - Leider geben sie nicht den gleichen Befehl. TheirFsortiert 888 korrekt vor 880.000, MyFtut dies aber nicht. Wahrscheinlich liegt das Problem beim Einfügen des seltsamen Bindestrichs beim Kopieren: Ihre Version von ersetzt TheirFwahrscheinlich normale Bindestriche (von denen es keine gibt), während die aktuelle Version den seltsamen 3-Byte-Unicode-Bindestrich ersetzt. (Es wäre immer noch interessant zu sehen, ob das Entfernen von Kommas erforderlich ist.)
Greg Martin
Ich habe es auf Range [999999] getestet. Sieht so aus, als ob das Entfernen der Kommas unnötig ist, aber das Ersetzen von "[Bindestrich]" durch "" ist definitiv erforderlich.
Genisis
0

Common Lisp, 113 Bytes

Keine externen Bibliotheken erforderlich.

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

Ausgabe wenn xist '(1 2 3 4 5):

(5 4 1 3 2)
Harry
quelle