Es ist wieder Schulzeit! Für einen Teilzeitjob helfen Sie also in der Bibliothek der Schule. Das Problem ist, dass der Hauptbibliothekar noch nie die Worte "Dewey Decimal" gehört hat, geschweige denn dieses System implementiert hat. Stattdessen ist das verwendete Sortiersystem mit der Erweiterung der Bibliothek "organisch" gewachsen ...
In dem Bestreben, Ihre geistige Gesundheit zu wahren, haben Sie sich dazu entschlossen, ein Programm zu schreiben, mit dem Sie Bücher sortieren können, wenn sie zurückgegeben werden. (Der Bibliothekar ist sehr streng.)
Input-Output
- Die Eingabe ist eine Liste von (hypothetischen) Buchtiteln, eine pro Zeile, von STDIN / Sprachäquivalent.
- Sie können davon ausgehen, dass nicht mehr als 100 Bücher gleichzeitig eingegeben wurden (Sie können nur so viele Bücher gleichzeitig in der Bibliothek herumtragen).
- Bücher können mehrere Wörter in ihren Titeln enthalten und diese Wörter können durch Leerzeichen oder andere Satzzeichen (z. B. einen Doppelpunkt
:
, einen Bindestrich-
usw.) getrennt sein. - Nehmen Sie zur Vereinfachung der Berechnung an, dass alle Titel UTF-8 sind.
Es werden die gleichen Titel ausgegeben, sortiert nach den folgenden Regeln, wiederum einer pro Zeile nach STDOUT / Sprachäquivalent.
Die Sortierregeln
Bücher werden numerisch sortiert, basierend auf ihrem durchschnittlichen Zeichenwert (dh dem kumulierten Zeichenwert geteilt durch die Anzahl der Zeichen im Buchtitel), wobei die folgenden Regeln gelten:
- Alle Zeichen bestimmen die Anzahl der Zeichen in einem Titel.
- Kleinbuchstaben werden nach ihrer Position im Alphabet gezählt. (a = 1, b = 2, ... z = 26)
- Wenn der Titel Großbuchstaben enthält, zählen diese für 1,5 ihren Kleinbuchstabenwert (A = 1,5, B = 3, ... Z = 39). ("Großbuchstaben sind wichtig!", Sagt der Bibliothekar.)
- Jedes Interpunktionszeichen / Symbol in dieser Liste
!@#$%^&*()-=_+[]\{}|;':",./<>?~
zählt -1 vom kumulierten Wert vor der Mittelwertbildung. ("Grandiose Titel sind nicht!") - Wenn der Titel eine arabisch geschriebene Zahl enthält , wird diese Zahl vor dem Sortieren vom Durchschnittswert abgezogen. Mehrere aufeinanderfolgende Ziffern werden als eine Zahl behandelt (z. B.
42
42 subtrahieren, 4 nicht subtrahieren und dann 2 subtrahieren). Einzelne Ziffern zählen nicht für den kumulativen Wert (dh jede Ziffer trägt 0 bei), sondern für die Anzahl der Zeichen. Beachten Sie, dass dies zu einem negativen Wert führen kann und entsprechend behandelt werden sollte. (Gerüchten zufolge ist der Bibliothekar seit einigen Jahren in einen Mathematiklehrer verknallt.) - Wenn der Titel zwei separate Wörter enthält, die mit einem beginnen
R
, erhält das Buch die Note "unendlich" und wird auf einen Stapel in der Ecke gelegt (dh zufällig am Ende der Liste angeordnet). (Der Bibliothekar wurde einmal von einer Person mit diesen Initialen entlassen, oder wie Sie gehört haben.) - Leerzeichen zählen nicht für den kumulativen Zeichenwert (dh sie tragen 0 bei), tragen jedoch zur Anzahl der Zeichen in einem Titel bei.
- Zeichen, die nicht den obigen Regeln entsprechen (z. B. a
ÿ
), zählen nicht für den kumulativen Zeichenwert (dh sie tragen 0 bei), tragen jedoch zur Anzahl der Zeichen in einem Titel bei. - Zum Beispiel hätte ein hypothetisches Buch
ÿÿÿÿÿ
eine "Punktzahl" von(0+0+0+0+0) / 5 = 0
, aber ein hypothetisches Buchÿÿyÿÿ
hätte eine "Punktzahl" von(0+0+25+0+0) / 5 = 5
. - Zwei Bücher, die zufällig gleich "punkten", können in der von Ihnen gewählten Reihenfolge ausgegeben werden. (Sie sind auf jeden Fall im selben Regal)
Beispiel Eingabe 1
War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny
Beispiel Ausgabe 1 (mit "Punkten" in Klammern, um die Argumentation anzuzeigen - Sie müssen sie nicht ausdrucken)
War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)
Beispiel Eingabe 2
Matthew
Mark
Luke
John
Revelations
Beispielausgabe 2 (mit "Punkten" in Klammern als Begründung - Sie müssen sie nicht ausdrucken)
Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)
Beispiel Eingabe 3
42
9 Kings
1:8
7th
Beispielausgabe 3 (mit "Punkten" in Klammern als Begründung - Sie müssen sie nicht ausdrucken)
42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)
Andere Einschränkungen
- Das ist Code-Golf, weil Sie das Programm vor den Augen des Bibliothekars geheim halten müssen. Je kleiner das Programm, desto einfacher ist es, es zu verbergen.
- Es gelten die üblichen Lückenbeschränkungen
- Lassen Sie sich nicht vom Bibliothekar davon abhalten, Ihre Zeit mit PPCG zu verbringen.
Antworten:
APL (132)
Da alle anderen dasselbe tun, ist dies auch eine Funktion, die eine Reihe von Titeln übernimmt und sortiert zurückgibt, z.
Erläuterung:
⎕ML←3
:⎕ML
auf3
(für⊂
) setzen⍵[⍋{
...}¨⍵]
: Sortiert die Eingabe nach den von der inneren Funktion zurückgegebenen Werten↑¨⍵⊂⍨⍵≠' '
: Ermittelt das erste Zeichen jedes Wortes2='R'+.=
: Sehen Sie, ob zwei davon sind'R'
.:!99
: wenn ja, 99 zurück! (9,3 × 10 155 ). Das ist nicht unendlich, aber es reicht aus: Ein Titel kann niemals eine Punktzahl haben, die größer als das 38-fache seiner Länge ist (ZZZZ ...), solange kein einzelner Titel größer als etwa 2 × 10 130 ist Yottabyte ist ist garantiert, dass diese am Ende sein werden.⋄
: Andernfalls:(
...)÷⍴⍵
: Teilen Sie die Punktzahl durch die Länge von,⍵
nachdem Sie sie berechnet haben:G←(⊂⎕A),(⎕UCS 96+⍳26)
: InG
Groß- und Kleinbuchstaben speichern(⎕UCS 32+⍳94)~'`',⎕D,∊G
: die druckbaren ASCII-Zeichen mit Ausnahme von Buchstaben, Ziffern, Leerzeichen und'`'
, bei denen ein Punkt abgezogen wird. (Dies ist kürzer als das Ausschreiben, daG
es später verwendet wird.)+/⍵∊
: Zähle die Anzahl dieser Zeichen in⍵
-
: subtrahiere dies von:+/∊1.5 1×(⍳×∊⍨)∘⍵¨G
: die Summe von 1,5 × der Punktzahl für die Großbuchstaben und 1 × der Punktzahl für die Kleinbuchstaben.-⍨
: subtrahiere danach die Summe der Zahlen in⍵
:⍵⊂⍨⍵∊⎕D
: Finde die Zifferngruppen in⍵
'0',
: add'0'
, um zu verhindern, dass die Liste leer ist⍎¨
: bewerte jeden String+/
: finde die Summequelle
!99
könnten Sie⌊/⍬
Lua 5.3,
366364 BytesDieser Code funktioniert nur in Lua 5.3, da er Unicode-Zeichen verarbeiten muss. Wenn Sie sich nicht für Unicode interessieren, ersetzen Sie "utf8" durch "string" und es funktioniert einwandfrei mit Lua 5.2 oder 5.1.
Die Eingaben stammen von Befehlszeilenargumenten. Führen Sie sie daher entweder über die Befehlszeile aus oder setzen Sie den folgenden Code über meine Antwort:
quelle
utf8
mit Ideonestring
zu tauschen, und habe keine Ausgabe erhalten.(arg)
sitzt da und starrt mir ins Gesicht. Diese Frage hat anscheinend mein Gehirn gebraten. Habe eine +1.Mathematica,
253216 Bytes (214 Zeichen)Rufen Sie die Funktion wie
f[{"42", "9 Kings", "1:8", "7th"}]
folgt auf: Es wird eine sortierte Liste der Eingaben zurückgegeben.Gerade noch geschafft! Mathematicas Mustervergleich ist nicht so präzise, wenn es um Zeichenfolgen geht, und ich werde einfach von diesen langen Namen umgebracht. Die zusätzlichen zwei Bytes sind für das
Infinity
Unicode-Zeichen.(Lassen Sie mich wissen, wenn ich Standardlücken verpasst habe.)
Aktualisieren
Bei näherer Betrachtung der Antwort von edc65 sieht es so aus, als würde das OP eine Funktion akzeptieren, die eine Liste von Zeichenfolgen sortiert. In diesem Sinne können wir die Curry-Form von
SortBy
(die Mathematica als "Operatorform" bezeichnet) verwenden. Mit einem Argument (die Funktion, die auf die Listenelemente angewendet wird, um deren Reihenfolge zu bestimmen) verhält es sich wie eine Funktion, die ein Argument verwendet und die sortierte Form der Eingabe zurückgibt. das heißt,SortBy[list, f]
ist äquivalent zu(SortBy[f])[list]
.Ungolfed
quelle
JavaScript (ES6), 210
218 251Als Funktion mit einem Array-Argument wird sortiert zurückgegeben.
quelle
O.innerHTML
umthis.InnerHTML
die Konsole in Firefox.C #,
352349 BytesAufgrund der Magie von Linq:
Hätte weitere 6 Bytes sparen können, wenn Backtick in die Interpunktionsliste aufgenommen worden wäre!
quelle
Los, 755 Bytes
Die formatierte Version:
Durch die Implementierung einer benutzerdefinierten Sortierschnittstelle wurde der Zeitraum länger als erwartet. Das Programm liest von STDIN, bis das Ende der Eingabe oder eine leere Zeile eingegeben wird.
quelle
PHP, 362
367BytesFormatierte Version:
Interessante Zeilen:
Konvertiert ein einzelnes UTF-8-Zeichen in seine Bytewerte und summiert diese, sodass wir den tatsächlichen Wert für ASCII-Zeichen und einen Wert über 127 für Multibyte-Zeichen erhalten.
Verwendet die niedrige Operatorpriorität von
and
undor
, um den Zeichenwert in einer einzelnen Anweisung ohne zuzuweisenif
.quelle
Perl 5 , 190 Bytes
Probieren Sie es online!
quelle