Sortieren Sie diese James Bond-Bewertungen

31

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
MKII
quelle
3
Willkommen bei PPCG und schöne Herausforderung! Beachten Sie, dass Sean Connery zweimal auf Ihrer Liste erscheint.
Denham Coote
@DenhamCoote Das und der Fehler in der Beispielausgabe wurden behoben.
MKII
2
Können wir davon ausgehen, dass alle möglichen Schauspieler durch zwei Wörter identifiziert werden (Vorname und Nachname)?
Luis Mendo
17
Emma Watson war großartig als James Bond.
Alex A.
3
hmm meine echo Sean Connery
antwort

Antworten:

2

Pyth, 136 132 Bytes

_{mtcd\ f}stcTdc"BarryNelson BobSimmons SeanConnery RogerMoore DavidNiven GeorgeLazenby TimothyDalton PierceBrosnan DanielCraig"dS.z

Probieren Sie es hier aus!

Erläuterung

_ {mtcd \ f} stcTdc "BarryNelson BobSimmons ..." dS.z # .z = Liste aller Eingabezeilen
                                             Sz # Eingabe aufsteigend sortieren
        f # filtert sortierte Zeilen, wobei T die aktuelle Zeile ist
            cTd # Eine Linie in Leerzeichen teilen
          st # Nummer löschen und Vor- und Nachnamen eingeben
               c "BarryNelson BobSimmons ..." d # Aufteilen der Liste der Bond-Akteure auf Leerzeichen ...
         } # behalte nur die Zeilen, die in der Liste der Darsteller sind
   mtcd \ # entferne die Nummer aus den gefilterten Zeilen
_ {# Entferne Duplikate aus dem Mapping-Ergebnis und kehre das Ergebnis um

Denker
quelle
Kleiner Fehler, die Reihenfolge ist falsch herum (es soll von letzt nach zuerst gehen, während deins zuerst ist, um zu dauern).
MKII
@ MKII Vermutlich habe ich diesen Teil überlesen ... Behoben!
Denker
12

Netzhaut ,201 197 191

\ d +
$ 0 $ * 1
G` ^ 1 + (Barry Nelson | Bob Simmons | Sean Connery | Roger Moore | David Niven | George Lazenby | Timothy Dalton | Pierce Brosnan | Daniel Craig) $
+ `\ b ((1 +) \ D *) ¶ (\ 2. +)
$ 3¶ $ 1
+ s`1 + (\ D +) ¶ (. * \ 1)
$ 2
1+ 

Probieren 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 \DVersion ungetestete ) entfernt wird.

Erläuterung:

Ein Retina-Programm besteht aus mehreren Phasen, daher erkläre ich jede Phase separat.

Bühne 1:

\d+
$0$*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:

G`^1+ (Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$

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:

+`\b((1+)\D*)¶(\2.+)
$3¶$1

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 von 1s und dem Rest der Zeile bis zur neuen Zeile. Wenn die nächste Zeile mehr 1s als s enthält, stimmt der reguläre Ausdruck überein, und wir tauschen die Zeilen aus.

Stufe 4:

+s`1+(\D+)¶(.*\1)
$2

In dieser Phase wird der +Modus erneut verwendet, aber auch s, damit das .Metazeichen auch mit Zeilenumbrüchen übereinstimmt. Auf diese Weise werden doppelte Zeilen entfernt, indem nach dem 1s 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:

1+ 

Wirklich einfach, hier ist alles in Ordnung, außer wir haben ein paar 1s vor unseren Anleihen, also ersetzen wir sie und den Raum danach durch nichts.

FryAmTheEggman
quelle
... Verdammt, diese Sprache beeindruckt mich von Tag zu Tag mehr. Gut gemacht, Martin!
Fund Monica Klage
6

TSQL 426 Bytes (einschließlich Daten + Eingabe)

Golf Lösung:

create table A(Name varchar(99))insert into A values('Barry Nelson'),('Bob Simmons'),('Sean Connery'),('Roger Moore'),('David Niven'),('George Lazenby'),('Timothy Dalton'),('Pierce Brosnan'),('Daniel Craig')declare @I as table (R int, N varchar(99))insert into @I values(3,'Sean Connery'),(2,'Pierce Brosnan'),(1,'Sean Connery')select N from(select N,min(R) R from @I where N in (select N from A) group by N) x order by R desc

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:

create table Actor (Name varchar(99))
insert into Actor values
 ('Barry Nelson')
,('Bob Simmons')
,('Sean Connery')
,('Roger Moore')
,('David Niven')
,('George Lazenby')
,('Timothy Dalton')
,('Pierce Brosnan')
,('Daniel Craig')

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:

declare @Input as table (Rnk int, Name varchar(99))
insert into @Input values
 (1,'Sean Connery')
,(2,'Emma Watson')
,(5,'Timothy Dalton')
,(4,'Roger Moore')
,(3,'Daniel Craig')

select Name
from
(
    select Name, min(Rnk) as R
    from @Input
    where Name in (select Name from Actor)
    group by Name
) x
order by R desc

Beispiel 2:

declare @Input as table (Rnk int, Name varchar(99))
insert into @Input values
 (2,'Timothy Dalton')
,(4,'George Lazenby')
,(5,'George Lazenby')
,(3,'Bob Simmons')

select Name
from
(
    select Name, min(Rnk) as R
    from @Input
    where Name in (select Name from Actor)
    group by Name
) x
order by R desc

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.

Jean
quelle
Funktioniert es mit einer beliebigen Nummer am Zeilenanfang oder nur mit einzelnen Ziffern?
MKII
1
@MKII I verwenden INT Typen , so dass es krank etwas im Bereich akzeptieren -2147483648 bis 2147483647 auch krank es , dass die Anzahl der Zeilen akzeptiert auch =)
jean
Sie brauchen keine Unterauswahl. Sie können nur order by min(R) descmit der inneren Auswahl verwenden und die min(R)aus der Auswahl entfernen . Das sollte 21 Bytes einsparen.
Raznagul
Auch gibt es einige unnötige Räume in der Golfversion.
Raznagul
Wenn Sie charstatt verwenden, varcharwerden weitere 6 Bytes eingespart.
Raznagul
5

Perl, 242 179 217 Bytes

print reverse grep{/^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/&&!$s{$_}++}map{s/\d+ //;$_}sort{($a=~/(\d+)/)[0]<=>($b=~/(\d+)/)[0]}<>;

Schönere formatierte Version mit Kommentaren:

print
     # reverse ranking order
     reverse
     # filter entries...
     grep {
         # only actual bonds
         /^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/
         # only new bonds
         && !$s{$_}++
     } map {s/\d+ //;$_}         # remove leading digits+space
     # sort according to embedded numbers
     sort {($a=~/(\d+)/)[0] <=> ($b=~/(\d+)/)[0]}
     <>;                        # slurp input as list (list context)

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.

David Morris
quelle
Willkommen bei Programming Puzzles und Code Golf. Geniale Antwort, +1. Ich wollte vorschlagen, dass Sie eine Erklärung hinzufügen, aber dann sah ich die Bearbeitung. Vielleicht ist es möglich, die Liste der Schauspieler irgendwie zu komprimieren ...
wizzwizz4
@wizzwizz4 Ich habe ein paar Dinge versucht, um diese Regex kleiner zu machen, aber die Dekodierung scheint immer mehr zu kosten, als Sie sparen - es ist zu spärlich, was es akzeptiert.
David Morris
Leider muss es mit Zahlen funktionieren, nicht nur mit einzelnen Ziffern. Es tut mir leid, aber ich habe in der Frage den falschen Begriff verwendet.
MKII
@ MKII aww, das kostet mich 38 Bytes :(
David Morris
Wenn es ein evalin Perl und ein eingebautes Komprimierungssystem gibt ...
wizzwizz4
4

Python 2, 250 Bytes:

lambda I:zip(*sorted({k:v for v,k in[x.split(' ',1)for x in I.split('\n')]if k in'Barry Nelson,Bob Simmons,Sean Connery,Roger Moore,David Niven,George Lazenby,Timothy Dalton,Pierce Brosnan,Daniel Craig'.split(',')}.items(),key=lambda t:-int(t[1])))[0]

Demo:

>>> L = ["Barry Nelson",
...     "Bob Simmons",
...     "Sean Connery",
...     "Roger Moore",
...     "David Niven",
...     "George Lazenby",
...     "Timothy Dalton",
...     "Pierce Brosnan",
...     "Daniel Craig"]

>>> I="""2 Timothy Dalton
... 4 George Lazenby
... 5 George Lazenby
... 3 Bob Simmons"""
>>> F(I,L)
('George Lazenby', 'Bob Simmons', 'Timothy Dalton')

>>> I = """1 Sean Connery
... 2 Emma Watson
... 5 Timothy Dalton
... 4 Roger Moore
... 3 Daniel Craig"""
>>> 
>>> F(I,L)
('Timothy Dalton', 'Roger Moore', 'Daniel Craig', 'Sean Connery')
Kasramvd
quelle
Ich habe nur das Wörterbuchverständnis verwendet, um die eindeutigen Namen zu erhalten, anstatt das Verständnis festzulegen.
Kasramvd
10
Ich würde dafür bezahlen, Emma Watson als James Bond zu sehen.
DJClayworth
Funktioniert es mit einer beliebigen Nummer am Zeilenanfang oder nur mit einzelnen Ziffern?
MKII
2

PowerShell v3 +, 227 219 Byte

$a=$args-split"`n"|sort|%{$c,$b=-split$_;$b-join' '}|?{$_-in('Barry Nelson,Bob Simmons,Sean Connery,Roger Moore,David Niven,George Lazenby,Timothy Dalton,Pierce Brosnan,Daniel Craig'-split',')}|select -u
$a[$a.count..0]

121 Bytes davon sind nur die Liste der Schauspieler ...

Nimmt Eingaben $argsund -splits es auf Newlines mit `n. Pipe das zu sort, 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 -splitauf 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 -indie genehmigte Liste der Schauspieler sind. Schließlich werden selectnur die -uNique-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, $aindem wir von indexieren$a.count unten nach0 .

Beispiel

PS C:\Tools\Scripts\golfing> .\sort-these-james-bond-ratings.ps1 "1 Sean Connery`n2 Emma Watson`n5 Daniel Craig`n4 Roger Moore`n3 Daniel Craig"
Roger Moore
Daniel Craig
Sean Connery

Bearbeiten - Sie müssen nicht [array] :: Reverse () verwenden, wenn die Indizierung ausgeführt werden soll

AdmBorkBork
quelle
Können Sie nicht nur sort -Desdie Array-Umkehrung verwenden? Zugegeben, dies könnte in späteren Versionen von PowerShell
fehlerhaft sein
@VisualMelon ich hatte , dass in Betracht gezogen, dann aber das select -uwü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.
AdmBorkBork
ach ja, das macht Sinn, ich konnte es nicht ausführen und habe es komplett verpasst - es ist eine Schande, dass es nur für diese Umkehrung so viel Verschwendung gibt ...
VisualMelon
2

Python 309 286 Bytes

import sys
i='Barry Nelson.Bob Simmons.Sean Connery.Roger Moore.David Niven.George Lazenby.Timothy Dalton.Pierce Brosnan.Daniel Craig'.split('.')
print ', '.join(i.pop(i.index(x)) for x in zip(*sorted((x.strip().split(' ',1) for x in sys.stdin),None,lambda x:int(x[0]),1))[1] if x in i)
mtp
quelle
Funktioniert es mit einer beliebigen Nummer am Zeilenanfang oder nur mit einzelnen Ziffern?
MKII
es tat es nicht, es tut es jetzt aber :)
MTP
Sieht so aus, als könnten Sie hier zusätzliche Leerzeichen print)]
entfernen
1

JavaScript (ES6), 232 Byte

s=>s.split`
`.sort((a,b)=>(p=parseInt)(a)<p(b)).map(l=>l.replace(/\d+ /,"")).filter(l=>!p[l]&/^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/.test(p[l]=l))

Erläuterung

var solution =

s=>
  s.split`
`
  .sort((a,b)=>                 // sort the list by the number
    (p=parseInt)(a)<p(b)        // parseInt reads only the first number in a string
                                // the variable p also holds names that appeared in the
                                //     list previously
  )
  .map(l=>l.replace(/\d+ /,"")) // remove the number at the beginning of each line
  .filter(l=>
    !p[l]&                      // remove duplicates
    
    // Bond actor regex
    /^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/
    
    .test(p[l]=l)               // test for bondness and add the line to p
  )
<textarea id="input" rows="6" cols="40">1 Sean Connery
2 Emma Watson
5 Timothy Dalton
4 Roger Moore
3 Daniel Craig</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>

user81655
quelle