(Tenía la intención de publicar esto mientras 1542: El conflicto de programación todavía era el xkcd actual, pero tuve un conflicto de programación).
Entrada
La entrada será una lista de 3n
elementos, que representan n
eventos. El primer elemento en cada grupo de 3 será el nombre de un evento; el segundo y el tercero, la hora de inicio y finalización respectivamente. Por ejemplo:
foo 12 34 bar 56 78
representa un evento foo
que comienza en el "tiempo 12" (los tiempos están representados simplemente por números enteros; puede pensar en ellos como minutos después de la medianoche) y termina en 34, y un segundo evento bar
que comienza en 56 y termina en 78.
Los nombres de los eventos siempre consistirán solo en caracteres alfanuméricos, y los tiempos siempre serán enteros ≥ 0 y <1440. La hora de finalización siempre será al menos 1 mayor que la hora de inicio. No se garantiza que se clasifiquen de ninguna manera.
Si lo desea, puede tomar esto como una sola cadena separada por espacios; de lo contrario, debe tomarse como una matriz, lista, vector o el equivalente de su idioma.
Salida
La salida debe ser una lista de nombres de eventos separados por espacios. Las reglas para los nombres de eventos que se deben generar son las siguientes:
Ninguno de los eventos que genera puede entrar en conflicto entre sí. Por ejemplo, con la entrada
a 0 10 b 5 15
, es posible que no genere ambasa
yb
porque los tiempos entran en conflicto (es decir, se superponen parcialmente). Si un evento termina exactamente como comienza otro, puede incluir ambos.No puede generar el evento llamado
NSCC
("Competencia de conflicto de programación nacional"), del cual siempre habrá exactamente uno en la entrada. También debe generar al menos un evento que entre en conflicto (se superpone parcialmente) conNSCC
(y siempre habrá al menos uno de esos también).Debe generar tantos eventos como sea posible mientras sigue las dos reglas anteriores. (Esto es para que parezca lo más ocupado posible, para que perder el NSCC parezca más creíble).
Esto también se puede generar como una sola cadena separada por espacios o como una matriz, lista, vector, etc.
Puede haber más de una salida posible.
Casos de prueba
Tenga en cuenta que las salidas enumeradas son solo ejemplos. Su código puede generar algo diferente, siempre y cuando siga las tres reglas anteriores (en particular, esto significa que debe haber la misma cantidad de eventos que el ejemplo).
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
Siéntase libre de agregar más casos de prueba en una edición si hay casos límite que me perdí.
Reglas
Su código debe completarse dentro de los 30 segundos para todos los casos de prueba proporcionados (esto es más un control de cordura, ya que probablemente debería completarse mucho más rápido para todos los casos de prueba combinados) en una máquina personal razonable.
Este es el código de golf , por lo que gana el código más corto en bytes.
underwaterBasketWeavingConvention 50 800 nscc 550
lugar de su ejemplo?Respuestas:
Pyth, 45 bytes
Este fue bastante duro para el golf. Encontramos bastantes soluciones de 45 bytes, esta es probablemente la más exótica, ya que utiliza
A
(asignación de pares) y.g
(agrupar por).Pruébelo en línea: demostración o prueba de arnés
Explicación
fuente
SWI-Prolog,
537524516502447436 bytesBreve explicación de lo que hace cada predicado:
z(A,B)
comprueba que un evento A no entre en conflicto con ningún evento de una lista de eventos Bu(A,B)
comprueba que cada evento de una lista A no entre en conflicto con ningún evento de una lista B (se usa para verificar que no haya conflictos en la lista A llamandou(A,A)
)y(A,B,C)
divide una Lista en una lista de tripletes (para transformar entradas en una lista de eventos)d(A)
imprime los nombres de eventos en una lista Al(A,R)
evalúa la lista más larga de eventos R contenida en la lista de listas Av(A,NSCC,C,R)
devuelve una lista R que contiene todas las listas de eventos en A que no tienen conflicto interno y que entran en conflicto con el evento NSCCs(A,B)
verdadero si B es un subconjunto de Ax(A)
predicado principal, A es la entrada.Casos de prueba : ejecutar
test.
en el intérprete después de cargar el código anterior con lo siguiente agregado después:Esto me llevó mucho más tiempo del que pensaba. Esto probablemente se puede jugar mucho más golf. Además, probablemente podría usar las diversas bibliotecas de programación de restricciones que existen para obtener soluciones más cortas.
Editar: Gracias a @Oliphaunt por la idea de usar en
A:B:C
lugar de[A,B,C]
trillizos. Ahorra 14 bytes.Edit2: Gracias nuevamente a @Oliphaunt por señalar que el predicado `` t / 3` 'fue inútil. Ahorra 55 bytes
Edit3: Ganó 11 bytes usando la gramática de cláusula definitiva en predicados
y
yd
.fuente
A/B/C
en lugar de[A,B,C]
los trillizos, el ahorro de 10 bytes; 2. ¿Se puede usar en\+
lugar denot
? 3. ¿Podría explicar por qué necesita el corte finalx(A)
?:
en lugar de/
a beneficio de las antiguas de asociatividad por la derecha, es decir, por lo que podría escribirA:_
como forma abreviada deA:_:_
(peroA+B/C
funciona igual de bien: a continuación, puede utilizarA+_
). Por cierto, también en su original podría haber usado en[A|_]
lugar de[A,_,_]
. Tenga en cuenta finalmente que mi versión de SWI-Prolog no teníanth0/4
, así que usé en suselect/3
lugar.t(S,T)
pero luego lo olvidé. Ahora probado: puede guardar 55 bytes más al soltarlo por completo y llamar directamentes(E,L)
desdesetof/3
.JavaScript ( ES6 ), 228
Segundo intento, espero que este funcione.
Mi objetivo es la secuencia más larga de eventos que tiene un conflicto de tiempo, pero no hay conflicto de tiempo cuando se elimina el evento NSCC. Esta secuencia modificada con NSCC eliminado es la salida solicitada.
Utilizo Breadth First Search para examinar una cola de soluciones candidatas, comenzando por la más larga (la primera es la lista inicial). A partir de una solución candidata de n eventos, construyo y pongo en cola n más soluciones candidatas, eliminando uno de los eventos y manteniendo los otros.
Una solución candidata es válida si hay un conflicto de tiempo 'tal cual', pero cuando el evento NSCC se filtra no hay conflicto. Uso una subfunción K para verificar conflictos.
Probablemente podría jugar al golf un poco más ...
Pruebe a ejecutar el fragmento a continuación (siendo EcmaScript 6, solo FireFox)
fuente
Java, 828 bytes
Probablemente haya una implementación de Java más concisa, pero aquí está mi puñalada:
fuente
else return
.Python, 373 caracteres
Crea todas las combinaciones posibles y comprueba cada una.
Prueba
Entrada:
["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]
Salida:
fuente