(Ich wollte dies während 1542 posten : Scheduling Conflict war immer noch das aktuelle xkcd, aber ich hatte einen Scheduling-Konflikt.)
Eingang
Die Eingabe ist eine Liste von 3n
Elementen, die n
Ereignisse darstellen. Das erste Element in jeder Dreiergruppe ist der Name eines Ereignisses. die zweite und dritte, die Start- und Endzeit. Beispielsweise:
foo 12 34 bar 56 78
stellt ein Ereignis dar foo
, das um "Zeit 12" beginnt (Zeiten werden einfach durch ganze Zahlen dargestellt; Sie können sich diese als Minuten nach Mitternacht vorstellen) und endet um 34. Ein zweites Ereignis bar
beginnt um 56 und endet um 78.
Die Namen von Ereignissen bestehen immer nur aus alphanumerischen Zeichen und die Zeiten sind immer ganze Zahlen ≥ 0 und <1440. Die Endzeit ist immer mindestens 1 größer als die Startzeit. Es ist nicht garantiert, dass sie in irgendeiner Weise sortiert werden.
Wenn Sie möchten, können Sie dies als einzelne, durch Leerzeichen getrennte Zeichenfolge verwenden. Andernfalls sollte es als Array, Liste, Vektor oder das Äquivalent Ihrer Sprache verwendet werden.
Ausgabe
Die Ausgabe sollte eine durch Leerzeichen getrennte Liste von Ereignisnamen sein. Die Regeln für die Ausgabe von Ereignisnamen lauten wie folgt:
Keines der von Ihnen ausgegebenen Ereignisse kann zu Konflikten führen. Zum Beispiel mit dem Eingang
a 0 10 b 5 15
, können Sie nicht ausgegeben beidea
undb
weil die Zeiten Konflikt (die teilweise Überlappung). Wenn ein Ereignis genau zu Beginn eines anderen Ereignisses endet, können Sie beide einschließen.Sie dürfen das genannte Ereignis
NSCC
("National Scheduling Conflict Competition") nicht ausgeben , von dem es immer genau eines in der Eingabe gibt. Sie müssen auch mindestens ein Ereignis ausgeben, mit dem Konflikte (teilweise Überschneidungen) vorliegenNSCC
(und es wird immer mindestens eines davon geben).Sie müssen so viele Ereignisse wie möglich ausgeben, während Sie die beiden oben genannten Regeln befolgen. (Dies ist so, dass Sie so beschäftigt wie möglich aussehen, so dass das Fehlen des NSCC glaubwürdiger erscheint.)
Dies kann auch als einzelne durch Leerzeichen getrennte Zeichenfolge oder als Array, Liste, Vektor usw. ausgegeben werden.
Es kann mehr als eine Ausgabe geben.
Testfälle
Beachten Sie, dass die aufgeführten Ausgaben nur Beispiele sind. Ihr Code gibt möglicherweise etwas anderes aus, solange die drei oben genannten Regeln eingehalten werden (dies bedeutet insbesondere, dass dieselbe Anzahl von Ereignissen wie im Beispiel vorhanden sein muss).
In: UnderwaterBasketWeavingConvention 50 800 NSCC 500 550
Out:UnderwaterBasketWeavingConvention
In: SconeEating 0 50 RegexSubbing 45 110 CodeGolfing 95 105 NSCC 100 200
Out:SconeEating CodeGolfing
In: VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775
Out:NerdSniping DoorknobTurning
In: NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500
Out:C D E
In: A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060
Out:A D E F G
In: A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16
Out:E
Fühlen Sie sich frei, weitere Testfälle in einer Bearbeitung hinzuzufügen, wenn es Randfälle gibt, die ich verpasst habe.
Regeln
Ihr Code muss für alle bereitgestellten Testfälle auf einem vernünftigen PC innerhalb von 30 Sekunden vollständig sein (dies ist eher eine Sicherheitsüberprüfung, da dies für alle Testfälle zusammen wahrscheinlich viel schneller sein sollte).
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
underwaterBasketWeavingConvention 50 800 nscc 550
Sie zum Beispiel anstelle Ihres Beispiels?Antworten:
Pyth, 45 Bytes
Dieser war ziemlich schwer zu golfen. Es wurden einige 45-Byte-Lösungen gefunden. Diese ist wahrscheinlich die exotischste, da sie
A
(Pair-Assign) und.g
(Group-By) verwendet.Probieren Sie es online aus: Vorführ- oder Testgeschirr
Erläuterung
quelle
SWI-Prolog,
537524516502447436 BytesKurze Erklärung, was jedes Prädikat tut:
z(A,B)
prüft, ob ein Ereignis A mit keinem Ereignis einer Liste von Ereignissen B in Konflikt stehtu(A,B)
überprüft , dass jedes Ereignis einer Liste A nicht Konflikt mit jedem Fall einer Liste B (verwendet um zu überprüfen , dass es keine Konflikte in der Liste A ist durch den Aufrufu(A,A)
)y(A,B,C)
Teilt eine Liste in eine Liste von Drillingen (um Eingaben in eine Liste von Ereignissen umzuwandeln)d(A)
druckt die Namen von Ereignissen in einer Liste A ausl(A,R)
wertet die längste Liste von Ereignissen R aus, die in der Liste von Listen A enthalten istv(A,NSCC,C,R)
gibt eine Liste R zurück, die alle Ereignisse in A enthält, die keinen internen Konflikt haben und mit dem Ereignis NSCC in Konflikt stehens(A,B)
true, wenn B eine Teilmenge von A istx(A)
Hauptprädikat, A ist die Eingabe.Testfälle : führen Sie
test.
im Interpreter aus, nachdem Sie den obigen Code geladen haben, und fügen Sie anschließend Folgendes hinzu:Das hat viel mehr Zeit gekostet, als ich erwartet hatte. Damit kann wohl deutlich mehr golfen werden. Sie könnten wahrscheinlich auch die verschiedenen vorhandenen Constraint-Programmierbibliotheken verwenden, um kürzere Lösungen zu erhalten.
Edit: Danke an @Oliphaunt für die Idee,
A:B:C
anstelle von[A,B,C]
Drillingen zu verwenden. Spart 14 Bytes.Edit2: Nochmals vielen Dank an @Oliphaunt für den Hinweis, dass das Prädikat `` t / 3` nutzlos war. Spart 55 Bytes
Edit3: Erhielt 11 Bytes unter Verwendung der Definitivsatz-Grammatik für Prädikate
y
undd
.quelle
A/B/C
anstelle von[A,B,C]
für die Drillinge verwenden und 10 Bytes einsparen; 2. Können Sie\+
anstelle von verwendennot
? 3. Kannst du erklären, warum du den finalen Einschnitt brauchstx(A)
?:
anstatt von/
der richtigen Assoziativität des ersteren zu profitieren, dh ich konnteA:_
als Kurzform für schreibenA:_:_
(A+B/C
funktioniert aber genauso gut: Sie können dann verwendenA+_
). By the way, auch in Ihrer ursprünglichen Sie verwendet haben , könnten[A|_]
statt[A,_,_]
. Beachten Sie, dass meine Version von SWI-Prolog keine hattenth0/4
, also habe ichselect/3
stattdessen verwendet.t(S,T)
, dann aber vergessen. Jetzt getestet: Sie 55 weitere Bytes , indem sie es ganz fallen lassen und direkt aufrufen speichern kanns(E,L)
aussetof/3
.JavaScript ( ES6 ), 228
Zweiter Versuch, ich hoffe dieser funktioniert.
Mein Ziel ist die längste Sequenz von Ereignissen mit einem Zeitkonflikt, aber ohne Zeitkonflikt, wenn das Ereignis NSCC entfernt wird. Diese modifizierte Sequenz mit entferntem NSCC ist die angeforderte Ausgabe.
Ich benutze eine Breitensuche, um eine Reihe von Lösungskandidaten zu untersuchen, beginnend mit der längsten (die erste ist die Anfangsliste). Aus einer Kandidatenlösung von n Ereignissen baue ich n Kandidatenlösungen auf und reihe sie ein, entferne eines der Ereignisse und behalte die anderen.
Eine Kandidatenlösung ist gültig, wenn ein Zeitkonflikt "wie er ist" vorliegt, aber wenn das NSCC-Ereignis herausgefiltert wird, liegt kein Konflikt vor. Ich benutze eine Unterfunktion K, um nach Konflikten zu suchen.
Könnte wohl etwas mehr golfen werden ...
Testen Sie das folgende Snippet (nur EcmaScript 6, FireFox)
quelle
Java, 828 Bytes
Es gibt wahrscheinlich eine prägnantere Java-Implementierung, aber hier ist mein Stab:
quelle
else return
.Python, 373 Zeichen
Erstellt alle möglichen Kombinationen und überprüft jede.
Prüfung
Eingang:
["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]
Ausgabe:
quelle