Einführung
Mein Opa ist ein Fan von James Bond, aber er ist sich immer unsicher, wie er seine Lieblingsschauspieler einstufen soll. Als solcher macht er immer Listen, was eine Menge Arbeit ist. Er hat mich gebeten, ein Programm zu produzieren, das ihm das Leben leichter macht, aber dafür habe ich keine Zeit, ich muss arbeiten! Also werde ich auf euch zählen.
Herausforderung
Die Herausforderung ist einfach. Die Eingabe besteht aus einer Liste im folgenden Format:
<number> <space> <actor's name> <newline>
Ihre Aufgabe ist es, sie nach der Nummer am Anfang der Zeile zu sortieren , beginnend mit der letzten und endend mit der ersten. Alle Nummern sollten entfernt werden.
Mein Opa macht jedoch manchmal Fehler. Daher müssen Sie die Daten validieren. Wenn sich einer der Namen auf der Liste nicht auf einen der Schauspieler bezieht, die Bond gespielt haben, müssen Sie ihn verwerfen. Im Falle von Wiederholungen sollten Wiederholungen entfernt werden und der Name sollte das niedrigste Gewicht beibehalten, mit dem er verknüpft war (Beispiel 3).
Es gibt keine Begrenzung für die Anzahl der Zeilen.
Die Ausgabe muss nur eine Art Liste sein, sei es ein Array, eine durch Kommas getrennte Zeichenfolge, nur durch Leerzeichen getrennte Werte oder etwas ganz anderes, d. H
Pierce Brosnan, Sean Connery, David Niven
Ein abschließender Zeilenumbruch oder ein Leerzeichen ist zulässig.
Beispiel für Ein- und Ausgabe
Eingang:
1 Sean Connery
2 Emma Watson
5 Timothy Dalton
4 Roger Moore
3 Daniel Craig
Ausgabe:
Timothy Dalton, Roger Moore, Daniel Craig und Sean Connery
Eingang:
2 Timothy Dalton
4 George Lazenby
5 George Lazenby
3 Bob Simmons
Ausgabe:
George Lazenby, Bob Simmons, Timothy Dalton
Eingang:
3 Sean Connery
2 Pierce Brosnan
1 Sean Connery
Ausgabe:
Pierce Brosnan, Sean Connery
Da dies ein Codegolf ist, gewinnt der kürzeste Code (in Bytes)!
Blinddarm
Liste der Schauspieler, die die Rolle des Bond gespielt haben:
- Barry Nelson
- Bob Simmons
- Sean Connery
- Roger Moore
- David Niven
- George Lazenby
- Timothy Dalton
- Pierce Brosnan
- Daniel Craig
echo Sean Connery
Antworten:
Pyth,
136132 BytesProbieren Sie es hier aus!
Erläuterung
quelle
Netzhaut ,
201 197191Probieren Sie es online!
6 Bytes gespart dank Martin!
Whee, Blase Art mit Regex. Beachten Sie, dass zu Beginn zehn Bytes für die Konvertierung von Dezimalzahlen in unäre Zahlen aufgewendet werden. Wenn unäre Eingaben in Ordnung sind, ist dies nicht erforderlich. Wenn Zahlen nicht in den Namen von Personen enthalten sein dürfen, können ein paar weitere Bytes gespart werden, indem die Linie, die Nicht-Bond-Akteure entfernt, an das Ende verschoben und die
1+
(mit\D
Version ungetestete ) entfernt wird.Erläuterung:
Ein Retina-Programm besteht aus mehreren Phasen, daher erkläre ich jede Phase separat.
Bühne 1:
Ersetzt die Zahlen in der Eingabe durch unary. Hierbei wird das spezielle Ersatz-Token von Retina verwendet,
$*
das das Zeichen nach einer Anzahl von Malen wiederholt, die dem Basis-10-Wert des vorhergehenden Tokens entspricht.Stufe 2:
Das Zeug vor einem
`
in einer Phase ändert den verwendeten Modus. Dies aktiviert den Grep-Modus, was bedeutet, dass jede Zeile, die nicht mit dem regulären Ausdruck übereinstimmt, verworfen wird. Die Anker sind erforderlich, um das Verrutschen von Streichhölzern in der Nähe zu verhindern.Stufe 3:
Dies ist die Sortierstufe. Das
+
im Modus bedeutet, dass diese Phase wiederholt werden sollte, bis der Austausch bei der Anwendung keine Änderung mehr vornimmt (dh wir erreichen einen festen Punkt). Der Regex findet eine Wortgrenze, gefolgt von einer bestimmten Anzahl von1
s und dem Rest der Zeile bis zur neuen Zeile. Wenn die nächste Zeile mehr1
s als s enthält, stimmt der reguläre Ausdruck überein, und wir tauschen die Zeilen aus.Stufe 4:
In dieser Phase wird der
+
Modus erneut verwendet, aber auchs
, damit das.
Metazeichen auch mit Zeilenumbrüchen übereinstimmt. Auf diese Weise werden doppelte Zeilen entfernt, indem nach dem1
s nach exakten Duplikaten gesucht wird und das Material nach dem ersten Duplikat erfasst wird, um die gesamte Übereinstimmung damit zu ersetzen. Dies funktioniert, ohne dass die Reihenfolge des Brechens berücksichtigt werden muss, da die Namen bereits entsprechend sortiert sind und die obigen Zahlen größer sind. Daher behalten wir immer die kleineren Werte bei.Stufe 5:
Wirklich einfach, hier ist alles in Ordnung, außer wir haben ein paar
1
s vor unseren Anleihen, also ersetzen wir sie und den Raum danach durch nichts.quelle
TSQL 426 Bytes (einschließlich Daten + Eingabe)
Golf Lösung:
Probieren Sie es hier aus
SQL zeichnet sich in dieser Art von Aufgabe aus (kein Wortspiel beabsichtigt): Zuordnen von Sätzen, Bestellen, Abschneiden von Duplikaten usw.
Sie müssen lediglich eine Akteurtabelle wie diese erstellen und füllen:
Wenn wir nun eine Tabellenvariable als Eingabe verwenden, müssen wir nur den Schnittpunkt beider Mengen ermitteln. Das Entfernen von Duplikaten und das Bestellen in SQL ist ganz einfach.
Beispiel 1:
Beispiel 2:
Die Golfversion ist genau das Richtige, zum Beispiel Eingabe 3
Als ein Plus kann dieses SQL für ältere DBMS-Versionen funktionieren (sogar in ANSI SQL umgeschrieben werden) und problemlos auf älteren Computern als den meisten Sprachen ausgeführt werden.
quelle
order by min(R) desc
mit der inneren Auswahl verwenden und diemin(R)
aus der Auswahl entfernen . Das sollte 21 Bytes einsparen.char
statt verwenden,varchar
werden weitere 6 Bytes eingespart.Perl,
242179217 BytesSchönere formatierte Version mit Kommentaren:
Der größte Teil der Größe entspricht der Liste der Anleihen. Ich kann keinen guten Weg finden, um diesen regulären Ausdruck zu komprimieren, ohne False Positives zuzulassen.
quelle
eval
in Perl und ein eingebautes Komprimierungssystem gibt ...Python 2, 250 Bytes:
Demo:
quelle
PowerShell v3 +,
227219 Byte121 Bytes davon sind nur die Liste der Schauspieler ...
Nimmt Eingaben
$args
und-split
s es auf Newlines mit`n
. Pipe das zusort
, das die Einträge numerisch aufsteigend sortiert, was im Moment OK ist. Wir leiten diese an eine foreach-Schleife weiter|%{...}
. Bei jeder Iteration wird der Eintrag vorgenommen, also-split
auf Leerzeichen-join
die zweite Hälfte mit einem Leerzeichen zurücksetzt (dh die Zahlen am Anfang entfernt). Diese (aufsteigenden) sortierten Namen verbleiben nun in der Pipeline. Wir leiten diese durch ein Where?
, wodurch sichergestellt wird, dass sie-in
die genehmigte Liste der Schauspieler sind. Schließlich werdenselect
nur die-u
Nique-Einträge verwendet, bei denen für Duplikate der erste gefunden wird (dh der am niedrigsten gewichtete), und der Rest wird verworfen. Wir speichern das resultierende Array von Namen in$a
.Jetzt haben wir eine sortierte aufsteigende Liste von Schauspielern. Da die Herausforderung einen Abstieg erfordert, führen wir eine In-Place-Umkehroperation durch,
$a
indem wir von indexieren$a.count
unten nach0
.Beispiel
Bearbeiten - Sie müssen nicht [array] :: Reverse () verwenden, wenn die Indizierung ausgeführt werden soll
quelle
sort -Des
die Array-Umkehrung verwenden? Zugegeben, dies könnte in späteren Versionen von PowerShellselect -u
würde die greifen und halten höchste -wertigen Ordnung, eher als die niedrigste, so dass für mein Beispiel der Positionen von Daniel Craig und Roger Moore tauschen würden. Meine Versuche, das zu beheben, führten zu längerem Code als die Array-Umkehr.Python
309286 Bytesquelle
print
)
]
JavaScript (ES6), 232 Byte
Erläuterung
quelle