(Je voulais publier ceci pendant 1542: le conflit de planification était toujours le xkcd actuel, mais j'avais un conflit de planification.)
Contribution
L'entrée sera une liste d' 3n
éléments, qui représentent des n
événements. Le premier élément de chaque groupe de 3 sera le nom d'un événement; les deuxième et troisième, respectivement l'heure de début et l'heure de fin. Par exemple:
foo 12 34 bar 56 78
représente un événement foo
qui commence à «l'heure 12» (les heures sont simplement représentées par des nombres entiers; vous pouvez les considérer comme des minutes après minuit) et se termine à 34, et un deuxième événement bar
qui commence à 56 et se termine à 78.
Les noms des événements seront toujours composés uniquement de caractères alphanumériques, et les heures seront toujours des entiers ≥ 0 et <1440. L'heure de fin sera toujours au moins 1 supérieure à l'heure de début. Ils ne sont en aucun cas garantis pour être triés.
Si vous le souhaitez, vous pouvez prendre cela comme une chaîne unique séparée par des espaces; sinon, il doit être pris comme un tableau, une liste, un vecteur ou l'équivalent de votre langue.
Sortie
La sortie doit être une liste de noms d'événements séparés par des espaces. Les règles pour lesquelles les noms d'événements à afficher sont les suivantes:
Aucun des événements que vous générez ne peut entrer en conflit les uns avec les autres. Par exemple, avec l'entrée
a 0 10 b 5 15
, vous ne pouvez pas sortir les deuxa
etb
parce que les heures sont en conflit (c'est-à-dire qu'elles se chevauchent partiellement). Si un événement se termine exactement au début d'un autre, vous pouvez inclure les deux.Vous ne pouvez pas sortir l'événement appelé
NSCC
("National Scheduling Conflict Competition"), dont il y aura toujours exactement un dans l'entrée. Vous devez également générer au moins un événement qui entre en conflit (se chevauche partiellement)NSCC
(et il y en aura toujours au moins un également).Vous devez générer autant d'événements que possible tout en suivant les deux règles ci-dessus. (C'est pour que vous ayez l'air aussi occupé que possible, afin que manquer le NSCC semble plus crédible.)
Cela peut également être affiché sous la forme d'une chaîne séparée par des espaces ou d'un tableau, d'une liste, d'un vecteur, etc.
Il peut y avoir plusieurs sorties possibles.
Cas de test
Notez que les sorties répertoriées ne sont que des exemples. Votre code peut produire quelque chose de différent, tant qu'il suit toujours les trois règles ci-dessus (notamment, cela signifie qu'il doit y avoir le même nombre d'événements que l'exemple).
Entrée: UnderwaterBasketWeavingConvention 50 800 NSCC 500 550
Sortie:UnderwaterBasketWeavingConvention
Entrée: SconeEating 0 50 RegexSubbing 45 110 CodeGolfing 95 105 NSCC 100 200
Sortie:SconeEating CodeGolfing
Entrée: VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775
Sortie:NerdSniping DoorknobTurning
Entrée: NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500
Sortie:C D E
Entrée: A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060
Sortie:A D E F G
Entrée: A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16
Sortie:E
N'hésitez pas à ajouter plus de cas de test dans une modification s'il y a des cas de bord que j'ai manqués.
Règles
Votre code doit se terminer dans les 30 secondes pour tous les cas de test fournis (il s'agit davantage d'un contrôle d'intégrité, car il devrait probablement se terminer beaucoup plus rapidement pour tous les cas de test combinés) sur une machine personnelle raisonnable.
Il s'agit de code-golf , donc le code le plus court en octets l'emporte.
underwaterBasketWeavingConvention 50 800 nscc 550
au lieu de votre exemple?Réponses:
Pyth, 45 octets
Celui-ci était assez difficile à jouer au golf. J'ai trouvé pas mal de solutions de 45 octets, celle-ci est probablement la plus exotique, car elle utilise
A
(pair-assign) et.g
(group-by).Essayez-le en ligne: démonstration ou test de harnais
Explication
la source
SWI-Prolog,
537524516502447436 octetsBrève explication de ce que fait chaque prédicat:
z(A,B)
vérifie qu'un événement A n'est pas en conflit avec un événement d'une liste d'événements Bu(A,B)
vérifie que chaque événement d'une liste A n'est pas en conflit avec un événement d'une liste B (utilisé pour vérifier qu'il n'y a pas de conflits dans la liste A en appelantu(A,A)
)y(A,B,C)
divise une liste en une liste de triplets (pour transformer les entrées en une liste d'événements)d(A)
imprime les noms des événements dans une liste Al(A,R)
évalue la plus longue liste d'événements R contenue dans la liste des listes Av(A,NSCC,C,R)
renvoie une liste R contenant toutes les listes d'événements dans A qui n'ont pas de conflit interne et qui sont en conflit avec l'événement NSCCs(A,B)
vrai si B est un sous-ensemble de Ax(A)
prédicat principal, A est l'entrée.Cas de test : exécutez
test.
dans l'interpréteur après avoir chargé le code ci-dessus avec ce qui suit ajouté après:Cela m'a pris beaucoup plus de temps que je ne le pensais. Cela peut probablement être joué beaucoup plus. Vous pourriez aussi probablement utiliser les diverses bibliothèques de programmation de contraintes qui existent pour obtenir des solutions plus courtes.
Edit: Merci à @Oliphaunt pour l'idée d'utiliser à la
A:B:C
place des[A,B,C]
triplés. Enregistre 14 octets.Edit2: Merci encore à @Oliphaunt d'avoir souligné que le prédicat `` t / 3` était inutile. Enregistre 55 octets
Edit3: 11 octets gagnés en utilisant la grammaire de la clause définitive sur les prédicats
y
etd
.la source
A/B/C
au lieu de[A,B,C]
pour les triplets, en économisant 10 octets; 2. Pouvez-vous utiliser à la\+
place denot
? 3. Pourriez-vous expliquer pourquoi vous avez besoin de la dernière interventionx(A)
?:
au lieu de/
bénéficier de l'associativité de droite de l'ancien, c'est-à-dire pour que je puisse écrireA:_
en raccourciA:_:_
(maisA+B/C
ça marche aussi bien: vous pouvez alors l'utiliserA+_
). Soit dit en passant, également dans votre original, vous auriez pu utiliser à la[A|_]
place de[A,_,_]
. Notez enfin que ma version de SWI-Prolog n'en avait pasnth0/4
, donc j'ai utiliséselect/3
place.t(S,T)
mais j'ai oublié. Maintenant testé: vous pouvez économiser 55 octets supplémentaires en le supprimant entièrement et en appelant directements(E,L)
depuissetof/3
.JavaScript ( ES6 ), 228
Deuxième essai, j'espère que celui-ci fonctionne.
Mon objectif est la séquence d'événements la plus longue qui a un conflit de synchronisation, mais pas de conflit de synchronisation lorsque l'événement NSCC est supprimé. Cette séquence modifiée avec NSCC supprimé est la sortie demandée.
J'utilise une recherche en largeur examinant une file d'attente de solutions candidates, en commençant par la plus longue (la première est la liste initiale). A partir d' une solution candidate de n événements que je construis et enqueue n plus des solutions candidats, la suppression d' un des événements et garder les autres.
Une solution candidate est valide s'il y a un conflit de synchronisation «tel quel», mais lorsque l'événement NSCC est filtré, il n'y a pas de conflit. J'utilise une sous-fonction K pour vérifier les conflits.
On pourrait probablement jouer au golf un peu plus ...
Testez l'exécution de l'extrait ci-dessous (en EcmaScript 6, FireFox uniquement)
la source
Java, 828 octets
Il existe probablement une implémentation Java plus concise, mais voici mon coup de poignard:
la source
else return
.Python, 373 caractères
Crée toutes les combinaisons possibles et vérifie chacune.
Tester
Contribution:
["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]
Sortie:
la source